diff --git a/analysis/PWGC2F/femtoscopy/hal/CMakeLists.txt b/analysis/PWGC2F/femtoscopy/hal/CMakeLists.txt
index abfabf4c395fced91229672b6979b381e75ee8a0..570c11d80601985d2d08783e3cfe1b272b6e4c52 100644
--- a/analysis/PWGC2F/femtoscopy/hal/CMakeLists.txt
+++ b/analysis/PWGC2F/femtoscopy/hal/CMakeLists.txt
@@ -33,6 +33,14 @@ set(HAL_CBM_FORMAT
 	${HAL_CBM}/format/anatree/mc
 	${HAL_CBM}/format/anatree/femto
 	${HAL_CBM}/format/unigen
+    ${HAL_CBM}/format/v0
+)
+set(HAL_CBM_HELPERS
+	${HAL_CBM}/helpers
+	${HAL_CBM}/helpers/anatree
+	${HAL_CBM}/helpers/fair
+	${HAL_CBM}/helpers/faircbm
+	${HAL_CBM}/helpers/hal
 )
 
 set(HAL_CBM_CUTS
@@ -43,4 +51,4 @@ set(HAL_CBM_CUTS
 add_subdirectory(format)
 add_subdirectory(cuts)
 add_subdirectory(helpers)
-add_subdirectory(qa)
+#add_subdirectory(qa)
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/CMakeLists.txt b/analysis/PWGC2F/femtoscopy/hal/format/CMakeLists.txt
index 28e89c3e7ab19207af7e9f33103f9a4cc5067200..1ea0995fc71210144d672f3f880688e4181bcd76 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/CMakeLists.txt
+++ b/analysis/PWGC2F/femtoscopy/hal/format/CMakeLists.txt
@@ -27,6 +27,7 @@ set(SRCS
 
 
 HalCbmFormatTypes.cxx
+HalCbmReader.cxx
 
 combined/HalCbmFullEvent.cxx
 combined/HalCbmHbtFullEvent.cxx
@@ -48,6 +49,11 @@ anatree/reco/HalCbmTrackInterface.cxx
 anatree/femto/HalCbmHbtTrack.cxx
 anatree/femto/HalCbmHbtEvent.cxx
 
+v0/HalCbmV0Builder.cxx
+v0/HalCbmV0TempTrack.cxx
+v0/HalCbmV0Track.cxx
+v0/HalCbmV0TrackTrigger.cxx
+
 )
 
 Set(HEADERS )
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/HalCbmFormatLinkDef.h b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmFormatLinkDef.h
index 012a9623b96c32780c29d9e2b15a88047584c195..9bce7a24baf05f1d0a505cf910bcf255256728c1 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/HalCbmFormatLinkDef.h
+++ b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmFormatLinkDef.h
@@ -27,3 +27,11 @@
 #pragma link C++ class HalCbmEventInterface + ;
 #pragma link C++ class HalCbmTrack + ;
 #pragma link C++ class HalCbmTrackInterface + ;
+
+
+#pragma link C++ class HalCbmReader + ;
+#pragma link C++ class HalCbmV0TrackTrigger + ;
+#pragma link C++ class HalCbmV0Track + ;
+#pragma link C++ class HalCbmV0TempTrack + ;
+#pragma link C++ class HalCbmV0Track + ;
+#pragma link C++ class HalCbmV0Builder + ;
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEvent.cxx b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEvent.cxx
index bb86515bcc80ba91d9518d065c2a81e58a30a439..dd9b7bc182a11ac3d1401f59ef64d54a1cada928 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEvent.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEvent.cxx
@@ -60,10 +60,10 @@ void HalCbmMCEvent::ShallowCopyTracks(Hal::Event* event)
 
 void HalCbmMCEvent::UpdateAnalysisTree(Hal::EventInterface* source)
 {
-  HalCbmMCEventInterface* s         = static_cast<HalCbmMCEventInterface*>(source);
-  CbmAnaTreeMcSourceContainer* data = (CbmAnaTreeMcSourceContainer*) s->GetRawEventPointer();
-  AnaTreeMcIds conf                 = data->GetFieldIds();
-  Bool_t UseFreez                   = kTRUE;
+  HalCbmMCEventInterface* s   = static_cast<HalCbmMCEventInterface*>(source);
+  CbmAnaTreeMcContainer* data = (CbmAnaTreeMcContainer*) s->GetRawEventPointer();
+  AnaTreeMcIds conf           = data->GetFieldIds();
+  Bool_t UseFreez             = kTRUE;
   if (conf.freezX == AnalysisTree::UndefValueShort) {
     UseFreez = kFALSE;
   }
@@ -89,7 +89,7 @@ void HalCbmMCEvent::UpdateAnalysisTree(Hal::EventInterface* source)
       Double_t y = particle.GetField<float>(conf.freezY);
       Double_t z = particle.GetField<float>(conf.freezZ);
       Double_t t = particle.GetField<float>(conf.freezT);
-      track->SetFreezoutPosition(x, y, z, t);
+      track->SetFreezeoutPosition(x, y, z, t);
     }
 
     if (mother_id == -1) {
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.cxx b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.cxx
index 2b0242885dd46d941ba9d7f7c37eec623ee91195..3e200491e0c5747e0c4b90e8a0743a31312ba9d1 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.cxx
@@ -20,7 +20,7 @@ void HalCbmMCEventInterface::Register(Bool_t write)
   Hal::DataManager* manager = Hal::DataManager::Instance();
   switch (fFormatType) {
     case HalCbm::DataFormat::kAnalysisTree: {
-      manager->Register("CbmAnaTreeMcSourceContainer.", "CbmAnaTreeMcSourceContainer.", fDataContainer, write);
+      manager->Register(HalCbm::GetContainerName("mc"), "CbmAnaTreeMcSourceContainer.", fDataContainer, write);
     } break;
     case HalCbm::DataFormat::kDST: {
       manager->Register("CbmMCTrack", "Tracks", fCbmMCtracks, write);
@@ -81,7 +81,7 @@ HalCbmMCEventInterface::~HalCbmMCEventInterface() {}
 void HalCbmMCEventInterface::ConnectToTreeInternal(eMode /*mode*/)
 {
   Hal::DataManager* manager = Hal::DataManager::Instance();
-  fDataContainer            = (CbmAnaTreeMcSourceContainer*) manager->GetObject("CbmAnaTreeMcSourceContainer.");
+  fDataContainer            = (CbmAnaTreeMcContainer*) manager->GetObject(HalCbm::GetContainerName("mc"));
   if (fDataContainer) {
     fFormatType = HalCbm::DataFormat::kAnalysisTree;
   }
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.h b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.h
index 04ecbd8512ef00aafde24d59d4d19c0a0c1d28c1..1ac520a3466d7a6553b60bb4f791ecb8a2426be4 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.h
+++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/mc/HalCbmMCEventInterface.h
@@ -14,7 +14,7 @@
 
 class TClonesArray;
 class FairMCEventHeader;
-class CbmAnaTreeMcSourceContainer;
+class CbmAnaTreeMcContainer;
 class HalCbmFullEvent;
 
 class HalCbmMCEventInterface : public Hal::EventInterface {
@@ -22,15 +22,15 @@ class HalCbmMCEventInterface : public Hal::EventInterface {
   friend class HalCbmFullEvent;
 
  protected:
-  HalCbm::DataFormat fFormatType              = {HalCbm::DataFormat::kUnknown};
-  CbmAnaTreeMcSourceContainer* fDataContainer = {nullptr};
-  FairMCEventHeader* fEventHeader             = {nullptr};
-  TClonesArray* fCbmMCtracks                  = {nullptr};
-  TClonesArray* fStsMatches                   = {nullptr};
-  TClonesArray* fTofMatches                   = {nullptr};
-  TClonesArray* fTrdMatches                   = {nullptr};
-  TClonesArray* fRichMatches                  = {nullptr};
-  TClonesArray* fMuchMatches                  = {nullptr};
+  HalCbm::DataFormat fFormatType        = {HalCbm::DataFormat::kUnknown};
+  CbmAnaTreeMcContainer* fDataContainer = {nullptr};
+  FairMCEventHeader* fEventHeader       = {nullptr};
+  TClonesArray* fCbmMCtracks            = {nullptr};
+  TClonesArray* fStsMatches             = {nullptr};
+  TClonesArray* fTofMatches             = {nullptr};
+  TClonesArray* fTrdMatches             = {nullptr};
+  TClonesArray* fRichMatches            = {nullptr};
+  TClonesArray* fMuchMatches            = {nullptr};
   virtual void ConnectToTreeInternal(eMode mode);
 
   void Register(Bool_t write);
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.cxx b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.cxx
index bc0cd90608521721bd3ba06b47a5f668e8e60528..51efb74c4348ddfdf113810925b2c2a33af2016c 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.cxx
@@ -1,36 +1,52 @@
 /* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw
     SPDX-License-Identifier: GPL-3.0-only
     Authors: Daniel Wielanek [committer] */
+
 #include "HalCbmEvent.h"
 
 #include "CbmAnaTreeContainer.h"
 #include "CbmGlobalTrack.h"
+#include "CbmHit.h"
+#include "CbmStsTrack.h"
 #include "CbmTofHit.h"
+#include "CbmTrackParam.h"
+#include "HalCbmDetectorID.h"
 #include "HalCbmEventInterface.h"
-#include "HalCbmTrack.h"
+#include "HalCbmV0TempTrack.h"
+
+#include <FairTrackParam.h>
 
+#include <TClonesArray.h>
 #include <TLorentzVector.h>
 #include <TMath.h>
+#include <TObjArray.h>
 
 #include <AnalysisTree/Constants.hpp>
+#include <AnalysisTree/Detector.hpp>
+#include <AnalysisTree/Hit.hpp>
 #include <AnalysisTree/Matching.hpp>
+#include <AnalysisTree/Track.hpp>
 
 #include <Hal/DataFormat.h>
-#include <Hal/Event.h>
-#include <Hal/ExpEvent.h>
+#include <Hal/DetectorTrack.h>
+#include <Hal/ExpTrack.h>
+#include <Hal/ToFTrack.h>
+#include <Hal/Track.h>
 
-HalCbmEvent::HalCbmEvent() : Hal::ExpEvent("HalCbmTrack") {}
+HalCbmEvent::HalCbmEvent() : Hal::ExpEvent("HalCbmTrack", "HalCbmV0Track") {}
 
 HalCbmEvent::HalCbmEvent(const HalCbmEvent& other) : Hal::ExpEvent(other) {}
 
 void HalCbmEvent::Update(Hal::EventInterface* interface)
 {
-  fTracks->Clear();
+  Clear();
+  fVertexTracks                = 0;
   HalCbmEventInterface* source = (HalCbmEventInterface*) interface;
 
   switch (source->fFormatType) {
     case HalCbm::DataFormat::kAnalysisTree: {
       UpdateAnaTree(source);
+      UpdateV0(source);
     } break;
     case HalCbm::DataFormat::kDST: {
       UpdateDST(source);
@@ -41,6 +57,63 @@ void HalCbmEvent::Update(Hal::EventInterface* interface)
 
 HalCbmEvent::HalCbmEvent(TString classname) : Hal::ExpEvent(classname) {}
 
+void HalCbmEvent::UpdateV0(HalCbmEventInterface* ei)
+{
+  if (!ei->fTempV0) return;
+  auto clones = ei->fTempV0;
+  int nv      = clones->GetEntriesFast();
+  fTotalTracksNo += nv;
+  fTracks->ExpandCreateFast(fTotalTracksNo);
+  for (int i = 0; i < nv; i++) {
+    auto temp          = (HalCbmV0TempTrack*) clones->UncheckedAt(i);
+    HalCbmTrack* track = (HalCbmTrack*) fTracks->UncheckedAt(i + fVertexTracks);
+    track->ResetTrack(i + fVertexTracks, this);
+    track->Hal::ExpTrack::CopyData(&temp->GetTrack());
+    track->BuildHelix();
+    track->EnableV0(kTRUE, kTRUE);
+#ifdef DEBUG_EXTR
+    auto vecpos = temp->GetV0().GetMomPos();  //copy at-data
+    auto vecneg = temp->GetV0().GetMomNeg();
+#endif
+    temp->ComputeStuff(this, track);
+    //new track momenta calculated !
+    auto recalcmom1 = temp->GetV0().GetMomPos();
+    auto recalcmom2 = temp->GetV0().GetMomNeg();
+    track->GetV0Info()->SetMomPos(recalcmom1.X(), recalcmom1.Y(), recalcmom1.Z());
+    track->GetV0Info()->SetMomNeg(recalcmom2.X(), recalcmom2.Y(), recalcmom2.Z());
+
+
+#ifdef DEBUG_EXTR
+    //recomputed data present print them
+    auto vecpos1 = temp->GetV0().GetMomPos();
+    auto vecpos2 = temp->GetV0().GetMomNeg();
+    std::cout << __FILE__ << "____" << std::endl;
+    auto print = [](TString t, TVector3 x) {
+      std::cout << Form("%4.4f %4.4f %4.4f %s", x.X(), x.Y(), x.Z(), t.Data()) << std::endl;
+    };
+    auto raw1 = GetTrack(temp->GetV0().GetPosId())->GetMomentum().Vect();
+    auto raw2 = GetTrack(temp->GetV0().GetNegId())->GetMomentum().Vect();
+    /*print("pos ori", vecpos);
+    print("pos com", vecpos1);
+    print("neg ori", vecneg);
+    print("neg com", vecpos2);*/
+    print("p1", raw1);
+    print("p2", raw2);
+    print("p1c", vecpos1);
+    print("p1x", vecpos);
+    print("p2c", vecpos2);
+    print("p2x", vecneg);
+    print("sum com", (vecpos1 + vecpos2));
+    print("sum raw", (raw1 + raw2));
+    print("tot v0m", track->GetMomentum().Vect());
+
+#else
+
+#endif
+    track->GetV0Info()->CopyData(&temp->GetV0());
+  }
+}
+
 HalCbmEvent::~HalCbmEvent() {}
 
 Bool_t HalCbmEvent::ExistInTree() const
@@ -57,6 +130,7 @@ void HalCbmEvent::UpdateDST(HalCbmEventInterface* ei)
   TLorentzVector start = ei->GetVertex();
   fVertex->SetXYZT(start.X(), start.Y(), start.Z(), start.T());
   fTracks->ExpandCreateFast(fTotalTracksNo);
+  fVertexTracks = ei->GetTotalTrackNo();
   for (int i = 0; i < fTotalTracksNo; i++) {
     HalCbmTrack* track = (HalCbmTrack*) fTracks->UncheckedAt(i);
     track->ResetTrack(i, this);
@@ -109,9 +183,9 @@ void HalCbmEvent::UpdateDST(HalCbmEventInterface* ei)
 
 void HalCbmEvent::UpdateAnaTree(HalCbmEventInterface* ei)
 {
-  CbmAnaTreeRecoSourceContainer* container = ei->GetContainer();
-  fTotalTracksNo                           = ei->GetTotalTrackNo();
-  TLorentzVector start                     = ei->GetVertex();
+  CbmAnaTreeRecoContainer* container = ei->GetContainer();
+  fTotalTracksNo = fVertexTracks = ei->GetTotalTrackNo();  //number of vtx tracks
+  TLorentzVector start           = ei->GetVertex();
   fVertex->SetXYZT(start.X(), start.Y(), start.Z(), start.T());
   fTracks->ExpandCreateFast(fTotalTracksNo);
   AnaTreeRecoIds ids = container->GetFieldIds();
@@ -151,3 +225,10 @@ void HalCbmEvent::UpdateAnaTree(HalCbmEventInterface* ei)
 }
 
 Hal::EventInterface* HalCbmEvent::CreateInterface() const { return new HalCbmEventInterface(); }
+
+void HalCbmEvent::ShallowCopyEvent(Hal::Event* event)
+{
+  Hal::ExpEvent::ShallowCopyEvent(event);
+  auto ev       = (HalCbmEvent*) event;
+  fVertexTracks = ev->fVertexTracks;
+}
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.h b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.h
index 36409f07ab77f41713ab6353797b3da676d3be24..e4ad55bf1c19fb82c8e13b5ebfb67fc8cabc8b4c 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.h
+++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEvent.h
@@ -22,12 +22,17 @@ class HalCbmEvent : public Hal::ExpEvent {
   HalCbmEvent(TString classname);
   void UpdateDST(HalCbmEventInterface* ei);
   void UpdateAnaTree(HalCbmEventInterface* ei);
+  void UpdateV0(HalCbmEventInterface* ei);
+  Int_t fVertexTracks = {0};
+
+  virtual void ShallowCopyEvent(Hal::Event* event);
 
  public:
   HalCbmEvent();
   HalCbmEvent(const HalCbmEvent& other);
   virtual void Update(Hal::EventInterface* interface);
   virtual Bool_t ExistInTree() const;
+  Int_t GetVertexTracksNo() const { return fVertexTracks; }
   virtual Hal::EventInterface* CreateInterface() const;
   virtual Hal::Track* GetNewTrack() const { return new HalCbmTrack(); };
   virtual Hal::Event* GetNewEvent() const { return new HalCbmEvent(); };
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.cxx b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.cxx
index 9157b9b6302da747e5be35b6b82e395c2a47c550..e0fdf5a3e12171d3333e4b98b4b4a429cd23d04f 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.cxx
@@ -9,6 +9,7 @@
 #include "CbmTofTrack.h"
 #include "CbmVertex.h"
 #include "FairRootManager.h"
+#include "HalCbmDetectorID.h"
 
 #include <RtypesCore.h>
 #include <TObjArray.h>
@@ -23,8 +24,9 @@ HalCbmEventInterface::HalCbmEventInterface() {}
 void HalCbmEventInterface::ConnectToTreeInternal(eMode /*mode*/)
 {
   Hal::DataManager* manager = Hal::DataManager::Instance();
-  fDataContainer            = (CbmAnaTreeRecoSourceContainer*) manager->GetObject("CbmAnaTreeSourceContainer.");
-  auto branchList           = manager->GetBranchNameList();
+  fDataContainer            = (CbmAnaTreeRecoContainer*) manager->GetObject(HalCbm::GetContainerName("reco"));
+
+  auto branchList = manager->GetBranchNameList();
   for (auto name : branchList) {
     std::cout << name << std::endl;
   }
@@ -44,6 +46,7 @@ void HalCbmEventInterface::ConnectToTreeInternal(eMode /*mode*/)
   }
   else {
     fFormatType = HalCbm::DataFormat::kAnalysisTree;
+    fTempV0     = (TClonesArray*) manager->GetObject("TempV0.");
   }
 }
 
@@ -52,7 +55,7 @@ void HalCbmEventInterface::Register(Bool_t write)
   Hal::DataManager* manager = Hal::DataManager::Instance();
   switch (fFormatType) {
     case HalCbm::DataFormat::kAnalysisTree: {
-      manager->Register("CbmAnaTreeSourceContainer.", "CbmAnaTreeSourceContainer.", fDataContainer, write);
+      manager->Register(HalCbm::GetContainerName("reco"), "CbmAnaTreeSourceContainer.", fDataContainer, write);
     } break;
     case HalCbm::DataFormat::kDST: {
       manager->Register("PrimaryVertex.", "PrimaryVertex", fCbmVertex, write);
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.h b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.h
index 3ae2e5e8d250b8eedf261338544c09a1636a6b83..5e2c9f9ba0b9743b6d5f4bcfafff9daa37b676f2 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.h
+++ b/analysis/PWGC2F/femtoscopy/hal/format/anatree/reco/HalCbmEventInterface.h
@@ -29,15 +29,16 @@ class HalCbmEventInterface : public Hal::EventInterface {
   friend class HalCbmFullEvent;
 
  protected:
-  HalCbm::DataFormat fFormatType                = {HalCbm::DataFormat::kUnknown};
-  CbmAnaTreeRecoSourceContainer* fDataContainer = {nullptr};
-  TClonesArray* fGlobalTracks                   = {nullptr};
-  TClonesArray* fStsTracks                      = {nullptr};
-  TClonesArray* fTrdTracks                      = {nullptr};
-  TClonesArray* fTofHits                        = {nullptr};
-  TClonesArray* fRichRings                      = {nullptr};
-  TClonesArray* fMuchTracks                     = {nullptr};
-  CbmVertex* fCbmVertex                         = {nullptr};
+  HalCbm::DataFormat fFormatType          = {HalCbm::DataFormat::kUnknown};
+  CbmAnaTreeRecoContainer* fDataContainer = {nullptr};
+  TClonesArray* fGlobalTracks             = {nullptr};
+  TClonesArray* fStsTracks                = {nullptr};
+  TClonesArray* fTrdTracks                = {nullptr};
+  TClonesArray* fTofHits                  = {nullptr};
+  TClonesArray* fRichRings                = {nullptr};
+  TClonesArray* fMuchTracks               = {nullptr};
+  TClonesArray* fTempV0                   = {nullptr};
+  CbmVertex* fCbmVertex                   = {nullptr};
   void UpdateDst(HalCbmMCEventInterface* ie);
   void UpdateAnaTree(HalCbmMCEventInterface* ie);
   virtual void ConnectToTreeInternal(eMode mode);
@@ -48,12 +49,13 @@ class HalCbmEventInterface : public Hal::EventInterface {
   HalCbm::DataFormat GetFormatType() const { return fFormatType; };
   virtual Int_t GetTotalTrackNo() const;
   virtual Hal::TrackInterface* GetTrackInterface() const { return new HalCbmTrackInterface(); }
-  CbmAnaTreeRecoSourceContainer* GetContainer() const { return fDataContainer; }
+  CbmAnaTreeRecoContainer* GetContainer() const { return fDataContainer; }
   virtual TObject* GetRawTrackPointer(Int_t index) const;
   /** GETTERS AND SETTERS **/
   virtual void SetRunInfoId(Int_t /*i*/){};
   virtual Int_t GetRunInfoId() const { return 0; };
   virtual TLorentzVector GetVertex() const;
+  TClonesArray* GetV0Temp() const { return fTempV0; }
   virtual ~HalCbmEventInterface();
   ClassDef(HalCbmEventInterface, 1)
 };
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/combined/HalCbmFullEvent.cxx b/analysis/PWGC2F/femtoscopy/hal/format/combined/HalCbmFullEvent.cxx
index 13ece70b227314c14bf33312fe048368a30f52bd..ad80f2918aa69bd6ab6a175f3376873183247068 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/combined/HalCbmFullEvent.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/format/combined/HalCbmFullEvent.cxx
@@ -9,6 +9,7 @@
 #include "HalCbmEventInterface.h"
 #include "HalCbmMCEvent.h"
 #include "HalCbmMCEventInterface.h"
+#include "HalCbmV0TempTrack.h"
 
 #include <AnalysisTree/Constants.hpp>
 
@@ -51,10 +52,11 @@ HalCbmFullEvent::HalCbmFullEvent(Hal::Event* re, Hal::Event* im) : Hal::ComplexE
 
 void HalCbmFullEvent::UpdateAnalysisTree(Hal::ComplexEventInterface* interface)
 {
-  HalCbmEventInterface* s             = (HalCbmEventInterface*) interface->GetReal();
-  CbmAnaTreeRecoSourceContainer* reco = (CbmAnaTreeRecoSourceContainer*) s->GetContainer();
-  auto vecToSim                       = reco->GetVtx2Sim();
-  for (Int_t i = 0; i < fTotalTracksNo; i++) {
+  HalCbmEventInterface* s       = (HalCbmEventInterface*) interface->GetReal();
+  CbmAnaTreeRecoContainer* reco = (CbmAnaTreeRecoContainer*) s->GetContainer();
+  auto vecToSim                 = reco->GetVtx2Sim();
+  Int_t charged                 = ((HalCbmEvent*) fRealEvent)->GetVertexTracksNo();
+  for (Int_t i = 0; i < charged; i++) {
     Hal::ComplexTrack* track = (Hal::ComplexTrack*) fTracks->UncheckedAt(i);
     track->ResetTrack(i, this);
     track->SetRealTrack(fRealEvent->GetTrack(i));
@@ -69,6 +71,25 @@ void HalCbmFullEvent::UpdateAnalysisTree(Hal::ComplexEventInterface* interface)
       track->SetMatchID(match);
     }
   }
+  //v0 stuff
+  auto v0Tracks = s->GetV0Temp();
+  if (!v0Tracks) return;
+  for (int i = charged; i < charged + fRealEvent->GetTotalV0No(); i++) {
+    Hal::ComplexTrack* track = (Hal::ComplexTrack*) fTracks->UncheckedAt(i);
+    track->ResetTrack(i, this);
+    track->SetRealTrack(fRealEvent->GetTrack(i));
+    track->Hal::Track::CopyData(fRealEvent->GetTrack(i));
+    auto v0Temp = (HalCbmV0TempTrack*) v0Tracks->UncheckedAt(i - charged);
+    Int_t match = v0Temp->GetMcId();
+    if (match < 0 || match == AnalysisTree::UndefValueInt) {
+      track->SetImgTrack(nullptr);
+      track->SetMatchID(-1);
+    }
+    else {
+      track->SetImgTrack(fImgEvent->GetTrack(match));
+      track->SetMatchID(match);
+    }
+  }
 }
 
 void HalCbmFullEvent::UpdateDst(Hal::ComplexEventInterface* interface)
@@ -85,7 +106,7 @@ void HalCbmFullEvent::UpdateDst(Hal::ComplexEventInterface* interface)
     if (sts_index >= 0) {
       CbmTrackMatchNew* match = (CbmTrackMatchNew*) ims->fStsMatches->UncheckedAt(sts_index);
       Int_t mcId              = match->GetMatchedLink().GetIndex();
-      if (mcId > 0) {
+      if (mcId >= 0) {
         track->SetImgTrack(fImgEvent->GetTrack(mcId));
         track->SetMatchID(mcId);
       }
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/unigen/HalCbmUnigenEvent.cxx b/analysis/PWGC2F/femtoscopy/hal/format/unigen/HalCbmUnigenEvent.cxx
index c365be1b00aec2dbf958e1c59fe114e5597f2ce3..5ca305862e6dc563a51074bda72164f7dfc4b59b 100644
--- a/analysis/PWGC2F/femtoscopy/hal/format/unigen/HalCbmUnigenEvent.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/format/unigen/HalCbmUnigenEvent.cxx
@@ -42,7 +42,7 @@ void HalCbmUnigenEvent::Update(Hal::EventInterface* interface)
       target_track->SetMotherIndex(particle->GetParent());
     }
     target_track->SetMomentum(particle->Px(), particle->Py(), particle->Pz(), particle->E());
-    target_track->SetFreezoutPosition(particle->X(), particle->Y(), particle->Z(), particle->T());
+    target_track->SetFreezeoutPosition(particle->X(), particle->Y(), particle->Z(), particle->T());
     target_track->SetStatus(particle->GetStatus());
   }
 }
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/CMakeLists.txt b/analysis/PWGC2F/femtoscopy/hal/helpers/CMakeLists.txt
index 8adf62e130be4fdc1fd0c12365d185147652cfe0..b44443b0434891617f8c78838aaf890e250d8098 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/CMakeLists.txt
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/CMakeLists.txt
@@ -11,8 +11,7 @@ Set(INCLUDE_DIRECTORIES
   ${CBMDATA_DIR}/global
   ${CBMDATA_DIR}/sts
   ${CMAKE_SOURCE_DIR}/core/field
-  ${HAL_CBM}/helpers
-  ${HAL_CBM}/helpers/anatree
+  ${HAL_CBM_HELPERS}
   ${AnalysisTree_INCLUDE_DIR}
 )
 Set(SYSTEM_INCLUDE_DIRECTORIES
@@ -30,15 +29,25 @@ Link_Directories(${LINK_DIRECTORIES})
 
 # List of source files
 set(SRCS
-    HalCbmDetectorID.cxx
-    HalCbmTaskManager.cxx
-    HalCbmCompressionTask.cxx
-    HalCbmAnalysisManager.cxx
     CbmHelix.cxx
-    HalCbmField.cxx
-    anatree/CbmAnaTreeContainer.cxx
-    anatree/CbmAnaTreeSource.cxx
-    anatree/HalCbmSource.cxx
+    HalCbmDetectorID.cxx
+	HalCbmField.cxx
+
+	hal/HalCbmAnalysisManager.cxx
+	hal/HalCbmSource.cxx
+	
+	faircbm/HalCbmCompressionTask.cxx
+	faircbm/HalCbmTaskManager.cxx
+	
+	fair/Field.cxx
+	fair/QAManagerBasic.cxx
+	fair/RootManager.cxx
+	fair/TaskManager.cxx
+	
+	anatree/CbmAnaTreeContainer.cxx
+	anatree/CbmAnaTreeObjectTrack.cxx
+	anatree/CbmAnaTreeSource.cxx
+
 )
 
 Set(LINKDEF HalCbmHelpersLinkDef.h)
@@ -48,7 +57,6 @@ set(PUBLIC_DEPENDENCIES
   CbmField
   FairRoot::Base
   HalCut
-  HalFair
   HalFeatures
   HalData
   KF
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.cxx
index 9f80d9b776acdef4396068f524d5b85dad4f3cda..c9c7ff71bf733588ef43f3db1612b725ea1200af 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.cxx
@@ -7,7 +7,7 @@
 
 #include <vector>
 
-#include <Hal/Field.h>
+#include <Hal/MagField.h>
 // matrix x, y, tx,ty, qp, z
 Hal::MagField* CbmHelix::fgField = NULL;
 CbmHelix::CbmHelix() {}
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.h b/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.h
index a925f525c46e946724c47aab72e7aa5a234af3ad..34f5fed2dfe8427f1378ef5d06e0a46dbd80c98f 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.h
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/CbmHelix.h
@@ -53,7 +53,18 @@ class CbmHelix : public TObject {
               << std::endl;
   }
   Double_t* GetTrack() { return fT; }
+  /**
+   * eval coordinates at Z
+   * @param z
+   * @return
+   */
   TVector3 Eval(Double_t z);
+  /**
+   * eval coordinates and momentum at Z
+   * @param z
+   * @param mom
+   * @return
+   */
   TVector3 Eval(Double_t z, TVector3& mom);
   virtual ~CbmHelix();
   ClassDef(CbmHelix, 1)
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.cxx
index 06dcc2cde71cd22cad0e7a7ea1c4d40827e049d8..22688b80fbf2a9ac83cd8c04033e16d2ca72d44f 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.cxx
@@ -2,3 +2,20 @@
     SPDX-License-Identifier: GPL-3.0-only
     Authors: Daniel Wielanek [committer] */
 #include "HalCbmDetectorID.h"
+
+#include <Hal/Cout.h>
+
+TString HalCbm::GetContainerName(TString name)
+{
+  if (name == "reco") {
+    return "CbmAnaTreeSourceContainer.";
+  }
+  if (name == "mc") {
+    return "CbmAnaTreeMcSourceContainer.";
+  }
+  if (name == "v0") {
+    return "CbmAnaTreeV0SourceContainer.";
+  }
+  Hal::Cout::PrintInfo(Form("HalCbm::GetContainerName wrong flag '%s'", name.Data()), Hal::EInfo::kError);
+  return "";
+}
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.h b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.h
index a9557842be1be20048515da5cf8e140142b237e5..d80ac3715fdeb134d142b919140d47c5140bea7c 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.h
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmDetectorID.h
@@ -4,6 +4,7 @@
 #ifndef CBMROOT_NICA_CBM_HELPERS_CBMDETECTORID_H_
 #define CBMROOT_NICA_CBM_HELPERS_CBMDETECTORID_H_
 
+
 #include <Hal/DataFormat.h>
 namespace HalCbm
 {
@@ -31,6 +32,13 @@ namespace HalCbm
     kAnalysisTree = 1,
     kUnknown      = 2
   };
+  /**
+   * returns container name in tree
+   * @param name "reco" "mc" or "v0" available
+   * @return
+   */
+  TString GetContainerName(TString name);
+
 }  // namespace HalCbm
 
 
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmHelpersLinkDef.h b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmHelpersLinkDef.h
index 5f4b2c89824ab84fbb3d1e2044de85c77e29a20b..c722238c54fe1b044bec8aad23372ff891c26ade 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmHelpersLinkDef.h
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmHelpersLinkDef.h
@@ -9,17 +9,30 @@
 #pragma link C++ namespace HalCbm::DetectorID;
 #pragma link C++ enum HalCbm::GeoSetup;
 #pragma link C++ enum HalCbm::DataFormat;
-#pragma link C++ class HalCbmTaskManager + ;
-#pragma link C++ class HalCbmCompressionTask + ;
+
 #pragma link C++ class CbmHelix + ;
 #pragma link C++ class HalCbmField + ;
-#pragma link C++ class HalCbmAnalysisManager + ;
 
-#pragma link C++ class CbmAnaTreeRecoSourceContainer + ;
-#pragma link C++ class CbmAnaTreeMcSourceContainer + ;
-#pragma link C++ class CbmAnaTreeSource + ;
-#pragma link C++ class CbmAnaTreeObjectTrack + ;
+
 #pragma link C++ class HalCbmATIOManager + ;
 #pragma link C++ class HalCbmSource + ;
+#pragma link C++ class HalCbmAnalysisManager + ;
+
+#pragma link C++ class HalCbmTaskManager + ;
+#pragma link C++ class HalCbmCompressionTask + ;
 
+#pragma link C++ class Hal::Fair::TaskManager + ;
+#pragma link C++ class Hal::Fair::RootManager + ;
+#pragma link C++ class Hal::Fair::QAManagerBasic + ;
+#pragma link C++ class Hal::Fair::Field + ;
+
+#pragma link C++ class CbmAnaTreeSource + ;
+#pragma link C++ class CbmAnaTreeObjectTrack + ;
+#pragma link C++ class CbmAnaTreeContainer + ;
+#pragma link C++ class CbmAnaTreeRecoContainer + ;
+#pragma link C++ class CbmAnaTreeMcContainer + ;
+#pragma link C++ class CbmAnaTreeV0Container + ;
+#pragma link C++ class CbmAnaTreeContainers + ;
+//#pragma link C++ class HalCbmQACoreManager + ;
+#pragma link C++ namespace Hal::Fair;
 //#pragma link C++ class CbmNicaCompression + ;
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.cxx
index f56b6300082bbe2bc7242bea617168f7ed68598b..31ec9e41fe82e9ee634747484ab0986a6be24bb1 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.cxx
@@ -4,21 +4,104 @@
 #include "CbmAnaTreeContainer.h"
 
 #include "AnalysisTree/Matching.hpp"
+#include "HalCbmSource.h"
 
 #include <TChain.h>
 #include <TFile.h>
 
 #include <AnalysisTree/Configuration.hpp>
+#include <vector>
 
 #include <Hal/Cout.h>
+#include <Hal/InputDataInfo.h>
+#include <Hal/RootIOManager.h>
 
-Bool_t CbmAnaTreeRecoSourceContainer::ConnectToTree(TChain* tree)
+void CbmAnaTreeRecoContainer::LoadFields(std::vector<TString> files)
 {
+  Bool_t found;
+  AnalysisTree::BranchConfig conf = GetBranchConf(files, "VtxTracks", found);
+  if (!found) return;
+  GetFieldIds().vtx_px   = conf.GetFieldId("px");
+  GetFieldIds().vtx_py   = conf.GetFieldId("py");
+  GetFieldIds().vtx_pz   = conf.GetFieldId("pz");
+  GetFieldIds().vtx_dcax = conf.GetFieldId("dcax");
+  GetFieldIds().vtx_dcay = conf.GetFieldId("dcay");
+  GetFieldIds().vtx_dcaz = conf.GetFieldId("dcaz");
+
+  GetFieldIds().vtx_chi2    = conf.GetFieldId("chi2");
+  GetFieldIds().vtx_vtxchi2 = conf.GetFieldId("vtx_chi2");
+  GetFieldIds().vtx_q       = conf.GetFieldId("q");
+  GetFieldIds().vtx_nhits   = conf.GetFieldId("nhits");
+  GetFieldIds().vtx_mvdhits = conf.GetFieldId("nhits_mvd");
+
+  GetFieldIds().vtx_x    = conf.GetFieldId("x");
+  GetFieldIds().vtx_cx0  = conf.GetFieldId("cx0");
+  GetFieldIds().vtx_cov1 = conf.GetFieldId("cov1");
+  conf                   = GetBranchConf(files, "TofHits", found);
+  if (!found) return;
+  GetFieldIds().tof_mass2 = conf.GetFieldId("mass2");
+}
+
+void CbmAnaTreeMcContainer::LoadFields(std::vector<TString> files)
+{
+
+  Bool_t found;
+  AnalysisTree::BranchConfig conf = GetBranchConf(files, "SimParticles", found);
+  if (!found) return;
+
+  GetFieldIds().px       = conf.GetFieldId("px");
+  GetFieldIds().py       = conf.GetFieldId("py");
+  GetFieldIds().pz       = conf.GetFieldId("pz");
+  GetFieldIds().mass     = conf.GetFieldId("mass");
+  GetFieldIds().pdg      = conf.GetFieldId("pid");
+  GetFieldIds().motherId = conf.GetFieldId("mother_id");
+
+  GetFieldIds().freezX = conf.GetFieldId("xfreez");
+  GetFieldIds().freezY = conf.GetFieldId("yfreez");
+  GetFieldIds().freezZ = conf.GetFieldId("zfreez");
+  GetFieldIds().freezT = conf.GetFieldId("tfreez");
+
+  conf = GetBranchConf(files, "SimEventHeader", found);
+  if (!found) return;
+
+  GetFieldIds().event_b   = conf.GetFieldId("b");
+  GetFieldIds().event_psi = conf.GetFieldId("psi_RP");
+}
+
+AnalysisTree::BranchConfig CbmAnaTreeContainer::GetBranchConf(std::vector<TString> files, TString patternToFind,
+                                                              Bool_t& found) const
+{
+  TFile* oldFile     = gFile;
+  TDirectory* oldDir = gDirectory;
+  for (auto file : files) {
+    TFile* f                          = new TFile(file);
+    AnalysisTree::Configuration* conf = (AnalysisTree::Configuration*) f->Get("Configuration");
+    auto branches                     = conf->GetListOfBranches();
+    for (auto branch : branches) {
+      if (patternToFind.EqualTo(branch)) {
+        found = kTRUE;
+        f->Close();
+        gFile      = oldFile;
+        gDirectory = oldDir;
+        return conf->GetBranchConfig(patternToFind.Data());
+      }
+    }
+    f->Close();
+  }
+  gFile      = oldFile;
+  gDirectory = oldDir;
+  found      = kFALSE;
+  return AnalysisTree::BranchConfig();
+}
+
+Bool_t CbmAnaTreeRecoContainer::ConnectToTree(TChain* tree)
+{
+
   fEvent     = new AnalysisTree::EventHeader();
   fVtxTracks = new AnalysisTree::TrackDetector();
   fTofHits   = new AnalysisTree::HitDetector();
   fVtx2Tof   = new AnalysisTree::Matching();
-  fVtx2Mc    = new AnalysisTree::Matching();
+  fVtx2Mc    = nullptr;
   if (tree->GetBranch("VtxTracks.") == nullptr) {
     Hal::Cout::PrintInfo("Lack of VtxTracks in AT", Hal::EInfo::kError);
     return kFALSE;
@@ -51,7 +134,7 @@ Bool_t CbmAnaTreeRecoSourceContainer::ConnectToTree(TChain* tree)
   return kTRUE;
 }
 
-Bool_t CbmAnaTreeMcSourceContainer::ConnectToTree(TChain* tree)
+Bool_t CbmAnaTreeMcContainer::ConnectToTree(TChain* tree)
 {
   fEvent     = new AnalysisTree::EventHeader();
   fParticles = new AnalysisTree::Particles();
@@ -64,63 +147,120 @@ Bool_t CbmAnaTreeMcSourceContainer::ConnectToTree(TChain* tree)
   return kTRUE;
 }
 
-void CbmAnaTreeRecoSourceContainer::LoadFields(TString file)
+void CbmAnaTreeV0Container::LoadFields(std::vector<TString> list)
 {
-  TFile* oldFile     = gFile;
-  TDirectory* oldDir = gDirectory;
+  Bool_t found;
+  AnalysisTree::BranchConfig conf = GetBranchConf(list, "Candidates", found);
+  if (!found) return;
+  GetFieldIds().chi2geo          = conf.GetFieldId("chi2_geo");
+  GetFieldIds().chi2_prim_first  = conf.GetFieldId("chi2_prim_first");
+  GetFieldIds().chi2_prim_second = conf.GetFieldId("chi2_prim_second");
+  GetFieldIds().chi2_topo        = conf.GetFieldId("chi2_topo");
+  GetFieldIds().cosine_first     = conf.GetFieldId("cosine_first");
+  GetFieldIds().cosine_second    = conf.GetFieldId("cosine_second");
 
-  TFile* f                          = new TFile(file);
-  AnalysisTree::Configuration* conf = (AnalysisTree::Configuration*) f->Get("Configuration");
-  GetFieldIds().vtx_px              = conf->GetBranchConfig("VtxTracks").GetFieldId("px");
-  GetFieldIds().vtx_py              = conf->GetBranchConfig("VtxTracks").GetFieldId("py");
-  GetFieldIds().vtx_pz              = conf->GetBranchConfig("VtxTracks").GetFieldId("pz");
-  GetFieldIds().vtx_dcax            = conf->GetBranchConfig("VtxTracks").GetFieldId("dcax");
-  GetFieldIds().vtx_dcay            = conf->GetBranchConfig("VtxTracks").GetFieldId("dcay");
-  GetFieldIds().vtx_dcaz            = conf->GetBranchConfig("VtxTracks").GetFieldId("dcaz");
 
-  GetFieldIds().vtx_chi2    = conf->GetBranchConfig("VtxTracks").GetFieldId("chi2");
-  GetFieldIds().vtx_vtxchi2 = conf->GetBranchConfig("VtxTracks").GetFieldId("vtx_chi2");
-  GetFieldIds().vtx_q       = conf->GetBranchConfig("VtxTracks").GetFieldId("q");
-  GetFieldIds().vtx_nhits   = conf->GetBranchConfig("VtxTracks").GetFieldId("nhits");
-  GetFieldIds().vtx_mvdhits = conf->GetBranchConfig("VtxTracks").GetFieldId("nhits_mvd");
+  GetFieldIds().cosine_topo = conf.GetFieldId("cosine_topo");
+  GetFieldIds().distance    = conf.GetFieldId("distance");
 
+  GetFieldIds().l         = conf.GetFieldId("l");
+  GetFieldIds().l_over_dl = conf.GetFieldId("l_over_dl");
+  GetFieldIds().px        = conf.GetFieldId("px");
+  GetFieldIds().py        = conf.GetFieldId("py");
+  GetFieldIds().pz        = conf.GetFieldId("pz");
+  GetFieldIds().x         = conf.GetFieldId("x");
+  GetFieldIds().y         = conf.GetFieldId("y");
+  GetFieldIds().z         = conf.GetFieldId("z");
+  GetFieldIds().dau1id    = conf.GetFieldId("daughter1_id");
+  GetFieldIds().dau2id    = conf.GetFieldId("daughter2_id");
+  GetFieldIds().mass      = conf.GetFieldId("mass");
 
-  GetFieldIds().tof_mass2 = conf->GetBranchConfig("TofHits").GetFieldId("mass2");
+#ifdef DEBUG_EXTR
+  GetFieldIds().dau1px = conf.GetFieldId("dau1px");
+  GetFieldIds().dau1py = conf.GetFieldId("dau1py");
+  GetFieldIds().dau1pz = conf.GetFieldId("dau1pz");
+  GetFieldIds().dau1x  = conf.GetFieldId("dau1x");
+  GetFieldIds().dau1y  = conf.GetFieldId("dau1y");
+  GetFieldIds().dau1z  = conf.GetFieldId("dau1z");
 
-  GetFieldIds().vtx_x    = conf->GetBranchConfig("VtxTracks").GetFieldId("x");
-  GetFieldIds().vtx_cx0  = conf->GetBranchConfig("VtxTracks").GetFieldId("cx0");
-  GetFieldIds().vtx_cov1 = conf->GetBranchConfig("VtxTracks").GetFieldId("cov1");
-  gFile                  = oldFile;
-  gDirectory             = oldDir;
+  GetFieldIds().dau2px = conf.GetFieldId("dau2px");
+  GetFieldIds().dau2py = conf.GetFieldId("dau2py");
+  GetFieldIds().dau2pz = conf.GetFieldId("dau2pz");
+  GetFieldIds().dau2x  = conf.GetFieldId("dau2x");
+  GetFieldIds().dau2y  = conf.GetFieldId("dau2y");
+  GetFieldIds().dau2z  = conf.GetFieldId("dau2z");
 
-  f->Close();
-  delete f;
+#endif
+
+
+  GetFieldIds().id  = conf.GetFieldId("id");
+  GetFieldIds().pdg = conf.GetFieldId("pid");
+  //  if (!found) return;
+  // GetFieldIds().mass = conf.GetFieldId("dcaz");
 }
 
-void CbmAnaTreeMcSourceContainer::LoadFields(TString inFile)
+Bool_t CbmAnaTreeV0Container::ConnectToTree(TChain* tree)
 {
-  TFile* oldFile     = gFile;
-  TDirectory* oldDir = gDirectory;
+  fParticles   = new AnalysisTree::Particles();
+  fParticlesMc = new AnalysisTree::Particles();
+
+  auto vec   = Hal::RootIOManager::GetListOfBranches(tree, true);
+  bool found = false;
+  for (auto brName : vec) {
+    brName.EqualTo("Candidates.");
+    found = true;
+  }
+  if (!found) return kFALSE;
+  tree->SetBranchAddress("Candidates.", &fParticles);
+  tree->SetBranchAddress("Simulated.", &fParticlesMc);
+  tree->SetBranchAddress("Candidates2Simulated.", &fV02Mc);
+
+  tree->SetBranchStatus("Candidates.", 1);
+  tree->SetBranchStatus("Simulated.", 1);
+  tree->SetBranchStatus("Candidates2Simulated.", 1);
+  return kTRUE;
+}
+
+void CbmAnaTreeContainers::LoadConf(Hal::InputDataInfo* info)
+{
+  auto listRow = info->GetListOfFiles();
+  std::vector<TString> rec1;
+  for (auto lev : listRow) {
+    rec1.push_back(lev[0]);
+  }
+  for (int i = 0; i < GetSize(); i++) {
+    fContainers[i]->LoadFields(rec1);
+  }
+}
+
+CbmAnaTreeContainers::CbmAnaTreeContainers()
+{
+  fContainers[0] = new CbmAnaTreeMcContainer();
+  fContainers[1] = new CbmAnaTreeRecoContainer();
+  fContainers[2] = new CbmAnaTreeV0Container();
+}
 
-  TFile* f = new TFile(inFile);
-
-  AnalysisTree::Configuration* conf = (AnalysisTree::Configuration*) f->Get("Configuration");
-
-  GetFieldIds().px        = conf->GetBranchConfig("SimParticles").GetFieldId("px");
-  GetFieldIds().py        = conf->GetBranchConfig("SimParticles").GetFieldId("py");
-  GetFieldIds().pz        = conf->GetBranchConfig("SimParticles").GetFieldId("pz");
-  GetFieldIds().mass      = conf->GetBranchConfig("SimParticles").GetFieldId("mass");
-  GetFieldIds().pdg       = conf->GetBranchConfig("SimParticles").GetFieldId("pid");
-  GetFieldIds().motherId  = conf->GetBranchConfig("SimParticles").GetFieldId("mother_id");
-  GetFieldIds().event_b   = conf->GetBranchConfig("SimEventHeader").GetFieldId("b");
-  GetFieldIds().event_psi = conf->GetBranchConfig("SimEventHeader").GetFieldId("psi_RP");
-  GetFieldIds().freezX    = conf->GetBranchConfig("SimParticles").GetFieldId("xfreez");
-  GetFieldIds().freezY    = conf->GetBranchConfig("SimParticles").GetFieldId("yfreez");
-  GetFieldIds().freezZ    = conf->GetBranchConfig("SimParticles").GetFieldId("zfreez");
-  GetFieldIds().freezT    = conf->GetBranchConfig("SimParticles").GetFieldId("tfreez");
-  gFile                   = oldFile;
-  gDirectory              = oldDir;
-
-  f->Close();
-  delete f;
+CbmAnaTreeContainer* CbmAnaTreeContainers::GetContainer(EContainerType type)
+{
+  switch (type) {
+    case EContainerType::kMc: {
+      return fContainers[0];
+    } break;
+    case EContainerType::kReco: {
+      return fContainers[1];
+    } break;
+    case EContainerType::kV0: {
+      return fContainers[2];
+    } break;
+  }
+  return nullptr;
+}
+
+std::vector<TString> CbmAnaTreeContainers::GetNames()
+{
+  std::vector<TString> res;
+  res.push_back("mc");
+  res.push_back("reco");
+  res.push_back("v0");
+  return res;
 }
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.h b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.h
index 4c6d77cc108bd32928f7d28abadf9a4894cc49b3..849e1f32d9a0b84c4fff1cc860ebd8686f32fcd8 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.h
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeContainer.h
@@ -4,6 +4,7 @@
 #ifndef NICACBMATCONTAINER_H_
 #define NICACBMATCONTAINER_H_
 
+
 #include <TNamed.h>
 
 #include <AnalysisTree/Detector.hpp>
@@ -11,7 +12,19 @@
 #include <AnalysisTree/Matching.hpp>
 
 class TChain;
+class TFile;
+//#define DEBUG_EXTR
+
+namespace AnalysisTree
+{
+  class Configuration;
+}
+namespace Hal
+{
+  class InputDataInfo;
+}
 
+class HalCbmATIOManager;
 struct AnaTreeRecoIds {
   Int_t vtx_px, vtx_py, vtx_pz;
   Int_t vtx_dcax, vtx_dcay, vtx_dcaz;
@@ -21,7 +34,19 @@ struct AnaTreeRecoIds {
   Int_t tof_mass2;
 };
 
-class CbmAnaTreeRecoSourceContainer : public TNamed {
+class CbmAnaTreeContainer : public TNamed {
+
+ public:
+  CbmAnaTreeContainer() : TNamed(){};
+  virtual void LoadFields(std::vector<TString> list) = 0;
+  virtual Bool_t ConnectToTree(TChain* chains)       = 0;
+  AnalysisTree::BranchConfig GetBranchConf(std::vector<TString> files, TString patternToFind, Bool_t& found) const;
+  virtual ~CbmAnaTreeContainer(){};
+  ClassDef(CbmAnaTreeContainer, 1)
+};
+
+
+class CbmAnaTreeRecoContainer : public CbmAnaTreeContainer {
   AnalysisTree::EventHeader* fEvent       = {nullptr};
   AnalysisTree::TrackDetector* fVtxTracks = {nullptr};
   AnalysisTree::Matching* fVtx2Tof        = {nullptr};
@@ -30,16 +55,16 @@ class CbmAnaTreeRecoSourceContainer : public TNamed {
   AnaTreeRecoIds fVtxIds;
 
  public:
-  CbmAnaTreeRecoSourceContainer(){};
-  void LoadFields(TString file);
-  Bool_t ConnectToTree(TChain* tree);
+  CbmAnaTreeRecoContainer(){};
+  void LoadFields(std::vector<TString> list);
+  Bool_t ConnectToTree(TChain* chains);
   inline AnalysisTree::EventHeader* GetEventHeader() const { return fEvent; };
   inline AnalysisTree::TrackDetector* GetVtxTracks() const { return fVtxTracks; };
   inline AnalysisTree::HitDetector* GetTofHits() const { return fTofHits; };
   inline AnalysisTree::Matching* GetVtx2ToFMatch() const { return fVtx2Tof; };
   inline AnalysisTree::Matching* GetVtx2Sim() const { return fVtx2Mc; };
   inline AnaTreeRecoIds& GetFieldIds() { return fVtxIds; }
-  virtual ~CbmAnaTreeRecoSourceContainer()
+  virtual ~CbmAnaTreeRecoContainer()
   {
     if (fEvent) {
       delete fEvent;
@@ -49,7 +74,7 @@ class CbmAnaTreeRecoSourceContainer : public TNamed {
       delete fVtx2Mc;
     }
   }
-  ClassDef(CbmAnaTreeRecoSourceContainer, 1)
+  ClassDef(CbmAnaTreeRecoContainer, 1)
 };
 
 struct AnaTreeMcIds {
@@ -60,26 +85,88 @@ struct AnaTreeMcIds {
   Int_t freezX, freezY, freezZ, freezT;
 };
 
-class CbmAnaTreeMcSourceContainer : public TNamed {
+class CbmAnaTreeMcContainer : public CbmAnaTreeContainer {
   AnalysisTree::EventHeader* fEvent   = {nullptr};
   AnalysisTree::Particles* fParticles = {nullptr};
   AnaTreeMcIds fIds;
 
  public:
-  CbmAnaTreeMcSourceContainer(){};
-  void LoadFields(TString inFile);
-  Bool_t ConnectToTree(TChain* tree);
+  CbmAnaTreeMcContainer(){};
+  void LoadFields(std::vector<TString> list);
+  Bool_t ConnectToTree(TChain* chains);
   inline AnaTreeMcIds& GetFieldIds() { return fIds; };
   inline AnalysisTree::EventHeader* GetEventHeader() const { return fEvent; };
   inline AnalysisTree::Particles* GetParticles() const { return fParticles; };
-  virtual ~CbmAnaTreeMcSourceContainer()
+  virtual ~CbmAnaTreeMcContainer()
   {
     if (fEvent) {
       delete fEvent;
       delete fParticles;
     }
   };
-  ClassDef(CbmAnaTreeMcSourceContainer, 1)
+  ClassDef(CbmAnaTreeMcContainer, 1)
+};
+
+struct AnaTreeV0Ids {
+  Int_t chi2geo, chi2_prim_first;
+  Int_t chi2_prim_second, chi2_topo;
+  Int_t cosine_first, cosine_second, cosine_topo;
+  Int_t distance, l, l_over_dl;
+  Int_t px, py, pz;
+  Int_t x, y, z;
+  Int_t dau1id, dau2id, id;
+  Int_t pdg, mass;
+#ifdef DEBUG_EXTR
+  int dau1px, dau1py, dau1pz, dau1x, dau1y, dau1z;
+  int dau2px, dau2py, dau2pz, dau2x, dau2y, dau2z;
+#endif
+};
+
+class CbmAnaTreeV0Container : public CbmAnaTreeContainer {
+  AnalysisTree::Particles* fParticles   = {nullptr};
+  AnalysisTree::Particles* fParticlesMc = {nullptr};
+  AnalysisTree::Matching* fV02Mc        = {nullptr};
+  AnaTreeV0Ids fIds;
+
+ public:
+  CbmAnaTreeV0Container(){};
+  void LoadFields(std::vector<TString> list);
+  Bool_t ConnectToTree(TChain* chains);
+  inline AnaTreeV0Ids& GetFieldIds() { return fIds; };
+  inline AnalysisTree::Particles* GetParticles() const { return fParticles; };
+  AnalysisTree::Matching* GetMaching() const { return fV02Mc; };
+  virtual ~CbmAnaTreeV0Container()
+  {
+    if (fParticles) delete fParticles;
+    if (fParticlesMc) delete fParticlesMc;
+    if (fV02Mc) delete fV02Mc;
+  };
+  ClassDef(CbmAnaTreeV0Container, 1)
 };
 
+
+class CbmAnaTreeContainers : public TObject {
+
+
+ public:
+  enum class EContainerType
+  {
+    kMc   = 0,
+    kReco = 1,
+    kV0   = 2
+  };
+  CbmAnaTreeContainer* fContainers[3] = {nullptr, nullptr, nullptr};
+  CbmAnaTreeContainers();
+  void LoadConf(Hal::InputDataInfo* info);
+  static std::vector<TString> GetNames();
+  CbmAnaTreeContainer* GetContainer(EContainerType type);
+  CbmAnaTreeV0Container* GetV0Data() const { return (CbmAnaTreeV0Container*) fContainers[2]; }
+  CbmAnaTreeRecoContainer* GetRecoData() const { return (CbmAnaTreeRecoContainer*) fContainers[2]; }
+  CbmAnaTreeMcContainer* GetSimData() const { return (CbmAnaTreeMcContainer*) fContainers[2]; }
+  Int_t GetSize() const { return 3; }
+  virtual ~CbmAnaTreeContainers(){};
+  ClassDef(CbmAnaTreeContainers, 1)
+};
+
+
 #endif /* NICACBMATCONTAINER_H_ */
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.cxx
index 2122087bbd73f340ad72d64e70c0e2d9fd17d6aa..d78fcda8ff347212c0ebaecead5fe0aca8850c77 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.cxx
@@ -4,6 +4,7 @@
 #include "CbmAnaTreeSource.h"
 
 #include "CbmAnaTreeContainer.h"
+#include "HalCbmDetectorID.h"
 
 #include <FairLogger.h>
 #include <FairRootManager.h>
@@ -14,6 +15,9 @@
 
 #include <AnalysisTree/Configuration.hpp>
 #include <fstream>
+#include <vector>
+
+#include <Hal/InputDataInfo.h>
 
 
 CbmAnaTreeSource::CbmAnaTreeSource() : CbmAnaTreeSource("", "aTree") {}
@@ -23,8 +27,7 @@ CbmAnaTreeSource::CbmAnaTreeSource(TString inFile, TString treeName)
   , fTreeName(treeName)
   , fChain(nullptr)
   , fFileName(nullptr)
-  , fContainerReco(nullptr)
-  , fContainerSim(nullptr)
+  , fATSource(nullptr)
 {
   fFileName    = new TString[1];
   fFileName[0] = inFile;
@@ -40,13 +43,14 @@ Bool_t CbmAnaTreeSource::Init()
   LOG(debug) << "Init source ";
   FairRootManager* mngr = FairRootManager::Instance();
   fChain                = new TChain(fTreeName);  //new name of tree?
-  TString first_file_name;
+
+  Hal::InputDataInfo info;
   if (fFileName[0].EndsWith(".root")) {
     for (int i = 0; i < fNFiles; i++) {
       LOG(debug) << "CbmAnaTree: opening single file" << fFileName[i];
       fChain->Add(fFileName[i]);
+      info.AddFile(fFileName[i]);
     }
-    first_file_name = fFileName[0];
   }
   else {  // this is long list
     std::ifstream list;
@@ -57,9 +61,9 @@ Bool_t CbmAnaTreeSource::Init()
       list >> temp;
       if (temp.Length() > 1) {
         fChain->Add(temp);
+        info.AddFile(temp);
         if (first) {
-          first_file_name = temp;
-          first           = false;
+          first = false;
         }
       }
       else {
@@ -69,29 +73,22 @@ Bool_t CbmAnaTreeSource::Init()
     } while (!list.eof());
     list.close();
   }
+
+
+  info.AddFile(mngr->GetInFile()->GetName());
+  fATSource = new CbmAnaTreeContainers();
   LOG(debug) << "load container ";
-  fContainerReco   = new CbmAnaTreeRecoSourceContainer();
-  fContainerSim    = new CbmAnaTreeMcSourceContainer();
-  Bool_t recoAvail = fContainerReco->ConnectToTree(fChain);
-  Bool_t simAvail  = fContainerSim->ConnectToTree(fChain);
-  if (recoAvail == kFALSE) {
-    delete fContainerReco;
-    fContainerReco = nullptr;
-  }
-  if (simAvail == kFALSE) {
-    delete fContainerSim;
-    fContainerSim = nullptr;
-  }
-  LOG(debug) << "load conf ";
-  LoadConf(first_file_name);
+  fATSource->LoadConf(&info);
+
   mngr->SetInChain(fChain, -1);
-  if (fContainerReco) {
-    LOG(debug) << "Loading reco data";
-    mngr->Register("CbmAnaTreeSourceContainer.", "CbmAnaTreeSourceContainer", fContainerReco, kFALSE);
-  }
-  if (fContainerSim) {
-    LOG(debug) << "Loading sim ana";
-    mngr->Register("CbmAnaTreeMcSourceContainer.", "CbmAnaTreeMcSourceContainer", fContainerSim, kFALSE);
+
+  auto contNames = CbmAnaTreeContainers::GetNames();
+  for (int i = 0; i < fATSource->GetSize(); i++) {
+    bool con = fATSource->fContainers[i]->ConnectToTree(fChain);
+    if (con) {
+      TString name = HalCbm::GetContainerName(contNames[i]);
+      mngr->Register(name, "AT", fATSource->fContainers[i], kFALSE);
+    }
   }
   return kTRUE;
 }
@@ -104,24 +101,6 @@ Int_t CbmAnaTreeSource::ReadEvent(UInt_t unsignedInt)
 
 void CbmAnaTreeSource::Close() {}
 
-void CbmAnaTreeSource::LoadConf(TString name)
-{
-  /// Save old global file and folder pointer to avoid messing with FairRoot
-  TFile* oldFile     = gFile;
-  TDirectory* oldDir = gDirectory;
-
-  if (fContainerReco) {
-    fContainerReco->LoadFields(name);
-  }
-  if (fContainerSim) {
-    fContainerSim->LoadFields(name);
-  }
-
-  /// Restore old global file and folder pointer to avoid messing with FairRoot
-  gFile      = oldFile;
-  gDirectory = oldDir;
-}
-
 void CbmAnaTreeSource::AddFile(TString file)
 {
   TString* temp = fFileName;
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.h b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.h
index 2460c4674a161a43c54dd0dd494d7f06c0c3b6e5..7c3dc14cccb2019d71e0eba1fadb080c27658d57 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.h
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/CbmAnaTreeSource.h
@@ -12,8 +12,7 @@
 #include <TString.h>
 
 
-class CbmAnaTreeMcSourceContainer;
-class CbmAnaTreeRecoSourceContainer;
+class CbmAnaTreeContainers;
 class TChain;
 
 class CbmAnaTreeSource : public FairSource {
@@ -21,11 +20,7 @@ class CbmAnaTreeSource : public FairSource {
   TString fTreeName;
   TChain* fChain;
   TString* fFileName;  //[fNFiles]
-  CbmAnaTreeRecoSourceContainer* fContainerReco;
-  CbmAnaTreeMcSourceContainer* fContainerSim;
-
- protected:
-  void LoadConf(TString name);
+  CbmAnaTreeContainers* fATSource;
 
  public:
   /**
@@ -60,8 +55,6 @@ class CbmAnaTreeSource : public FairSource {
   virtual void ReadBranchEvent(const char* /*BrName*/){};
   virtual void ReadBranchEvent(const char* /*BrName*/, Int_t /*Event*/){};
   virtual void FillEventHeader(FairEventHeader* /*feh*/){};
-  CbmAnaTreeRecoSourceContainer* GetRecoContainer() const { return fContainerReco; };
-  CbmAnaTreeMcSourceContainer* GetSimContainer() const { return fContainerSim; }
   void SetRunId(Int_t runId) { fRunId = runId; }
   ClassDef(CbmAnaTreeSource, 1)
 };
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.cxx
deleted file mode 100644
index dd8dae3baf3f6c7ef3c9ebe0fd3a7c413d83ad0b..0000000000000000000000000000000000000000
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.cxx
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw
-    SPDX-License-Identifier: GPL-3.0-only
-    Authors: Daniel Wielanek [committer] */
-#include "HalCbmSource.h"
-
-#include "CbmAnaTreeContainer.h"
-
-#include <TBranch.h>
-#include <TNamed.h>
-#include <TObjArray.h>
-
-#include <Hal/RootIOManager.h>
-
-HalCbmSource::HalCbmSource(TString filename) : Source(filename) { fManager = new HalCbmATIOManager(filename); }
-
-void HalCbmSource::AddFile(TString fileName) { fManager->AddFile(fileName); }
-
-void HalCbmSource::AddFriend(TString friendName, Int_t level) { fManager->AddFriend(friendName, level); }
-
-HalCbmSource::~HalCbmSource() { delete fManager; }
-
-void HalCbmATIOManager::FillBranches()
-{
-  auto inchain     = GetInChain();
-  fRecoContainer   = new CbmAnaTreeRecoSourceContainer();
-  fSimContainer    = new CbmAnaTreeMcSourceContainer();
-  Bool_t recoAvail = fRecoContainer->ConnectToTree(inchain[0]);
-  Bool_t simAvail  = fSimContainer->ConnectToTree(inchain[0]);
-  fRecoContainer->LoadFields(GetInputFileName());
-  fSimContainer->LoadFields(GetInputFileName());
-  int count = -1;
-  for (auto chain : inchain) {
-    count++;
-    if (count == 0) {
-      if (recoAvail) {
-        AddBranch("CbmAnaTreeSourceContainer.", fRecoContainer, Hal::BranchInfo::EFlag::kInActive);
-      }
-      if (simAvail) {
-        AddBranch("CbmAnaTreeMcSourceContainer.", fSimContainer, Hal::BranchInfo::EFlag::kInActive);
-      }
-      continue;  //skip first chain - we are looking for AT data
-    }
-    TObjArray* list_branch = chain->GetListOfBranches();
-    for (int i = 0; i < list_branch->GetEntries(); i++) {
-      TBranch* branch = (TBranch*) list_branch->At(i);
-      TString name    = branch->GetName();
-      TObject** obj   = new TObject*();
-      PushTObject(obj);
-      chain->SetBranchAddress(name, obj);
-      AddBranch(branch->GetName(), obj[0], Hal::BranchInfo::EFlag::kInActive);
-    }
-  }
-}
-
-HalCbmATIOManager::~HalCbmATIOManager()
-{
-  if (fRecoContainer) delete fRecoContainer;
-  if (fSimContainer) delete fSimContainer;
-}
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..eb8c8511034e84bebca5dc3ec4b201b27f8fb5db
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.cxx
@@ -0,0 +1,21 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#include "Field.h"
+
+#include <FairField.h>
+
+namespace Hal
+{
+  namespace Fair
+  {
+
+    Field::Field() : fField(nullptr) {}
+
+    TVector3 Field::GetField(Double_t x, Double_t y, Double_t z) const
+    {
+      return TVector3(fField->GetBx(x, y, z), fField->GetBy(x, y, z), fField->GetBz(x, y, z));
+    }
+    Field::~Field() { fField = nullptr; }
+  }  // namespace Fair
+} /* namespace Hal */
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.h b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.h
new file mode 100644
index 0000000000000000000000000000000000000000..39fc5d712e42bafd2912e2a6d62ddf81cf538beb
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/Field.h
@@ -0,0 +1,33 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#ifndef HAL_FAIR_FIELD_H_
+#define HAL_FAIR_FIELD_H_
+
+#include <TVector3.h>
+
+#include <Hal/MagField.h>
+
+/**
+ * interface to Fair magnetic field
+ */
+class FairField;
+namespace Hal
+{
+  namespace Fair
+  {
+    class Field : public ::Hal::MagField {
+      FairField* fField;
+
+     public:
+      Field();
+      void SetField(FairField* field) { fField = field; };
+      FairField* GetFairField() const { return fField; }
+      TVector3 GetField(Double_t x, Double_t y, Double_t z) const;
+      virtual ~Field();
+      ClassDef(Field, 1)
+    };
+  }  // namespace Fair
+} /* namespace Hal */
+
+#endif /* HAL_FAIR_FIELD_H_ */
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..f8ffaaeccc443385f6a434ccc354af7013560e23
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.cxx
@@ -0,0 +1,42 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#include "QAManagerBasic.h"
+
+#include <FairFileSource.h>
+#include <FairParRootFileIo.h>
+#include <FairRun.h>
+#include <FairRunAna.h>
+#include <FairRuntimeDb.h>
+
+namespace Hal
+{
+  namespace Fair
+  {
+    QAManagerBasic::QAManagerBasic() {}
+
+    QAManagerBasic::~QAManagerBasic() {}
+
+    FairRunAna* QAManagerBasic::GetRunAna(TString outFile, TString simFile, TString recoFile, TString parFile)
+    {
+      if (simFile.Length() == 0) {
+        simFile  = recoFile;
+        recoFile = "";
+      }
+      FairRunAna* run      = new FairRunAna();
+      FairFileSource* file = new FairFileSource(simFile);
+      if (recoFile != "") {
+        file->AddFriend(recoFile);
+      }
+      if (parFile != "") {
+        FairRuntimeDb* rtdb       = run->GetRuntimeDb();
+        FairParRootFileIo* parIo1 = new FairParRootFileIo();
+        parIo1->open(parFile.Data());
+        rtdb->setFirstInput(parIo1);
+      }
+      run->SetSource(file);
+      run->SetOutputFile(outFile);
+      return run;
+    }
+  }  // namespace Fair
+} /* namespace Hal */
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.h b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.h
new file mode 100644
index 0000000000000000000000000000000000000000..47155a0d76818754123ce051ebe71cc4d546b2ca
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/QAManagerBasic.h
@@ -0,0 +1,29 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#ifndef HAL_FAIR_QAMANAGERBASIC_H_
+#define HAL_FAIR_QAMANAGERBASIC_H_
+
+#include <TString.h>
+
+#include <Hal/QAManager.h>
+
+/**
+ * abstract class for QA in FairRoot-based frameworks
+ */
+class FairRunAna;
+namespace Hal
+{
+  namespace Fair
+  {
+    class QAManagerBasic : public ::Hal::QAManager {
+     public:
+      QAManagerBasic();
+      virtual FairRunAna* GetRunAna(TString outFile, TString simFile, TString recoFile = "", TString parFile = "");
+      virtual ~QAManagerBasic();
+      ClassDef(QAManagerBasic, 1)
+    };
+  }  // namespace Fair
+} /* namespace Hal */
+
+#endif /* HAL_FAIR_QAMANAGERBASIC_H_ */
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..5c9f9271ab828ca3d00a5d58c2bb9726ec5eac9a
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.cxx
@@ -0,0 +1,88 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#include "RootManager.h"
+
+#include <FairRootManager.h>
+
+#include <RtypesCore.h>
+#include <TCollection.h>
+#include <TFile.h>
+#include <TList.h>
+#include <TObjString.h>
+
+#include <Hal/InputDataInfo.h>
+
+namespace Hal
+{
+  namespace Fair
+  {
+    RootManager::RootManager()
+      : Hal::IOManager(new Hal::InputDataInfo(FairRootManager::Instance()->GetInFile()->GetName()))
+    {
+      fFairManager = FairRootManager::Instance();
+      if (fFairManager->GetInFile()) {
+        fDataInfo->OverwriteSourceName(fFairManager->GetInFile()->GetName());
+      }
+    }
+
+    TObject* RootManager::GetObject(const char* BrName) { return fFairManager->GetObject(BrName); }
+
+    TFile* RootManager::GetInFile() { return fFairManager->GetInFile(); }
+
+    void RootManager::UpdateBranches() { fFairManager->UpdateBranches(); }
+
+    void RootManager::SetInChain(TChain* tempChain, Int_t ident) { fFairManager->SetInChain(tempChain, ident); }
+
+    void RootManager::RegisterInternal(const char* name, const char* folderName, TNamed* obj, Bool_t toFile)
+    {
+      fFairManager->Register(name, folderName, obj, toFile);
+    }
+
+    void RootManager::RegisterInternal(const char* name, const char* Foldername, TCollection* obj, Bool_t toFile)
+    {
+      fFairManager->Register(name, Foldername, obj, toFile);
+    }
+
+    void RootManager::RefreshBranchList()
+    {
+      fFairManager = FairRootManager::Instance();
+      TList* l     = fFairManager->GetBranchNameList();
+      for (int i = 0; i < l->GetEntries(); i++) {
+        TString name = ((TObjString*) l->At(i))->GetString();
+        Int_t stat   = fFairManager->CheckBranch(name);
+        TObject* obj = fFairManager->GetObject(name);
+        switch (stat) {
+          case 0:  // not exist
+            break;
+          case 1:  // in file
+            AddBranch(name, obj, BranchInfo::EFlag::kInActive);
+            break;
+          case 2:  // memory
+            AddBranch(name, obj, BranchInfo::EFlag::kVirtual);
+            break;
+        }
+      }
+    }
+
+    Bool_t RootManager::InitInternal()
+    {
+      if (fFairManager == nullptr) {
+        fFairManager = FairRootManager::Instance();
+        if (fFairManager->GetInFile()) {
+          fDataInfo->OverwriteSourceName(fFairManager->GetInFile()->GetName());
+        }
+      }
+      RefreshBranchList();
+      return kTRUE;
+    }
+
+    void RootManager::CdToOutput()
+    {
+      if (!fFairManager) return;
+      auto file = fFairManager->GetOutFile();
+      if (file) file->cd();
+    }
+
+  }  // namespace Fair
+}  // namespace Hal
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.h b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.h
new file mode 100644
index 0000000000000000000000000000000000000000..836d4d3ba7cd8add6c245e271341d0858adf6425
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/RootManager.h
@@ -0,0 +1,48 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#ifndef HAL_FAIR_ROOTMANAGER_H_
+#define HAL_FAIR_ROOTMANAGER_H_
+
+#include <Hal/DataManager.h>
+#include <Hal/IOManager.h>
+
+
+/**
+ * IO manager for FairRoot
+ */
+class TObject;
+class TFile;
+class TChain;
+class TList;
+class FairRootManager;
+namespace Hal
+{
+  namespace Fair
+  {
+    class RootManager : public IOManager {
+      FairRootManager* fFairManager;
+
+     protected:
+      virtual void RegisterInternal(const char* name, const char* folderName, TNamed* obj, Bool_t toFile);
+      virtual void RegisterInternal(const char* name, const char* Foldername, TCollection* obj, Bool_t toFile);
+      virtual void RefreshBranchList();
+      virtual Bool_t InitInternal();
+
+     public:
+      RootManager();
+      TObject* GetObject(const char* BrName);
+      TFile* GetInFile();
+      void UpdateBranches();
+      void FillTree(){};
+      void SetInChain(TChain* tempChain, Int_t ident = -1);
+      Int_t CheckBranch(const char* BrName);
+      Int_t GetEntries() const { return -1; }
+      Int_t GetEntry(Int_t /*i*/, Int_t /*flag*/) { return -1; };
+      void CdToOutput();
+      virtual ~RootManager(){};
+      ClassDef(RootManager, 1)
+    };
+  }  // namespace Fair
+}  // namespace Hal
+#endif /* HAL_FAIR_ROOTMANAGER_H_ */
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..e451ddc1e4c8e3d36c1297e18686fa898a7f6ed8
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.cxx
@@ -0,0 +1,128 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#include "TaskManager.h"
+
+#include "RootManager.h"
+
+#include <RtypesCore.h>
+#include <TFile.h>
+
+#include <cstdlib>
+
+#include <Hal/DataManager.h>
+#include <Hal/IOManager.h>
+#include <Hal/Package.h>
+#include <Hal/Parameter.h>
+#include <Hal/Source.h>
+#include <Hal/Std.h>
+#include <Hal/Task.h>
+#include <Hal/TriggerTask.h>
+namespace Hal
+{
+  namespace Fair
+  {
+    TaskManager::TaskManager() : fManager(nullptr), fProcessedEvents(0) { fManager = new RootManager(); }
+
+    InitStatus TaskManager::Init()
+    {
+      fManager->Init();
+      DataManager* mng = DataManager::Instance();
+      mng->SetManager(fManager);
+      for (auto task : fTriggers) {
+        Task::EInitFlag stat = task->Init();
+        switch (stat) {
+          case Task::EInitFlag::kERROR: {
+            fPassiveTriggers.push_back(task);
+          } break;
+          case Task::EInitFlag::kSUCCESS: {
+            fActiveTriggers.push_back(task);
+          } break;
+          case Task::EInitFlag::kFATAL: {
+            exit(0);
+            return kFATAL;
+          } break;
+        }
+      }
+      for (auto task : fTasks) {
+        Task::EInitFlag stat = task->Init();
+        switch (stat) {
+          case Task::EInitFlag::kERROR: {
+            fPassiveTasks.push_back(task);
+          } break;
+          case Task::EInitFlag::kSUCCESS: {
+            fActiveTasks.push_back(task);
+          } break;
+          case Task::EInitFlag::kFATAL: {
+            exit(0);
+            return kFATAL;
+          } break;
+        }
+      }
+      return kSUCCESS;
+    }
+
+    void TaskManager::Exec(Option_t* option)
+    {
+      ++fProcessedEvents;
+      for (auto trigger : fActiveTriggers) {
+        trigger->Exec(option);
+        if (!trigger->IsEventGood()) {
+          return;
+        }
+      }
+      for (auto task : fActiveTasks) {
+        task->Exec(option);
+      }
+    }
+
+    void TaskManager::Finish()
+    {
+      auto GoToDir = [](TString name) {
+        TDirectory* dir            = (TDirectory*) gFile;
+        std::vector<TString> array = Hal::Std::ExplodeString(name, '/');
+        for (int i = 0; i < (int) array.size(); i++) {
+          TDirectory* newdir = (TDirectory*) dir->FindObject(array[i]);
+          if (!newdir) {
+            dir->mkdir(array[i]);
+          }
+          dir->cd(array[i]);
+        }
+      };
+      Package* metadata_new = new Package();
+      metadata_new->SetName("RunInfo");
+      metadata_new->AddObject(new ParameterString("Software ver", HAL_PHYSICALANALYSYS_VER));
+      metadata_new->AddObject(new ParameterString("Date", Hal::Std::GetDate(), 'f'));
+      metadata_new->AddObject(new ParameterString("Time", Hal::Std::GetTime(), 'f'));
+      metadata_new->AddObject(new ParameterUInt("Processed_events", fProcessedEvents, '+'));
+      metadata_new->AddObject(new ParameterString("Input file", DataManager::Instance()->GetSourceName(), 'f'));
+      TList* list = new TList();
+      list->SetName("Tasks");
+      for (auto task : fTasks) {
+        TString name  = task->ClassName();
+        TString label = "Active";
+        for (auto probeTask : fPassiveTasks) {
+          if (probeTask == task) label = "Passive";
+        }
+        list->AddLast(new ParameterString(name, label));
+      }
+      metadata_new->AddObject(list);
+
+      GoToDir("HalInfo");
+      TDirectory* dir        = (TDirectory*) gFile;
+      TDirectory* metadatata = (TDirectory*) dir->Get("HalInfo");
+      if (metadatata->Get("RunInfo")) {
+        delete metadata_new;
+      }
+      else {
+        metadata_new->Write("RunInfo");
+      }
+      gFile->cd();
+      for (auto task : fTasks) {
+        task->FinishTask();
+      }
+    }
+
+    TaskManager::~TaskManager() {}
+  }  // namespace Fair
+} /* namespace Hal */
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.h b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.h
new file mode 100644
index 0000000000000000000000000000000000000000..84243909019e20d64e54d6ff5f6ddebceb42693b
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/fair/TaskManager.h
@@ -0,0 +1,56 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#ifndef HAL_FAIR_HALFAIRANALYSISMANAGER_H_
+#define HAL_FAIR_HALFAIRANALYSISMANAGER_H_
+
+#include <FairTask.h>
+
+#include <RtypesCore.h>
+#include <TString.h>
+
+#include <vector>
+
+#include <Hal/Task.h>
+
+/**
+ * wrapper of task for FairRoot
+ * You should add all task for analysis here, and later add this task as to the FairRunAna
+ */
+namespace Hal
+{
+  class IOManager;
+  class Source;
+  class TriggerTask;
+} /* namespace Hal */
+
+namespace Hal
+{
+  namespace Fair
+  {
+    class TaskManager : public FairTask {
+     protected:
+      IOManager* fManager;
+      std::vector<::Hal::TriggerTask*> fTriggers;
+      std::vector<::Hal::TriggerTask*> fActiveTriggers;
+      std::vector<::Hal::TriggerTask*> fPassiveTriggers;
+      std::vector<::Hal::Task*> fTasks;
+      std::vector<::Hal::Task*> fActiveTasks;
+      std::vector<::Hal::Task*> fPassiveTasks;
+      UInt_t fProcessedEvents;
+
+      virtual InitStatus Init();
+
+     public:
+      TaskManager();
+      virtual void AddTrigger(::Hal::TriggerTask* trigger) { fTriggers.push_back(trigger); }
+      virtual void AddTask(::Hal::Task* task) { fTasks.push_back(task); };
+      virtual void Exec(Option_t* option);
+      virtual void Finish();
+      virtual ~TaskManager();
+      ClassDef(TaskManager, 1)
+    };
+  }  // namespace Fair
+} /* namespace Hal */
+
+#endif /* HAL_FAIR_HALFAIRANALYSISMANAGER_H_ */
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmCompressionTask.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmCompressionTask.cxx
similarity index 100%
rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmCompressionTask.cxx
rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmCompressionTask.cxx
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmCompressionTask.h b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmCompressionTask.h
similarity index 100%
rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmCompressionTask.h
rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmCompressionTask.h
diff --git a/analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.cxx
similarity index 87%
rename from analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.cxx
rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.cxx
index 07465fa5edf80419680d0cce350546400c283c94..982ece5ad4fa6068aa5f00c0690981fc44736257 100644
--- a/analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.cxx
@@ -1,7 +1,7 @@
 /* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw
     SPDX-License-Identifier: GPL-3.0-only
     Authors: Daniel Wielanek [committer] */
-#include "CbmQACoreManager.h"
+#include "HalCbmQACoreManager.h"
 
 #include "CbmAnaTreeSource.h"
 #include "HalCbmBasicTrackCuts.h"
@@ -19,7 +19,7 @@
 #include <Hal/TrackAna.h>
 
 
-CbmQACoreManager::CbmQACoreManager()
+HalCbmQACoreManager::HalCbmQACoreManager()
 {
   fEta[0]  = -2;
   fEta[1]  = 4;
@@ -27,7 +27,7 @@ CbmQACoreManager::CbmQACoreManager()
   fDCAz[1] = 10;
 }
 
-Hal::Event* CbmQACoreManager::GetFormat(eFormatType type, eAnaType ana)
+Hal::Event* HalCbmQACoreManager::GetFormat(eFormatType type, eAnaType ana)
 {
   switch (ana) {
     case eAnaType::kDefault:
@@ -48,7 +48,7 @@ Hal::Event* CbmQACoreManager::GetFormat(eFormatType type, eAnaType ana)
   return nullptr;
 }
 
-void CbmQACoreManager::SetRecoTrackCut(Hal::TrackAna* ana, ePidCut cut, eParticleType primary, TString flag)
+void HalCbmQACoreManager::SetRecoTrackCut(Hal::TrackAna* ana, ePidCut cut, eParticleType primary, TString flag)
 {
   HalCbmBasicTrackCuts cuts;
   switch (cut) {
@@ -122,7 +122,7 @@ void CbmQACoreManager::SetRecoTrackCut(Hal::TrackAna* ana, ePidCut cut, eParticl
   ana->AddCutsAndMonitors(cuts);
 }
 
-FairRunAna* CbmQACoreManager::GetRunAna(TString outFile, TString simFile, TString /*recoFile*/, TString /*parFile*/)
+FairRunAna* HalCbmQACoreManager::GetRunAna(TString outFile, TString simFile, TString /*recoFile*/, TString /*parFile*/)
 {
   FairRunAna* run        = new FairRunAna();
   CbmAnaTreeSource* file = new CbmAnaTreeSource(simFile);
@@ -131,4 +131,4 @@ FairRunAna* CbmQACoreManager::GetRunAna(TString outFile, TString simFile, TStrin
   return run;
 }
 
-CbmQACoreManager::~CbmQACoreManager() {}
+HalCbmQACoreManager::~HalCbmQACoreManager() {}
diff --git a/analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.h b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.h
similarity index 86%
rename from analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.h
rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.h
index 801837e805cae5277dc2b8d9901739934a01f3ab..0953413d9200f86e36c75efbc54cf6b569c0cf91 100644
--- a/analysis/PWGC2F/femtoscopy/hal/qa/CbmQACoreManager.h
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmQACoreManager.h
@@ -4,8 +4,9 @@
 #ifndef CBMROOT_ANALYSIS_PWGC2F_FEMTOSCOPY_NICAFEMTO_HELPERS_CBMQACOREMANAGER_H_
 #define CBMROOT_ANALYSIS_PWGC2F_FEMTOSCOPY_NICAFEMTO_HELPERS_CBMQACOREMANAGER_H_
 
+#include "QAManagerBasic.h"
+
 #include <Hal/QAManager.h>
-#include <Hal/QAManagerBasic.h>
 
 namespace Hal
 {
@@ -13,9 +14,9 @@ namespace Hal
   class TrackAna;
   class TwoTrackAna;
 }  // namespace Hal
-class CbmQACoreManager : public Hal::Fair::QAManagerBasic {
+class HalCbmQACoreManager : public Hal::Fair::QAManagerBasic {
  public:
-  CbmQACoreManager();
+  HalCbmQACoreManager();
   virtual FairRunAna* GetRunAna(TString outFile, TString simFile, TString recoFile, TString parFile = "");
   virtual Hal::Event* GetFormat(Hal::QAManager::eFormatType type,
                                 Hal::QAManager::eAnaType ana = Hal::QAManager::eAnaType::kDefault);
@@ -24,8 +25,8 @@ class CbmQACoreManager : public Hal::Fair::QAManagerBasic {
   virtual void SetEventCut(Hal::TrackAna* /*ana*/, Int_t /*col*/, TString /*flag = ""*/){};
   virtual void SetPairCut(Hal::TwoTrackAna* /*ana*/, Hal::QAManager::ePidCut /*pid1*/,
                           Hal::QAManager::ePidCut /*pid2*/){};
-  virtual ~CbmQACoreManager();
-  ClassDef(CbmQACoreManager, 1)
+  virtual ~HalCbmQACoreManager();
+  ClassDef(HalCbmQACoreManager, 1)
 };
 
 
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.cxx
similarity index 96%
rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.cxx
rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.cxx
index fd662951d318a504ac98eaa147339cfcab27f74a..4db8632de496476a299cb218484213d1737e334e 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.cxx
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.cxx
@@ -6,6 +6,7 @@
 #include "CbmFieldMap.h"
 #include "CbmFieldMapSym3.h"
 #include "HalCbmField.h"
+#include "RootManager.h"
 
 #include <FairRunAna.h>
 
@@ -13,7 +14,6 @@
 #include <vector>
 
 #include <Hal/IOManager.h>
-#include <Hal/RootManager.h>
 
 
 HalCbmTaskManager::HalCbmTaskManager() : fMagField(nullptr) {}
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.h b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.h
similarity index 95%
rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.h
rename to analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.h
index d68ba0752868ce6e9a059775af9c20f3d22c2307..73116cc268ed0503399e8742729e1490dcbe8ae2 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmTaskManager.h
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/faircbm/HalCbmTaskManager.h
@@ -6,8 +6,7 @@
 #include "CbmHelix.h"
 #include "FairField.h"
 #include "FairTask.h"
-
-#include <Hal/TaskManager.h>
+#include "TaskManager.h"
 
 namespace Hal
 {
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmAnalysisManager.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmAnalysisManager.cxx
similarity index 100%
rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmAnalysisManager.cxx
rename to analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmAnalysisManager.cxx
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmAnalysisManager.h b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmAnalysisManager.h
similarity index 100%
rename from analysis/PWGC2F/femtoscopy/hal/helpers/HalCbmAnalysisManager.h
rename to analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmAnalysisManager.h
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.cxx b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..f6dcaa0d6afa34e7a685f8f23ed7e7b547e46022
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.cxx
@@ -0,0 +1,62 @@
+/* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#include "HalCbmSource.h"
+
+#include "CbmAnaTreeContainer.h"
+#include "HalCbmDetectorID.h"
+
+#include <TBranch.h>
+#include <TNamed.h>
+#include <TObjArray.h>
+
+#include <vector>
+
+#include <Hal/Cout.h>
+#include <Hal/InputDataInfo.h>
+#include <Hal/RootIOManager.h>
+
+HalCbmSource::HalCbmSource(TString filename) : Source(filename) { fManager = new HalCbmATIOManager(filename); }
+
+void HalCbmSource::AddFile(TString fileName) { fManager->AddFile(fileName); }
+
+void HalCbmSource::AddFriend(TString friendName, Int_t level) { fManager->AddFriend(friendName, level); }
+
+HalCbmSource::~HalCbmSource() { delete fManager; }
+
+void HalCbmATIOManager::UpdateBranches()
+{
+  if (!fAtBranchesSet) {
+    auto inchain = GetInChain();
+    fContainer   = new CbmAnaTreeContainers();
+    fContainer->LoadConf(fDataInfo);
+
+    auto names = CbmAnaTreeContainers::GetNames();
+    for (int i = 0; i < fContainer->GetSize(); i++) {
+      bool con = fContainer->fContainers[i]->ConnectToTree(GetInChain());
+      if (con) {
+        TString name = HalCbm::GetContainerName(names[i]);
+        AddBranch(name, fContainer->fContainers[i], Hal::BranchInfo::EFlag::kInActive);
+        TObject** obj = new TObject*();
+        obj[0]        = fContainer->fContainers[i];
+        PushTObject(obj);
+      }
+    }
+    fAtBranchesSet = kTRUE;
+  }
+  Hal::RootIOManager::UpdateBranches();
+}
+
+HalCbmATIOManager::HalCbmATIOManager(std::initializer_list<TString> lists)
+  : Hal::RootIOManager(new Hal::InputRootDataInfo(lists))
+{
+}
+
+HalCbmATIOManager::~HalCbmATIOManager()
+{
+  if (fContainer) delete fContainer;
+}
+
+Bool_t HalCbmSource::Init() { return kTRUE; }
+
+HalCbmSource::HalCbmSource(std::initializer_list<TString> lists) { fManager = new HalCbmATIOManager(lists); }
diff --git a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.h b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.h
similarity index 81%
rename from analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.h
rename to analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.h
index 2746315511b25ada74fc726da02987722ad01cad..df6e83e375e41c1ee67528e93fd003bac4b38278 100644
--- a/analysis/PWGC2F/femtoscopy/hal/helpers/anatree/HalCbmSource.h
+++ b/analysis/PWGC2F/femtoscopy/hal/helpers/hal/HalCbmSource.h
@@ -18,17 +18,17 @@
 /**
  * ugly work-around for AT that doesn't contain TObject based object
  */
-class CbmAnaTreeRecoSourceContainer;
-class CbmAnaTreeMcSourceContainer;
+class CbmAnaTreeContainers;
 
 class HalCbmATIOManager : public Hal::RootIOManager {
  protected:
-  virtual void FillBranches();
-  CbmAnaTreeRecoSourceContainer* fRecoContainer = {nullptr};
-  CbmAnaTreeMcSourceContainer* fSimContainer    = {nullptr};
+  CbmAnaTreeContainers* fContainer = {nullptr};
+  Bool_t fAtBranchesSet            = {kFALSE};
 
  public:
   HalCbmATIOManager(TString name = "") : Hal::RootIOManager(name){};
+  HalCbmATIOManager(std::initializer_list<TString> lists);
+  virtual void UpdateBranches();
   virtual ~HalCbmATIOManager();
   ClassDef(HalCbmATIOManager, 1)
 };
@@ -39,6 +39,8 @@ class HalCbmSource : public Hal::Source {
 
  public:
   HalCbmSource(TString filename = "");
+  HalCbmSource(std::initializer_list<TString> lists);
+  Bool_t Init();
   virtual void AddFile(TString fileName = "");
   virtual void AddFriend(TString friendName = "", Int_t level = 0);
   Hal::IOManager* GetIOManager() const { return fManager; };
diff --git a/analysis/PWGC2F/femtoscopy/hal/qa/CMakeLists.txt b/analysis/PWGC2F/femtoscopy/hal/qa/CMakeLists.txt
deleted file mode 100644
index 19c6e6436d097c07dcf307cf9f331ae34a4b6b7e..0000000000000000000000000000000000000000
--- a/analysis/PWGC2F/femtoscopy/hal/qa/CMakeLists.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-# Create a library called "" which includes the source files given in
-# the array .
-# The extension is already found.  Any number of sources could be listed here.
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
-Set(INCLUDE_DIRECTORIES
-  ${CMAKE_SOURCE_FAIRMCSTACK}
-  ${KF_HEADERS}
-  ${CBMDATA_DIR}
-  ${CBMDATA_DIR}/global
-  ${CBMDATA_DIR}/sts
-  ${HAL_CBM}/helpers
-  ${HAL_CBM}/qa
-  ${HAL_CBM_FORMAT}
-  ${HAL_CBM_CUTS}
-  ${Hal_INCLUDE_DIR}
-)
-Set(SYSTEM_INCLUDE_DIRECTORIES
-  ${ROOT_INCLUDE_DIR} 
-  ${BASE_INCLUDE_DIRECTORIES}
-  ${CLHEP_INCLUDE_DIR}
-  ${Boost_INCLUDE_DIRS}
-)
-
-Set(LINK_DIRECTORIES
-  ${ROOT_LIBRARY_DIR}
-  ${FAIRROOT_LIBRARY_DIR}
-  ${Boost_LIBRARY_DIRS}
-  ${Vc_LIB_DIR}
-  ${KFParticle_LIB_DIR}
-)
-
-Include_Directories(${INCLUDE_DIRECTORIES})
-Include_Directories(SYSTEM ${SYSTEM_INCLUDE_DIRECTORIES})
- 
-Link_Directories(${LINK_DIRECTORIES})
-
-# List of source files
-set(SRCS
-CbmQACoreManager.cxx
-)
-
-Set(HEADERS )
-Set(LINKDEF HalCbmQALinkDef.h)
-Set(LIBRARY_NAME HalCbmQa)
-Set(PUBLIC_DEPENDENCIES
-    HalFeatures
-    HalCbmFormat
-    HalData
-    HalCbmCuts
-    FairRoot::Base
-    HalCut
-    HalAna
-    HalQA
-    KF
-    KFParticle)
-generate_cbm_library()
-
-add_dependencies(G__HalCbmQa ANALYSISTREE HAL)
-
diff --git a/analysis/PWGC2F/femtoscopy/hal/qa/HalCbmQALinkDef.h b/analysis/PWGC2F/femtoscopy/hal/qa/HalCbmQALinkDef.h
deleted file mode 100644
index ae4bfa1e12e15e142d9fb42f12f3212a8b81772b..0000000000000000000000000000000000000000
--- a/analysis/PWGC2F/femtoscopy/hal/qa/HalCbmQALinkDef.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw
-    SPDX-License-Identifier: GPL-3.0-only
-    Authors: Daniel Wielanek [committer] */
-#pragma link off all globals;
-#pragma link off all classes;
-#pragma link off all functions;
-
-#pragma link C++ class CbmQACoreManager + ;
-//#pragma link C++ class CbmNicaCompression + ;
diff --git a/external/Hal.patch b/external/Hal.patch
deleted file mode 100644
index 09dcb8a2221391e8bd9101ff658ab347ff6dc786..0000000000000000000000000000000000000000
--- a/external/Hal.patch
+++ /dev/null
@@ -1,108 +0,0 @@
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 9376018..c87ecb1 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -15,7 +15,18 @@ endif()
- Set(USE_FAIRROOT FALSE)
- Set(USE_EXAMPLES FALSE)
- #check if simpath detected
--if(DEFINED ENV{SIMPATH})
-+
-+if(NOT DEFINED ENV{SIMPATH} AND NOT DEFINED SIMPATH)
-+message (FATAL_ERROR "\
-+You did not define the environment variable SIMPATH or define SIMPATH when calling cmake. \
-+Either of the two is needed to properly find the external packages. \
-+Please either set this environment variable or pass -DSIMPATH=<path> and execute cmake again. \
-+")
-+endif()
-+if (NOT DEFINED SIMPATH)
-+  set(SIMPATH $ENV{SIMPATH})
-+endif()
-+if(DEFINED SIMPATH)
-     Set(USE_FAIRROOT TRUE)      
- endif()
- #check if fairroot disabled
-diff --git a/cmake/fair/CheckCompiler.cmake b/cmake/fair/CheckCompiler.cmake
-index 2bc05b2..91a6fa2 100644
---- a/cmake/fair/CheckCompiler.cmake
-+++ b/cmake/fair/CheckCompiler.cmake
-@@ -19,7 +19,7 @@ endif (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
- # the compiler and compiler flags used to install fairsoft.
- # Compare compiler and compiler flags used to compile fairsoft with the compiler and flags used now
- # In case of differences print a warning
--Find_Program(FAIRSOFT_CONFIG fairsoft-config PATHS $ENV{SIMPATH}/bin $ENV{FAIRSOFT_ROOT}/bin NO_DEFAULT_PATH)
-+Find_Program(FAIRSOFT_CONFIG fairsoft-config PATHS ${SIMPATH}/bin $ENV{SIMPATH}/bin $ENV{FAIRSOFT_ROOT}/bin NO_DEFAULT_PATH)
- 
- If(FAIRSOFT_CONFIG)
-   Message(STATUS "fairsoft-config found")
-diff --git a/cmake/modules/CMakeFairRoot.cmake b/cmake/modules/CMakeFairRoot.cmake
-index 1fad98c..19a3290 100644
---- a/cmake/modules/CMakeFairRoot.cmake
-+++ b/cmake/modules/CMakeFairRoot.cmake
-@@ -22,9 +22,12 @@ IF(NOT UNIX)
- ENDIF(NOT UNIX)  
-     
-     
--IF(NOT DEFINED ENV{SIMPATH})
-+if(NOT DEFINED ENV{SIMPATH} AND NOT DEFINED SIMPATH)
-   MESSAGE(FATAL_ERROR "You did not define the environment variable SIMPATH which is nedded to find the external packages. Please set this variable and execute cmake again.")
- ENDIF(NOT DEFINED ENV{SIMPATH})
-+if(NOT SIMPATH)
-+  Set(SIMPATH $ENV{SIMPATH})
-+endif()
-     
- find_package(ROOT 6.00.00 REQUIRED)
-   if("${ROOT_VERSION_MAJOR}.${ROOT_VERSION_MINOR}" VERSION_GREATER 6.16)
-@@ -36,7 +39,6 @@ find_package(ROOT 6.00.00 REQUIRED)
-     set(VMCLIB VMCLibrary)
-   endif()
- endif()
--Set(SIMPATH $ENV{SIMPATH})
- Set(Boost_NO_SYSTEM_PATHS TRUE)
- Set(Boost_NO_BOOST_CMAKE TRUE)
- Set(BOOST_ROOT ${SIMPATH})
-diff --git a/cmake/modules/HalMacros.cmake b/cmake/modules/HalMacros.cmake
-index c48a4ca..19e60d0 100644
---- a/cmake/modules/HalMacros.cmake
-+++ b/cmake/modules/HalMacros.cmake
-@@ -8,15 +8,20 @@ Macro(SetFairBase)
-       SET(FAIRBASE ${FAIRBASE})
-     Else (FAIRBASE)
-       Message(STATUS "NOT Found FAIRBASE")
--      IF(NOT DEFINED ENV{FAIRROOTPATH})
-+      if(NOT DEFINED ENV{FAIRROOTPATH} AND NOT DEFINED FAIRROOTPATH)
-          MESSAGE(FATAL_ERROR "You did not define the environment variable FAIRROOTPATH which is needed to find FairRoot. Please set this variable and execute cmake again.")
-          SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/fair" ${CMAKE_MODULE_PATH})
-          MESSAGE(WARNING "CMP ${CMAKE_MODULE_PATH}")
--      ENDIF(NOT DEFINED ENV{FAIRROOTPATH})
--      SET(FAIRROOTPATH $ENV{FAIRROOTPATH})
-+      endif()
-+      if(NOT FAIRROOTPATH)
-+        SET(FAIRROOTPATH $ENV{FAIRROOTPATH})
-+      endif()
-+      if(NOT ENV{FAIRROOTPATH})
-+        SET(ENV{FAIRROOTPATH} ${FAIRROOTPATH})
-+      endif()
-     EndIf (FAIRBASE)
--    set(CMAKE_MODULE_PATH "$ENV{FAIRROOTPATH}/share/fairbase/cmake/modules_old" ${CMAKE_MODULE_PATH})
--    set(CMAKE_MODULE_PATH "$ENV{FAIRROOTPATH}/share/fairbase/cmake/modules"  ${CMAKE_MODULE_PATH})
-+    set(CMAKE_MODULE_PATH "${FAIRROOTPATH}/share/fairbase/cmake/modules_old" ${CMAKE_MODULE_PATH})
-+    set(CMAKE_MODULE_PATH "${FAIRROOTPATH}/share/fairbase/cmake/modules"  ${CMAKE_MODULE_PATH})
-    IF(FAIRROOTPATH)
-       Set(CheckSrcDir "${FAIRROOTPATH}/share/fairbase/cmake/checks")
-     ELSE(FAIRROOTPATH)
-diff --git a/fair/CMakeLists.txt b/fair/CMakeLists.txt
-index 266e82e..46246e6 100644
---- a/fair/CMakeLists.txt
-+++ b/fair/CMakeLists.txt
-@@ -8,8 +8,8 @@ ${HAL_CORE}/fair
- Set(SYSTEM_INCLUDE_DIRECTORIES
-  ${ROOT_INCLUDE_DIR} 
-  ${BASE_INCLUDE_DIRECTORIES}
-- $ENV{SIMPATH}/include
-- $ENV{SIMPATH}/include/vmc
-+ ${SIMPATH}/include
-+ ${SIMPATH}/include/vmc
- )
- 
- Set(LINK_DIRECTORIES