diff --git a/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.cxx b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..de9b901e3c5e5f949f5e0d362340b3b80982e5d5
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.cxx
@@ -0,0 +1,33 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#include "HalCbmReader.h"
+
+#include "HalCbmEvent.h"
+#include "HalCbmFullEvent.h"
+#include "HalCbmMCEvent.h"
+
+#include <RtypesCore.h>
+#include <TString.h>
+
+#include <Hal/StdString.h>
+
+namespace Hal
+{
+
+} /* namespace Hal */
+
+HalCbmReader::HalCbmReader(TString opt)
+{
+  if (Hal::Std::FindParam(opt, "reco", false) && Hal::Std::FindParam(opt, "mc", false)) {
+    SetFormat(new HalCbmFullEvent());
+  }
+  else if (Hal::Std::FindParam(opt, "mc", false)) {
+    SetFormat(new HalCbmMCEvent());
+  }
+  else {
+    SetFormat(new HalCbmEvent());
+  }
+}
+
+HalCbmReader::~HalCbmReader() {}
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.h b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.h
new file mode 100644
index 0000000000000000000000000000000000000000..3f1d42d337127abdeb3efb83f0fbe54e65a63bdd
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/format/HalCbmReader.h
@@ -0,0 +1,21 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+
+#ifndef CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_HALCBMREADER_H_
+#define CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_HALCBMREADER_H_
+
+#include <Hal/Reader.h>
+namespace Hal
+{
+  class EventInterface;
+}
+class HalCbmReader : public Hal::Reader {
+
+ public:
+  HalCbmReader(TString opt = "mc+reco");
+  virtual ~HalCbmReader();
+  ClassDef(HalCbmReader, 1)
+};
+
+#endif /* CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_HALCBMREADER_H_ */
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.cxx b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..ef7002bd8758ef0d04f6ff9748688595832a8a35
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.cxx
@@ -0,0 +1,195 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#include "HalCbmV0Builder.h"
+
+#include "HalCbmAnalysisManager.h"
+#include "HalCbmDetectorID.h"
+#include "HalCbmTrack.h"
+#include "HalCbmV0TempTrack.h"
+#include "HalCbmV0Track.h"
+
+#include <TClonesArray.h>
+#include <TDatabasePDG.h>
+#include <TParticlePDG.h>
+
+#include <Hal/Cout.h>
+#include <Hal/DataManager.h>
+
+namespace Hal
+{
+
+} /* namespace Hal */
+
+HalCbmV0Builder::v0rawInfo HalCbmV0Builder::Convert(const AnalysisTree::Particle& p)
+{
+  HalCbmV0Builder::v0rawInfo v0Info;
+  v0Info.chi2geo          = p.GetField<float>(fV0Container->GetFieldIds().chi2geo);
+  v0Info.chi2_prim_first  = p.GetField<float>(fV0Container->GetFieldIds().chi2_prim_first);
+  v0Info.chi2_prim_second = p.GetField<float>(fV0Container->GetFieldIds().chi2_prim_second);
+  v0Info.chi2_topo        = p.GetField<float>(fV0Container->GetFieldIds().chi2_topo);
+  v0Info.cosine_first     = p.GetField<float>(fV0Container->GetFieldIds().cosine_first);
+  v0Info.cosine_second    = p.GetField<float>(fV0Container->GetFieldIds().cosine_second);
+  v0Info.cosine_topo      = p.GetField<float>(fV0Container->GetFieldIds().cosine_topo);
+  v0Info.distance         = p.GetField<float>(fV0Container->GetFieldIds().distance);
+  v0Info.l                = p.GetField<float>(fV0Container->GetFieldIds().l);
+  v0Info.l_dl             = p.GetField<float>(fV0Container->GetFieldIds().l_over_dl);
+  v0Info.mass             = p.GetField<float>(fV0Container->GetFieldIds().mass);
+  v0Info.px               = p.GetField<float>(fV0Container->GetFieldIds().px);
+  v0Info.py               = p.GetField<float>(fV0Container->GetFieldIds().py);
+  v0Info.pz               = p.GetField<float>(fV0Container->GetFieldIds().pz);
+  v0Info.x                = p.GetField<float>(fV0Container->GetFieldIds().x);
+  v0Info.y                = p.GetField<float>(fV0Container->GetFieldIds().y);
+  v0Info.z                = p.GetField<float>(fV0Container->GetFieldIds().z);
+  v0Info.pid              = p.GetField<int>(fV0Container->GetFieldIds().pdg);
+  v0Info.dau1id           = p.GetField<int>(fV0Container->GetFieldIds().dau1id);
+  v0Info.dau2id           = p.GetField<int>(fV0Container->GetFieldIds().dau2id);
+
+#ifdef DEBUG_EXTR
+  v0Info.dau1px = p.GetField<float>(fV0Container->GetFieldIds().dau1px);
+  v0Info.dau1py = p.GetField<float>(fV0Container->GetFieldIds().dau1py);
+  v0Info.dau1pz = p.GetField<float>(fV0Container->GetFieldIds().dau1pz);
+  v0Info.dau1x  = p.GetField<float>(fV0Container->GetFieldIds().dau1x);
+  v0Info.dau1y  = p.GetField<float>(fV0Container->GetFieldIds().dau1y);
+  v0Info.dau1z  = p.GetField<float>(fV0Container->GetFieldIds().dau1z);
+
+  v0Info.dau2px = p.GetField<float>(fV0Container->GetFieldIds().dau2px);
+  v0Info.dau2py = p.GetField<float>(fV0Container->GetFieldIds().dau2py);
+  v0Info.dau2pz = p.GetField<float>(fV0Container->GetFieldIds().dau2pz);
+  v0Info.dau2x  = p.GetField<float>(fV0Container->GetFieldIds().dau2x);
+  v0Info.dau2y  = p.GetField<float>(fV0Container->GetFieldIds().dau2y);
+  v0Info.dau2z  = p.GetField<float>(fV0Container->GetFieldIds().dau2z);
+#endif
+  return v0Info;
+}
+
+HalCbmV0Builder::HalCbmV0Builder(Int_t motherPid, Int_t posdau, Int_t negdau)
+  : fPidMom(motherPid)
+  , fPidPosDau(posdau)
+  , fPidNegDau(negdau)
+{
+}
+
+HalCbmV0Builder::EInitFlag HalCbmV0Builder::Init()
+{
+  fSimContainer  = (CbmAnaTreeMcContainer*) Hal::DataManager::Instance()->GetObject(HalCbm::GetContainerName("mc"));
+  fRecoContainer = (CbmAnaTreeRecoContainer*) Hal::DataManager::Instance()->GetObject(HalCbm::GetContainerName("reco"));
+  fV0Container   = (CbmAnaTreeV0Container*) Hal::DataManager::Instance()->GetObject(HalCbm::GetContainerName("v0"));
+  auto trk       = TDatabasePDG::Instance()->GetParticle(fPidMom);
+  if (!trk) {
+    Hal::Cout::PrintInfo(Form("HalCbmV0Builder::Init cannot find selected mother PID=%i", fPidMom), Hal::EInfo::kError);
+    return EInitFlag::kERROR;
+  }
+  fMass = trk->Mass();
+  if (!fV0Container) {
+    Hal::Cout::PrintInfo("HalCbmV0Builder::Init cannot find V0 data", Hal::EInfo::kError);
+    return EInitFlag::kERROR;
+  }
+  if (!fRecoContainer) {
+    Hal::Cout::PrintInfo("HalCbmV0Builder::Init cannot find reco data", Hal::EInfo::kError);
+    return EInitFlag::kERROR;
+  }
+  fV0Temp = (TClonesArray*) Hal::DataManager::Instance()->GetObject("TempV0.");
+  if (!fV0Temp) {
+    fV0Temp = new TClonesArray("HalCbmV0TempTrack");
+    Hal::DataManager::Instance()->Register("TempV0.", "TempV0", fV0Temp, kFALSE);
+    fOwner = kTRUE;
+  }
+  return EInitFlag::kSUCCESS;
+}
+
+void HalCbmV0Builder::Exec(Option_t* /*option*/)
+{
+  auto recoCont    = fRecoContainer->GetVtxTracks();
+  auto recoMatch   = fRecoContainer->GetVtx2Sim();
+  auto sim         = fSimContainer->GetParticles();
+  int charge_field = fRecoContainer->GetFieldIds().vtx_q;
+  int nv0s         = fV0Container->GetParticles()->GetNumberOfChannels();
+  int mother_field = fSimContainer->GetFieldIds().motherId;
+  int ent          = 0;
+  if (fOwner) {
+    fV0Temp->Clear("");
+    fV0Temp->ExpandCreateFast(nv0s);
+  }
+  else {
+    ent = fV0Temp->GetEntriesFast();
+    fV0Temp->ExpandCreateFast(ent + nv0s);
+  }
+  for (int i = 0; i < nv0s; i++) {
+    auto particleV0            = fV0Container->GetParticles()->GetChannel(i);
+    auto v0struct              = Convert(particleV0);
+    auto dau1                  = recoCont->GetChannel(v0struct.dau1id);
+    auto dau2                  = recoCont->GetChannel(v0struct.dau2id);
+    int ch1                    = dau1.GetField<int>(charge_field);
+    int ch2                    = dau2.GetField<int>(charge_field);
+    AnalysisTree::Track daupos = dau1, dauneg = dau2;
+    if (ch1 < 0 && ch2 > 0) {  // daughters swap
+      daupos          = dau2;
+      dauneg          = dau1;
+      int temp        = v0struct.dau1id;
+      v0struct.dau1id = v0struct.dau2id;
+      v0struct.dau2id = temp;
+    }
+    auto v0Track = (HalCbmV0TempTrack*) fV0Temp->ConstructedAt(ent + i);
+    v0Track->GetTrack().SetVertexChi2(v0struct.chi2_topo);
+    double e = TMath::Sqrt(v0struct.px * v0struct.px + v0struct.py * v0struct.py + v0struct.pz * v0struct.pz
+                           + v0struct.mass * v0struct.mass);
+    v0Track->GetTrack().SetMomentum(v0struct.px, v0struct.py, v0struct.pz, e);
+    v0Track->GetTrack().SetDCA(v0struct.x, v0struct.y, v0struct.z);
+    int field_hit = fRecoContainer->GetFieldIds().vtx_mvdhits;
+    int field_sts = fRecoContainer->GetFieldIds().vtx_nhits;
+    v0Track->GetTrack().SetNMvdHits(daupos.GetField<int>(field_hit) + dauneg.GetField<int>(field_hit));
+    v0Track->GetTrack().SetNStsHits(daupos.GetField<int>(field_sts) + dauneg.GetField<int>(field_sts)
+                                    - daupos.GetField<int>(field_hit) - dauneg.GetField<int>(field_hit));
+    v0Track->GetV0().SetPdgDaughters(fPidPosDau, fPidNegDau);
+    v0Track->GetV0().SetPosId(v0struct.dau1id);
+    v0Track->GetV0().SetNegId(v0struct.dau2id);
+    v0Track->GetV0().SetDecLenght(v0struct.l);
+    v0Track->GetV0().SetDecDl(v0struct.l_dl);
+    v0Track->GetV0().SetDauDist(v0struct.distance);
+
+#ifdef DEBUG_EXTR
+    v0Track->GetV0().SetMomentumPos(TVector3(v0struct.dau1px, v0struct.dau1py, v0struct.dau1pz));
+    v0Track->GetV0().SetMomentumNeg(TVector3(v0struct.dau2px, v0struct.dau2py, v0struct.dau2pz));
+#else
+    v0Track->GetV0().SetMomentumPos(TVector3(daupos.GetPx(), daupos.GetPy(), daupos.GetPz()));
+    v0Track->GetV0().SetMomentumNeg(TVector3(dauneg.GetPx(), dauneg.GetPy(), dauneg.GetPz()));
+#endif
+    v0Track->GetV0().SetMcId(v0struct.pid);
+    v0Track->SetMcId(-1);
+    //mc matching
+    if (!recoMatch) continue;
+    int mc1 = recoMatch->GetMatchDirect(v0struct.dau1id);
+    int mc2 = recoMatch->GetMatchDirect(v0struct.dau2id);
+    if (fBeFriendly) {
+      if (mc1 >= 0 && mc2 >= 0) {
+        auto mctrack1 = sim->GetChannel(mc1);
+        auto mctrack2 = sim->GetChannel(mc2);
+        int mom1      = mctrack1.GetField<int>(mother_field);
+        int mom2      = mctrack2.GetField<int>(mother_field);
+        v0Track->SetMcId(mom1);
+      }
+      else if (mc1 >= 0) {
+        auto mctrack = sim->GetChannel(mc1);
+        v0Track->SetMcId(mctrack.GetField<int>(mother_field));
+      }
+      else if (mc2 >= 0) {
+        auto mctrack = sim->GetChannel(mc2);
+        v0Track->SetMcId(mctrack.GetField<int>(mother_field));
+      }
+    }
+    else {
+      if (mc1 < 0) continue;
+      if (mc2 < 0) continue;
+      auto mctrack1 = sim->GetChannel(mc1);
+      auto mctrack2 = sim->GetChannel(mc2);
+      int mom1      = mctrack1.GetField<int>(mother_field);
+      int mom2      = mctrack2.GetField<int>(mother_field);
+      if (mom1 == mom2) {
+        v0Track->SetMcId(mom1);
+      }
+    }
+  }
+}
+
+HalCbmV0Builder::~HalCbmV0Builder() {}
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.h b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.h
new file mode 100644
index 0000000000000000000000000000000000000000..bda002d0a5d9e496dd395dd8b28894a06a63a32b
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Builder.h
@@ -0,0 +1,57 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#ifndef CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_HALCBMV0BUILDER_H_
+#define CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_HALCBMV0BUILDER_H_
+
+#include "CbmAnaTreeContainer.h"
+
+#include <Hal/Task.h>
+
+class CbmAnaTreeV0Container;
+class TClonesArray;
+
+namespace AnalysisTree
+{
+  class Particle;
+}
+
+
+class HalCbmV0Builder : public Hal::Task {
+  struct v0rawInfo {
+    float chi2geo, chi2_prim_first;
+    float chi2_prim_second, chi2_topo;
+    float cosine_first, cosine_second, cosine_topo;
+    float distance, l, l_dl;
+    float mass, px, py, pz;
+    float x, y, z;
+    int dau1id, dau2id, pid, id;
+    int mcid;
+#ifdef DEBUG_EXTR
+    int dau1px, dau1py, dau1pz, dau1x, dau1y, dau1z;
+    int dau2px, dau2py, dau2pz, dau2x, dau2y, dau2z;
+#endif
+  };
+  Int_t fPidMom;
+  Int_t fPidPosDau;
+  Int_t fPidNegDau;
+  Bool_t fBeFriendly = {kFALSE};
+  Double_t fMass     = {0};
+  AnaTreeV0Ids fFields;
+  CbmAnaTreeV0Container* fV0Container     = {nullptr};
+  CbmAnaTreeRecoContainer* fRecoContainer = {nullptr};
+  CbmAnaTreeMcContainer* fSimContainer    = {nullptr};
+  TClonesArray* fV0Temp                   = {nullptr};
+  Bool_t fOwner                           = {kFALSE};
+  v0rawInfo Convert(const AnalysisTree::Particle& p);
+
+ public:
+  HalCbmV0Builder(Int_t motherPid = 3321, Int_t posdau = 2212, Int_t negdau = -211);
+  virtual EInitFlag Init();
+  void BeFriendly() { fBeFriendly = kTRUE; }
+  virtual void Exec(Option_t* option = "");
+  virtual ~HalCbmV0Builder();
+  ClassDef(HalCbmV0Builder, 1)
+};
+
+#endif /* CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_HALCBMV0BUILDER_H_ */
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.cxx b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..d66b537a3252465e2d9481138ba6b21652001b5c
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.cxx
@@ -0,0 +1,97 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#include "HalCbmV0TempTrack.h"
+
+#include <TLorentzVector.h>
+#include <TVector3.h>
+
+#include <Hal/Event.h>
+#include <Hal/ExpTrack.h>
+#include <Hal/Track.h>
+#include <Hal/V0Track.h>
+
+Double_t HalCbmV0TempTrack::GetValue(kTriggerCut val)
+{
+  switch (val) {
+    case kTriggerCut::kChi2Geo: {
+      return fV0Hidden.GetChi2geo();
+    } break;
+    case kTriggerCut::kChi2PrimFirst: {
+      return fV0Hidden.GetChi2Pos();
+    } break;
+    case kTriggerCut::kChi2PrimSecond: {
+      return fV0Hidden.GetChi2Neg();
+    } break;
+    case kTriggerCut::kChi2Topo: {
+      //return fV0Hidden.GetChi2topo();
+    } break;
+    case kTriggerCut::kCosineFirst: {
+      return fCosinePos;
+    } break;
+    case kTriggerCut::kCosineSecond: {
+      return fCosineNeg;
+    } break;
+    case kTriggerCut::kDistance: {
+      return fV0Hidden.GetChi2Pos();
+    } break;
+    case kTriggerCut::kL: {
+      return fV0Hidden.GetDecLength();
+    } break;
+    case kTriggerCut::kDl: {
+      return fV0Hidden.GetDecDl();
+    } break;
+    case kTriggerCut::kMass: {
+      return 0;
+    } break;
+    case kTriggerCut::kPt: {
+      return fRecoTrack.GetMomentum().Pt();
+    } break;
+    case kTriggerCut::kEta: {
+      return fRecoTrack.GetMomentum().Eta();
+    } break;
+    case kTriggerCut::kRxy: {
+      return fRecoTrack.GetDCA().Pt();
+    } break;
+    case kTriggerCut::kRz: {
+      return fRecoTrack.GetDCA().Z();
+    } break;
+    case kTriggerCut::kCosineTopo: {
+      return fCosineTopo;
+    } break;
+    case kTriggerCut::kPid: {
+      return fV0Hidden.GetPdg();
+    } break;
+  }
+  return 0;
+}
+
+void HalCbmV0TempTrack::ComputeStuff(Hal::Event* event, Hal::Track* assignedTrack)
+{
+  auto dau1     = (HalCbmTrack*) event->GetTrack(fV0Hidden.GetPosId());
+  auto dau2     = (HalCbmTrack*) event->GetTrack(fV0Hidden.GetNegId());
+  TVector3 vtx  = event->GetVertex()->Vect();
+  auto expTrack = (Hal::ExpTrack*) assignedTrack;
+  TVector3 pos(expTrack->GetDCA());  //or + event pos?
+  TVector3 mom(expTrack->GetPx(), expTrack->GetPy(), expTrack->GetPz());
+  auto shift = mom.Unit() * fV0Hidden.GetDecLength() + vtx;  //new position + pos gorsze wyniki
+  fV0Hidden.SetDecayPos(shift.X(), shift.Y(), shift.Z());
+  TVector3 dau1mom, dau2mom, dau1pos, dau2pos;
+  dau1pos = dau1->GetHelix().Eval(shift.Z(), dau1mom);
+  dau2pos = dau2->GetHelix().Eval(shift.Z(), dau2mom);
+#ifdef DEBUG_EXTR
+  std::cout << "DECPOS " << std::endl;
+  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;
+  };
+  print("Dau1dec", dau1pos);
+  print("Dau2dec", dau2pos);
+
+  print("Dau1vec", dau1mom);
+  print("Dau2vec", dau2mom);
+#endif
+  fV0Hidden.SetMomPos(dau1mom.X(), dau1mom.Y(), dau1mom.Z());
+  fV0Hidden.SetMomNeg(dau2mom.X(), dau2mom.Y(), dau2mom.Z());
+  fV0Hidden.Recalc(*assignedTrack);
+}
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.h b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.h
new file mode 100644
index 0000000000000000000000000000000000000000..908a7cf1ff766148e659ab2708e4f3414a8b219d
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TempTrack.h
@@ -0,0 +1,58 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#ifndef CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_V0_HALCBMV0TEMPTRACK_H_
+#define CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_V0_HALCBMV0TEMPTRACK_H_
+
+#include "HalCbmTrack.h"
+#include "HalCbmV0Track.h"
+
+#include <Rtypes.h>
+#include <RtypesCore.h>
+
+class HalCbmV0TempTrack : public TObject {
+  HalCbmV0Track fV0Hidden;
+  HalCbmTrack fRecoTrack;
+  Int_t fMcId          = {-1};  //match id
+  Double_t fCosinePos  = {0};
+  Double_t fCosineNeg  = {0};
+  Double_t fCosineTopo = {0};
+  Double_t fDl         = {0};
+
+ public:
+  enum class kTriggerCut
+  {
+    kChi2Geo        = 0,
+    kChi2PrimFirst  = 1,
+    kChi2PrimSecond = 2,
+    kChi2Topo       = 3,
+    kCosineFirst    = 4,
+    kCosineSecond   = 5,
+    kDistance       = 6,
+    kL              = 7,
+    kDl             = 8,
+    kMass           = 9,
+    kPt             = 10,
+    kEta            = 11,
+    kRxy            = 12,
+    kRz             = 13,
+    kCosineTopo     = 14,
+    kPid            = 15,
+  };
+  HalCbmV0TempTrack(){};
+  Double_t GetValue(kTriggerCut val);
+  void SetCosPos(Double_t val) { fCosinePos = val; }
+  void SetCosNeg(Double_t val) { fCosineNeg = val; }
+  void SetCosTopo(Double_t val) { fCosineTopo = val; }
+  void SetDL(Double_t val) { fDl = val; }
+  HalCbmV0Track& GetV0() { return fV0Hidden; }
+  HalCbmTrack& GetTrack() { return fRecoTrack; }
+  void ComputeStuff(Hal::Event* event,
+                    Hal::Track* assignedTrack);  //compute missing fields (not available in root trees)
+  void SetMcId(Int_t mc) { fMcId = mc; };
+  Int_t GetMcId() const { return fMcId; }
+  virtual ~HalCbmV0TempTrack(){};
+  ClassDef(HalCbmV0TempTrack, 1);
+};
+
+#endif /* CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_HELPERS_V0_HALCBMV0TEMPTRACK_H_ */
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.cxx b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..0f8c9a0ceb8c8d9bbc30cbc5c1cec4b54b497cee
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.cxx
@@ -0,0 +1,15 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#include "HalCbmV0Track.h"
+
+void HalCbmV0Track::CopyData(V0Track* v)
+{
+  Hal::V0Track::CopyData(v);
+  HalCbmV0Track* v0 = (HalCbmV0Track*) (v);
+  fMcId             = v0->fMcId;
+  fDecDl            = v0->fDecDl;
+  fChi2geo          = v0->fChi2geo;
+  fChi2First        = v0->fChi2First;
+  fChi2Second       = v0->fChi2Second;
+}
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.h b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.h
new file mode 100644
index 0000000000000000000000000000000000000000..53b45709a0c096a5bdcf17f56cc247b945fbe6c8
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0Track.h
@@ -0,0 +1,36 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#ifndef CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACK_H_
+#define CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACK_H_
+
+#include <Hal/V0Track.h>
+
+class HalCbmV0Track : public Hal::V0Track {
+  Int_t fMcId         = {-1};
+  Float_t fDecDl      = {0};
+  Float_t fChi2geo    = {0};
+  Float_t fChi2First  = {0};
+  Float_t fChi2Second = {0};
+
+ public:
+  HalCbmV0Track(){};
+  virtual ~HalCbmV0Track() {}
+  virtual void CopyData(V0Track* v);
+  void SetChi2geo(Float_t Chi2geo) { fChi2geo = Chi2geo; }
+  void SetDecDl(Float_t DecDl) { fDecDl = DecDl; }
+  void SetMcId(Int_t McId) { fMcId = McId; }
+  void SetChi2Dau(Double_t pos, Double_t neg)
+  {
+    fChi2First  = pos;
+    fChi2Second = neg;
+  }
+  Float_t GetChi2geo() const { return fChi2geo; }
+  Float_t GetDecDl() const { return fDecDl; }
+  Float_t GetChi2Pos() const { return fChi2First; }
+  Float_t GetChi2Neg() const { return fChi2Second; }
+  Int_t GetMcId() const { return fMcId; };
+  ClassDef(HalCbmV0Track, 1)
+};
+
+#endif /* CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACK_H_ */
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.cxx b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..4f0d1ce15f966ead2708608868257090f229884d
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.cxx
@@ -0,0 +1,8 @@
+/* Copyright (C) 2025-2025 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+#include "HalCbmV0TrackTrigger.h"
+
+HalCbmV0TrackTrigger::HalCbmV0TrackTrigger() {}
+
+Bool_t HalCbmV0TrackTrigger::Pass(HalCbmV0TempTrack& /*tr*/) { return kTRUE; }
diff --git a/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.h b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.h
new file mode 100644
index 0000000000000000000000000000000000000000..6ee3cb22662a8993a412f641e3689a4b336d5464
--- /dev/null
+++ b/analysis/PWGC2F/femtoscopy/hal/format/v0/HalCbmV0TrackTrigger.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] */
+//TODO complete this class
+
+#ifndef CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACKTRIGGER_H_
+#define CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACKTRIGGER_H_
+
+#include "HalCbmV0TempTrack.h"
+
+#include <TObject.h>
+class HalCbmV0TrackTrigger : public TObject {
+  Double_t fMin[16];
+  Double_t fMax[16];
+
+  void SetCut(Double_t lo, Double_t hi, HalCbmV0TempTrack::kTriggerCut pos)
+  {
+    int poz   = static_cast<int>(pos);
+    fMin[poz] = lo;
+    fMax[poz] = hi;
+  }
+
+ public:
+  HalCbmV0TrackTrigger();
+  void SetChi2GeoCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kChi2Geo); }
+  void SetChi2PosDauCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kChi2PrimFirst); }
+  void SetChi2NegDauCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kChi2PrimSecond); }
+  void SetChi2TopoCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kChi2Topo); }
+  void SetCosTopoCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kCosineTopo); }
+
+  void SetCosPosDauCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kCosineFirst); }
+  void SetCosNegDauCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kCosineSecond); }
+  void SetDauDistCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kDistance); }
+  void SetDecLenCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kL); }
+  void SetDeltaDecLenCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kDl); }
+
+  void SetMassCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kMass); }
+  void SetPtCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kPt); }
+  void SetEtaCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kEta); }
+  void SetDCAxyCut(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kRxy); }
+  void SetDCAz(Double_t lo, Double_t hi) { SetCut(lo, hi, HalCbmV0TempTrack::kTriggerCut::kRz); }
+
+  Bool_t Pass(HalCbmV0TempTrack& tr);
+  virtual ~HalCbmV0TrackTrigger(){};
+  ClassDef(HalCbmV0TrackTrigger, 1)
+};
+
+#endif /* CBMROOT_V0_ANALYSIS_PWGC2F_FEMTOSCOPY_HAL_FORMAT_V0_HALCBMV0TRACKTRIGGER_H_ */
diff --git a/macro/analysis/cbmfemto/hbt_common.C b/macro/analysis/cbmfemto/hbt_common.C
index 8b1dfd39727790e8ffb5daa421ee7cf4d71f3950..5bd556bfd06e7d0e0a2ef4aec8c71c9ccd7b5c62 100644
--- a/macro/analysis/cbmfemto/hbt_common.C
+++ b/macro/analysis/cbmfemto/hbt_common.C
@@ -94,12 +94,12 @@ Hal::FemtoBasicAna* MakeAna(Bool_t speedUp)
        * speed up analysis by using compression and special HBT format
        * the sts exit distance and phi* are calculated once per track
        */
-    task->SetFormat(new HalCbmFullEvent(), Hal::EFormatDepth::kNonBuffered);
+    // task->SetFormat(new HalCbmFullEvent(), Hal::EFormatDepth::kNonBuffered);
     task->SetFormat(new HalCbmHbtFullEvent(), Hal::EFormatDepth::kBuffered);
     task->SetFormatOption(Hal::EventAna::EFormatOption::kCompress);
   }
   else {
-    task->SetFormat(new HalCbmFullEvent());
+    //task->SetFormat(new HalCbmFullEvent());
   }
   SetEventCut(task);
   SetTrackCuts(task);
diff --git a/macro/analysis/cbmfemto/hbt_v0.C b/macro/analysis/cbmfemto/hbt_v0.C
new file mode 100644
index 0000000000000000000000000000000000000000..cc9d2e742f138200ebc05bb9e59b3cca3b64bb17
--- /dev/null
+++ b/macro/analysis/cbmfemto/hbt_v0.C
@@ -0,0 +1,83 @@
+/* Copyright (C) 2023-2023 Warsaw University of Technology, Warsaw
+    SPDX-License-Identifier: GPL-3.0-only
+    Authors: Daniel Wielanek [committer] */
+
+#ifndef __CLING__
+#include "CbmAnaTreeSource.h"
+#include "CbmFieldMap.h"
+#include "FairFileSource.h"
+#include "FairParRootFileIo.h"
+#include "FemtoBasicAna.h"
+#include "HalCbmAnalysisManager.h"
+#include "HalCbmReader.h"
+#include "HalCbmSource.h"
+#include "HalCbmV0Builder.h"
+#include "TFile.h"
+#include "data/CbmDefs.h"
+
+#include <FairLogger.h>
+#include <FairRun.h>
+#include <FairRunAna.h>
+
+#include <RtypesCore.h>
+#include <TStopwatch.h>
+#include <TString.h>
+#include <TTimer.h>
+
+#include <cstdio>
+#include <iostream>
+
+#include <Hal/AnalysisManager.h>
+#include <Hal/DataFormat.h>
+#include <Hal/PropertyMonitorX.h>
+#include <Hal/PropertyMonitorXY.h>
+#include <Hal/Source.h>
+
+
+using namespace std;
+#endif
+#include "hbt_common.C"
+
+#define KRONOS
+
+/**
+ * analysis macro done via FairRoot
+ * @param task
+ */
+
+void hbt_v0(TString inFile = "3000.analysistree.root", TString outFile = "test2.root")
+{
+  HalCbmAnalysisManager* manager = new HalCbmAnalysisManager();
+  auto source                    = new HalCbmSource(inFile);
+  source->AddFriend("v0.root");
+  manager->SetSource(source);
+  manager->SetOutput(outFile);
+
+  HalCbmV0Builder* v0 =
+    new HalCbmV0Builder(Hal::Const::LambdaPID(), Hal::Const::ProtonPID(), -Hal::Const::PionPlusPID());
+
+  manager->AddTask(v0);
+
+  auto reader = new HalCbmReader();
+  manager->AddTask(reader);
+
+  Hal::FemtoBasicAna* task = MakeAna(kTRUE);
+  task->SetPdg(Hal::Const::LambdaPID());  //switch to lambda PID
+
+
+  Hal::TrackFieldMonitorXY armenteros(Hal::DataFieldID::Track::EV0::kAlphaArm, Hal::DataFieldID::Track::EV0::kPtArm);
+  armenteros.SetXaxis(200, -1, 1);
+  armenteros.SetYaxis(200, 0, 1);
+  task->AddCutMonitor(armenteros);
+
+
+  manager->AddTask(task);
+
+  TStopwatch timer;
+  timer.Start();
+
+  manager->Init();
+  manager->Run(0, 1000);
+  Double_t rtime = timer.RealTime(), ctime = timer.CpuTime();
+  printf("RealTime=%f seconds, CpuTime=%f seconds\n", rtime, ctime);
+}