diff --git a/algo/ca/core/CMakeLists.txt b/algo/ca/core/CMakeLists.txt
index 14f9e0306fb7cd6793710c5699fc625c55a20003..513e8138405569f2e9b32f9b74670be352625a16 100644
--- a/algo/ca/core/CMakeLists.txt
+++ b/algo/ca/core/CMakeLists.txt
@@ -31,7 +31,6 @@ set(SRCS
   ${CMAKE_CURRENT_SOURCE_DIR}/tracking/CaTrackExtender.cxx
   ${CMAKE_CURRENT_SOURCE_DIR}/tracking/CaTrackFinder.cxx
   ${CMAKE_CURRENT_SOURCE_DIR}/tracking/CaTrackFinderWindow.cxx
-  ${CMAKE_CURRENT_SOURCE_DIR}/tracking/CaTrackFit.cxx
   ${CMAKE_CURRENT_SOURCE_DIR}/tracking/CaTrackFitter.cxx
   ${CMAKE_CURRENT_SOURCE_DIR}/tracking/CaTripletConstructor.cxx
 )
@@ -115,7 +114,6 @@ install(
     tracking/CaTrackExtender.h
     tracking/CaTrackFinder.h
     tracking/CaTrackFinderWindow.h
-    tracking/CaTrackFit.h
     tracking/CaTrackFitter.h
     tracking/CaTripletConstructor.h   
   DESTINATION
diff --git a/algo/ca/core/tracking/CaCloneMerger.cxx b/algo/ca/core/tracking/CaCloneMerger.cxx
index 40884abbc410b16ee373d53c1c417d72405184cf..cfc7404ef6dc3080918db70b000fc3a192acc00a 100644
--- a/algo/ca/core/tracking/CaCloneMerger.cxx
+++ b/algo/ca/core/tracking/CaCloneMerger.cxx
@@ -12,8 +12,8 @@
 #include "CaFramework.h"
 #include "CaParameters.h"
 #include "CaTrack.h"
-#include "CaTrackFit.h"
 #include "CaVector.h"
+#include "KfTrackKalmanFilter.h"
 
 #include <iostream>
 
@@ -80,12 +80,12 @@ void CloneMerger::Exec(const ca::InputData& input, WindowData& wData)
     isDownstreamNeighbour[iTr] = false;
   }
 
-  ca::TrackFit<fvec> fitB;
+  kf::TrackKalmanFilter<fvec> fitB;
   fitB.SetParticleMass(fDefaultMass);
   fitB.SetMask(fmask::One());
   fitB.SetQp0(fvec(0.));
 
-  ca::TrackFit<fvec> fitF;
+  kf::TrackKalmanFilter<fvec> fitF;
   fitF.SetParticleMass(fDefaultMass);
   fitF.SetMask(fmask::One());
   fitF.SetQp0(fvec(0.));
diff --git a/algo/ca/core/tracking/CaTrackExtender.cxx b/algo/ca/core/tracking/CaTrackExtender.cxx
index e9e8138facad5cb4346fbb6cba1f3c040919b728..7ce4d5565a515ff1aaee9091af2f5026a5449367 100644
--- a/algo/ca/core/tracking/CaTrackExtender.cxx
+++ b/algo/ca/core/tracking/CaTrackExtender.cxx
@@ -11,9 +11,9 @@
 #include "CaGridArea.h"
 #include "CaInputData.h"
 #include "CaTrack.h"
-#include "CaTrackFit.h"
 #include "CaUtils.h"
 #include "CaVector.h"
+#include "KfTrackKalmanFilter.h"
 #include "KfTrackParam.h"
 
 #include <iostream>
@@ -37,12 +37,12 @@ TrackExtender::~TrackExtender() {}
 // ---------------------------------------------------------------------------------------------------------------------
 //
 
-void TrackExtender::FitBranchFast(const ca::Branch& t, TrackParamV& Tout, const FitDirection direction, const fvec qp0,
-                                  const bool initParams)
+void TrackExtender::FitBranchFast(const ca::Branch& t, TrackParamV& Tout, const kf::FitDirection direction,
+                                  const fvec qp0, const bool initParams)
 {
   CBMCA_DEBUG_ASSERT(t.NHits >= 3);
 
-  ca::TrackFit<fvec> fit;
+  kf::TrackKalmanFilter<fvec> fit;
   fit.SetParticleMass(fDefaultMass);
   fit.SetMask(fmask::One());
   fit.SetTrack(Tout);
@@ -52,9 +52,9 @@ void TrackExtender::FitBranchFast(const ca::Branch& t, TrackParamV& Tout, const
   const Vector<ca::HitIndex_t>& hits = t.Hits();  // array of indeses of hits of current track
   const int nHits                    = t.NofHits();
 
-  const signed short int step = (direction == FitDirection::kUpstream ? -1 : 1);  // increment for station index
-  const int iFirstHit         = (direction == FitDirection::kUpstream) ? nHits - 1 : 0;
-  const int iLastHit          = (direction == FitDirection::kUpstream) ? 0 : nHits - 1;
+  const signed short int step = (direction == kf::FitDirection::kUpstream ? -1 : 1);  // increment for station index
+  const int iFirstHit         = (direction == kf::FitDirection::kUpstream) ? nHits - 1 : 0;
+  const int iLastHit          = (direction == kf::FitDirection::kUpstream) ? 0 : nHits - 1;
 
   const ca::Hit& hit0 = frWData->Hit(hits[iFirstHit]);
   const ca::Hit& hit1 = frWData->Hit(hits[iFirstHit + step]);
@@ -137,7 +137,7 @@ void TrackExtender::FitBranchFast(const ca::Branch& t, TrackParamV& Tout, const
 }  // void ca::Framework::BranchFitterFast
 
 /// like BranchFitterFast but more precise
-void TrackExtender::FitBranch(const ca::Branch& t, TrackParamV& T, const FitDirection direction, const fvec qp0,
+void TrackExtender::FitBranch(const ca::Branch& t, TrackParamV& T, const kf::FitDirection direction, const fvec qp0,
                               const bool initParams)
 {
   FitBranchFast(t, T, direction, qp0, initParams);
@@ -148,19 +148,19 @@ void TrackExtender::FitBranch(const ca::Branch& t, TrackParamV& T, const FitDire
 }  // void ca::Framework::BranchFitter
 
 
-void TrackExtender::FindMoreHits(ca::Branch& t, TrackParamV& Tout, const FitDirection direction, const fvec qp0)
+void TrackExtender::FindMoreHits(ca::Branch& t, TrackParamV& Tout, const kf::FitDirection direction, const fvec qp0)
 {
   Vector<ca::HitIndex_t> newHits{"ca::TrackExtender::newHits"};
   newHits.reserve(fParameters.GetNstationsActive());
 
-  ca::TrackFit<fvec> fit;
+  kf::TrackKalmanFilter<fvec> fit;
   fit.SetParticleMass(fDefaultMass);
   fit.SetMask(fmask::One());
   fit.SetTrack(Tout);
   fit.SetQp0(qp0);
 
-  const signed short int step = (direction == FitDirection::kUpstream) ? -1 : 1;  // increment for station index
-  const int iFirstHit         = (direction == FitDirection::kUpstream) ? 2 : t.NofHits() - 3;
+  const signed short int step = (direction == kf::FitDirection::kUpstream) ? -1 : 1;  // increment for station index
+  const int iFirstHit         = (direction == kf::FitDirection::kUpstream) ? 2 : t.NofHits() - 3;
   //  int ista = fInputData->GetHit(t.Hits[iFirstHit]).iSt + 2 * step; // current station. set to the end of track
 
   const ca::Hit& hit0 = frWData->Hit(t.Hits()[iFirstHit]);  // optimize
@@ -290,7 +290,7 @@ void TrackExtender::FindMoreHits(ca::Branch& t, TrackParamV& Tout, const FitDire
   const unsigned int NNewHits = newHits.size();
   t.RefHits().enlarge(NNewHits + NOldHits);
 
-  if (direction == FitDirection::kUpstream) {
+  if (direction == kf::FitDirection::kUpstream) {
     for (int i = NOldHits - 1; i >= 0; i--) {
       t.RefHits()[NNewHits + i] = t.RefHits()[i];
     }
@@ -318,13 +318,13 @@ fscal TrackExtender::ExtendBranch(ca::Branch& t, WindowData& wData)
 
   // downstream
 
-  FitBranch(t, T, FitDirection::kDownstream, 0.0);
-  FindMoreHits(t, T, FitDirection::kDownstream, T.Qp());
+  FitBranch(t, T, kf::FitDirection::kDownstream, 0.0);
+  FindMoreHits(t, T, kf::FitDirection::kDownstream, T.Qp());
 
   // upstream
 
-  FitBranchFast(t, T, FitDirection::kUpstream, T.Qp(), false);
-  FindMoreHits(t, T, FitDirection::kUpstream, T.Qp());
+  FitBranchFast(t, T, kf::FitDirection::kUpstream, T.Qp(), false);
+  FindMoreHits(t, T, kf::FitDirection::kUpstream, T.Qp());
 
   return T.GetChiSq()[0];
 }
diff --git a/algo/ca/core/tracking/CaTrackExtender.h b/algo/ca/core/tracking/CaTrackExtender.h
index 48260c0b8432ffd142c0d41ede908dfcb67a118f..0fa6f0562fa3dced3aa2d7c470cb6fa64d7dd0cc 100644
--- a/algo/ca/core/tracking/CaTrackExtender.h
+++ b/algo/ca/core/tracking/CaTrackExtender.h
@@ -13,9 +13,9 @@
 #include "CaHit.h"
 #include "CaParameters.h"
 #include "CaSimd.h"
-#include "CaTrackFit.h"
 #include "CaVector.h"
 #include "CaWindowData.h"
+#include "KfTrackKalmanFilter.h"
 #include "KfTrackParam.h"
 
 namespace cbm::algo::ca
@@ -62,7 +62,7 @@ namespace cbm::algo::ca
     /// \param T - track params
     /// \param dir - 0 - forward, 1 - backward
     /// \param qp0 - momentum value to linearize the extrapolation
-    void FindMoreHits(ca::Branch& t, TrackParamV& T, const FitDirection direction, const fvec qp0);
+    void FindMoreHits(ca::Branch& t, TrackParamV& T, const kf::FitDirection direction, const fvec qp0);
 
     /// Fits the branch. Does few passes over the hits.
     /// \param t - track branch with hits
@@ -70,7 +70,7 @@ namespace cbm::algo::ca
     /// \param dir - false - forward, true - backward
     /// \param qp0 - momentum value to linearize the extrapolation
     /// \param initParams - should params be ititialized. 1 - yes.
-    void FitBranch(const ca::Branch& t, TrackParamV& T, const FitDirection direction, const fvec qp0,
+    void FitBranch(const ca::Branch& t, TrackParamV& T, const kf::FitDirection direction, const fvec qp0,
                    const bool initParams = true);
 
 
@@ -80,7 +80,7 @@ namespace cbm::algo::ca
     /// \param dir - false - forward, true - backward
     /// \param qp0 - momentum value to linearize the extrapolation
     /// \param initParams - should params be ititialized. 1 - yes.
-    void FitBranchFast(const ca::Branch& t, TrackParamV& T, const FitDirection direction, const fvec qp0,
+    void FitBranchFast(const ca::Branch& t, TrackParamV& T, const kf::FitDirection direction, const fvec qp0,
                        const bool initParams = true);
 
    private:
diff --git a/algo/ca/core/tracking/CaTrackFitter.cxx b/algo/ca/core/tracking/CaTrackFitter.cxx
index a52a20986333058ded5fcc6d62d35ed5f6ee4830..1a2005d68318861e68c828ae519d89fd115985f2 100644
--- a/algo/ca/core/tracking/CaTrackFitter.cxx
+++ b/algo/ca/core/tracking/CaTrackFitter.cxx
@@ -5,7 +5,7 @@
 #include "CaTrackFitter.h"
 
 #include "CaFramework.h"
-#include "CaTrackFit.h"
+#include "KfTrackKalmanFilter.h"
 #include "KfTrackParam.h"
 
 #include <iostream>
@@ -50,7 +50,7 @@ void TrackFitter::FitCaTracks(const ca::InputData& input, WindowData& wData)
   const int nStations = fParameters.GetNstationsActive();
   int nTracks_SIMD    = fvec::size();
 
-  ca::TrackFit<fvec> fit;  // fit parameters coresponding to the current track
+  kf::TrackKalmanFilter<fvec> fit;  // fit parameters coresponding to the current track
   TrackParamV& tr = fit.Tr();
   fit.SetParticleMass(fDefaultMass);
   fit.SetDoFitVelocity(true);
@@ -263,7 +263,7 @@ void TrackFitter::FitCaTracks(const ca::InputData& input, WindowData& wData)
         fit.SetMask(initialised);
         fit.Extrapolate(z[ista], fld1);
         fit.MultipleScattering(fParameters.GetMaterialThickness(ista, tr.X(), tr.Y()));
-        fit.EnergyLossCorrection(fParameters.GetMaterialThickness(ista, tr.X(), tr.Y()), FitDirection::kUpstream);
+        fit.EnergyLossCorrection(fParameters.GetMaterialThickness(ista, tr.X(), tr.Y()), kf::FitDirection::kUpstream);
 
         fit.SetMask(initialised && w[ista]);
         fit.FilterXY(mxy[ista]);
@@ -278,7 +278,7 @@ void TrackFitter::FitCaTracks(const ca::InputData& input, WindowData& wData)
 
       // extrapolate to the PV region
 
-      ca::TrackFit fitpv = fit;
+      kf::TrackKalmanFilter fitpv = fit;
       {
         fitpv.SetMask(fmask::One());
 
@@ -366,7 +366,7 @@ void TrackFitter::FitCaTracks(const ca::InputData& input, WindowData& wData)
         fit.SetMask(initialised);
         fit.Extrapolate(z[ista], fld);
         fit.MultipleScattering(fParameters.GetMaterialThickness(ista, tr.X(), tr.Y()));
-        fit.EnergyLossCorrection(fParameters.GetMaterialThickness(ista, tr.X(), tr.Y()), FitDirection::kDownstream);
+        fit.EnergyLossCorrection(fParameters.GetMaterialThickness(ista, tr.X(), tr.Y()), kf::FitDirection::kDownstream);
         fit.SetMask(initialised && w[ista]);
         fit.FilterXY(mxy[ista]);
         fit.FilterTime(time[ista], dt2[ista], fmask(sta[ista].timeInfo));
diff --git a/algo/ca/core/tracking/CaTripletConstructor.cxx b/algo/ca/core/tracking/CaTripletConstructor.cxx
index 43bfdfee01ec0a5834b63567bb1486c6db1ca46e..cc1b935b8640cca7c0d13bfd1660a143b6b26605 100644
--- a/algo/ca/core/tracking/CaTripletConstructor.cxx
+++ b/algo/ca/core/tracking/CaTripletConstructor.cxx
@@ -12,7 +12,7 @@
 #include <iostream>
 // #include "CaToolsDebugger.h"
 #include "AlgoFairloggerCompat.h"
-#include "CaTrackFit.h"
+#include "KfTrackKalmanFilter.h"
 #include "KfTrackParam.h"
 
 // using cbm::ca::tools::Debugger;
@@ -91,7 +91,7 @@ void TripletConstructor::CreateTripletsForHit(Vector<ca::Triplet>& tripletsOut,
     return;
   }
 
-  ca::TrackFit<fvec> fit(fmask::One(), true);
+  kf::TrackKalmanFilter<fvec> fit(fmask::One(), true);
   fit.SetParticleMass(frWData.CurrentIteration()->GetElectronFlag() ? constants::phys::ElectronMass : fDefaultMass);
   fit.SetQp0(frWData.CurrentIteration()->GetMaxQp());
 
@@ -190,7 +190,7 @@ void TripletConstructor::CreateTripletsForHit(Vector<ca::Triplet>& tripletsOut,
 }
 
 
-void TripletConstructor::FindDoublets(ca::TrackFit<fvec>& fit)
+void TripletConstructor::FindDoublets(kf::TrackKalmanFilter<fvec>& fit)
 {
   // ---- Add the middle hits to parameters estimation ----
   Vector<TrackParamV>& tracks   = fDoubletData.first;
@@ -293,7 +293,7 @@ void TripletConstructor::FindTripletHits()
 
   /// Add the middle hits to parameters estimation. Propagate to right station.
   /// Find the triplets(right hit). Reformat data in the portion of triplets.
-  ca::TrackFit<fvec> fit(fmask::One(), true);
+  kf::TrackKalmanFilter<fvec> fit(fmask::One(), true);
   fit.SetParticleMass(frWData.CurrentIteration()->GetElectronFlag() ? constants::phys::ElectronMass : fDefaultMass);
   fit.SetQp0(fvec(0.));
 
@@ -428,7 +428,7 @@ void TripletConstructor::FindTriplets()
     //  "triplets", "ev:iter:i0:x0:y0:z0:i1:x1:y1:z1:i2:x2:y2:z2:mc:sta:p:vx:vy:vz:chi2:ndf:chi2time:ndfTime");
   }
 
-  ca::TrackFit<fvec> fit;
+  kf::TrackKalmanFilter<fvec> fit;
   fit.SetMask(fmask::One());
   fit.SetParticleMass(frWData.CurrentIteration()->GetElectronFlag() ? constants::phys::ElectronMass : fDefaultMass);
 
@@ -508,7 +508,7 @@ void TripletConstructor::FindTriplets()
     // repeat several times in order to improve the precision
     for (int iiter = 0; iiter < nIterations; ++iiter) {
 
-      auto fitTrack = [&](int startIdx, int endIdx, int step, FitDirection direction) {
+      auto fitTrack = [&](int startIdx, int endIdx, int step, kf::FitDirection direction) {
         const fvec maxQp = frWData.CurrentIteration()->GetMaxQp();
         fit.SetQp0(T.Qp());
         fit.Qp0()(fit.Qp0() > maxQp)  = maxQp;
@@ -545,12 +545,12 @@ void TripletConstructor::FindTriplets()
       };
 
       // Fit downstream
-      fitTrack(0, NHits, 1, FitDirection::kDownstream);
+      fitTrack(0, NHits, 1, kf::FitDirection::kDownstream);
 
       if (iiter == nIterations - 1) break;
 
       // Fit upstream
-      fitTrack(NHits - 1, -1, -1, FitDirection::kUpstream);
+      fitTrack(NHits - 1, -1, -1, kf::FitDirection::kUpstream);
     }  // for iiter
 
     tracks.push_back(T);
@@ -641,8 +641,8 @@ void TripletConstructor::SelectTriplets(Vector<ca::Triplet>& tripletsOut)
 }
 
 
-void TripletConstructor::CollectHits(Vector<ca::HitIndex_t>& collectedHits, ca::TrackFit<fvec>& fit, const int iSta,
-                                     const double chi2Cut, const int iMC, const int maxNhits)
+void TripletConstructor::CollectHits(Vector<ca::HitIndex_t>& collectedHits, kf::TrackKalmanFilter<fvec>& fit,
+                                     const int iSta, const double chi2Cut, const int iMC, const int maxNhits)
 {
   /// Collect hits on a station
   collectedHits.clear();
@@ -739,7 +739,7 @@ void TripletConstructor::CollectHits(Vector<ca::HitIndex_t>& collectedHits, ca::
     kf::MeasurementXy<fvec> mxy(hit.X(), hit.Y(), hit.dX2(), hit.dY2(), hit.dXY(), fvec::One(), fvec::One());
 
     const fvec C10            = fit.ExtrapolateLineDxy(z);
-    const auto [chi2x, chi2u] = ca::TrackFit<fvec>::GetChi2XChi2U(mxy, x, y, C00, C10, C11);
+    const auto [chi2x, chi2u] = kf::TrackKalmanFilter<fvec>::GetChi2XChi2U(mxy, x, y, C00, C10, C11);
 
     // TODO: adjust the cut, cut on chi2x & chi2u separately
     if (!frWData.CurrentIteration()->GetTrackFromTripletsFlag()) {
diff --git a/algo/ca/core/tracking/CaTripletConstructor.h b/algo/ca/core/tracking/CaTripletConstructor.h
index d01931491bc02036596d1b9dfb598193df78e9a6..eddba821f1c1c7a66ed2210d3f40c87917fb1459 100644
--- a/algo/ca/core/tracking/CaTripletConstructor.h
+++ b/algo/ca/core/tracking/CaTripletConstructor.h
@@ -11,12 +11,12 @@
 #include "CaFramework.h"
 #include "CaGridEntry.h"
 #include "CaStation.h"
-#include "CaTrackFit.h"
 #include "CaTriplet.h"
 #include "CaVector.h"
 #include "CaWindowData.h"
 #include "KfFieldRegion.h"
 #include "KfSimd.h"
+#include "KfTrackKalmanFilter.h"
 #include "KfTrackParam.h"
 
 namespace cbm::algo::ca
@@ -59,7 +59,7 @@ namespace cbm::algo::ca
     bool InitStations(int istal, int istam, int istar);
 
     /// Find the doublets. Reformat data in the portion of doublets.
-    void FindDoublets(ca::TrackFit<fvec>& fit);
+    void FindDoublets(kf::TrackKalmanFilter<fvec>& fit);
 
     /// Add the middle hits to parameters estimation. Propagate to right station.
     /// Find the triplets (right hit). Reformat data in the portion of triplets.
@@ -71,7 +71,7 @@ namespace cbm::algo::ca
     /// Select good triplets.
     void SelectTriplets(Vector<ca::Triplet>& tripletsOut);
 
-    void CollectHits(Vector<ca::HitIndex_t>& collectedHits, ca::TrackFit<fvec>& fit, const int iSta,
+    void CollectHits(Vector<ca::HitIndex_t>& collectedHits, kf::TrackKalmanFilter<fvec>& fit, const int iSta,
                      const double chi2Cut, const int iMC, const int maxNhits);
 
    private:
diff --git a/algo/ca/core/utils/CaUtils.h b/algo/ca/core/utils/CaUtils.h
index 2334616ab778f425aedd8231cfd52b40c76b9a2d..29ca44a7880db82eccab98ee2d973b85c38e520a 100644
--- a/algo/ca/core/utils/CaUtils.h
+++ b/algo/ca/core/utils/CaUtils.h
@@ -10,18 +10,18 @@
 #pragma once  // include this header only once per compilation unit
 
 #include "CaHit.h"
-#include "CaTrackFit.h"
 #include "KfDefs.h"
 #include "KfMeasurementTime.h"
 #include "KfMeasurementXy.h"
 #include "KfSimd.h"
+#include "KfTrackKalmanFilter.h"
 
 
 namespace cbm::algo::ca::utils
 {
 
   template<typename T>
-  inline void FilterHit(ca::TrackFit<T>& fit, const ca::Hit& hit, const kf::utils::masktype<T>& timeInfo)
+  inline void FilterHit(kf::TrackKalmanFilter<T>& fit, const ca::Hit& hit, const kf::utils::masktype<T>& timeInfo)
   {
     kf::MeasurementXy<T> m;
     m.SetDx2(hit.dX2());
diff --git a/algo/kf/core/CMakeLists.txt b/algo/kf/core/CMakeLists.txt
index 1d6b40765e648df11add2bc32704c93ca3a8f7bc..ad1a50b2638ebc263638762f1e2b3a54af034160 100644
--- a/algo/kf/core/CMakeLists.txt
+++ b/algo/kf/core/CMakeLists.txt
@@ -9,6 +9,7 @@ set(INCLUDE_DIRECTORIES
 
 set(SRCS 
   ${CMAKE_CURRENT_SOURCE_DIR}/KfFramework.cxx
+  ${CMAKE_CURRENT_SOURCE_DIR}/KfTrackKalmanFilter.cxx
   ${CMAKE_CURRENT_SOURCE_DIR}/data/KfTrackParam.cxx
   ${CMAKE_CURRENT_SOURCE_DIR}/data/KfMeasurementU.cxx
   ${CMAKE_CURRENT_SOURCE_DIR}/data/KfMeasurementXy.cxx
@@ -70,10 +71,13 @@ install(
   FILES
     KfFramework.h
     KfDefs.h
+    KfTrackKalmanFilter.h
+
     data/KfTrackParam.h
     data/KfMeasurementU.h
     data/KfMeasurementXy.h
     data/KfMeasurementTime.h
+
     geo/KfField.h
     geo/KfFieldRegion.h
     geo/KfFieldSlice.h
@@ -83,13 +87,16 @@ install(
     geo/KfSetupInitializer.h
     geo/KfTarget.h
     geo/KfField.h
+
     pars/KfParticlePDG.h
+
     utils/KfVector.h
     utils/KfSimd.h
     utils/KfSimdVc.h 
     utils/KfSimdPseudo.h
     utils/KfUtils.h
     utils/KfMath.h
-  DESTINATION
+
+    DESTINATION
     include/
 )
diff --git a/algo/ca/core/tracking/CaTrackFit.cxx b/algo/kf/core/KfTrackKalmanFilter.cxx
similarity index 92%
rename from algo/ca/core/tracking/CaTrackFit.cxx
rename to algo/kf/core/KfTrackKalmanFilter.cxx
index f79e4fdb7e65138d4113383e9d234acaac4d51c9..f9bdb65f257a85338e1a043eb0c2b88ec3e73a62 100644
--- a/algo/ca/core/tracking/CaTrackFit.cxx
+++ b/algo/kf/core/KfTrackKalmanFilter.cxx
@@ -2,16 +2,16 @@
    SPDX-License-Identifier: GPL-3.0-only
    Authors: Maksym Zyzak [committer], Valentina Akishina */
 
-#include "CaTrackFit.h"
+#include "KfTrackKalmanFilter.h"
 
 #include "KfMeasurementU.h"
 #include "KfMeasurementXy.h"
 
-namespace cbm::algo::ca
+namespace cbm::algo::kf
 {
 
   template<typename DataT>
-  void TrackFit<DataT>::Filter1d(const kf::MeasurementU<DataT>& m)
+  void TrackKalmanFilter<DataT>::Filter1d(const kf::MeasurementU<DataT>& m)
   {
     DataT zeta, HCH;
     DataT F0, F1, F2, F3, F4, F5, F6;
@@ -101,7 +101,7 @@ namespace cbm::algo::ca
   }
 
   template<typename DataT>
-  void TrackFit<DataT>::FilterTime(DataT t, DataT dt2, const DataTmask& timeInfo)
+  void TrackKalmanFilter<DataT>::FilterTime(DataT t, DataT dt2, const DataTmask& timeInfo)
   {
     // filter track with a time measurement
 
@@ -185,7 +185,7 @@ namespace cbm::algo::ca
 
 
   template<typename DataT>
-  void TrackFit<DataT>::FilterXY(const kf::MeasurementXy<DataT>& mxy, bool skipUnmeasuredCoordinates)
+  void TrackKalmanFilter<DataT>::FilterXY(const kf::MeasurementXy<DataT>& mxy, bool skipUnmeasuredCoordinates)
   {
     {
       kf::MeasurementU<DataT> mx;
@@ -326,9 +326,10 @@ namespace cbm::algo::ca
   }
 
   template<typename DataT>
-  void TrackFit<DataT>::FilterExtrapolatedXY(const kf::MeasurementXy<DataT>& m, DataT extrX, DataT extrY,
-                                             const std::array<DataT, kf::TrackParamBase<DataT>::kNtrackParam>& Jx,
-                                             const std::array<DataT, kf::TrackParamBase<DataT>::kNtrackParam>& Jy)
+  void
+  TrackKalmanFilter<DataT>::FilterExtrapolatedXY(const kf::MeasurementXy<DataT>& m, DataT extrX, DataT extrY,
+                                                 const std::array<DataT, kf::TrackParamBase<DataT>::kNtrackParam>& Jx,
+                                                 const std::array<DataT, kf::TrackParamBase<DataT>::kNtrackParam>& Jy)
   {
     // add a 2-D measurenent (x,y) at some z, that differs from fTr.GetZ()
     // extrX, extrY are extrapolated track parameters at z, Jx, Jy are derivatives of the extrapolation
@@ -411,7 +412,7 @@ namespace cbm::algo::ca
 
 
   template<typename DataT>
-  void TrackFit<DataT>::MeasureVelocityWithQp()
+  void TrackKalmanFilter<DataT>::MeasureVelocityWithQp()
   {
     // measure velocity using measured qp
     // assuming particle mass == fMass;
@@ -506,7 +507,7 @@ namespace cbm::algo::ca
   }
 
   template<typename DataT>
-  void TrackFit<DataT>::FilterVi(DataT vi)
+  void TrackKalmanFilter<DataT>::FilterVi(DataT vi)
   {
     // set inverse velocity to vi
 
@@ -595,9 +596,9 @@ namespace cbm::algo::ca
   }
 
   template<typename DataT>
-  void
-    TrackFit<DataT>::Extrapolate  // extrapolates track parameters and returns jacobian for extrapolation of CovMatrix
-    (DataT z_out,                 // extrapolate to this z position
+  void TrackKalmanFilter<
+    DataT>::Extrapolate  // extrapolates track parameters and returns jacobian for extrapolation of CovMatrix
+    (DataT z_out,        // extrapolate to this z position
      const kf::FieldRegion<DataT>& F)
   {
     // use Q/p linearisation at fQp0
@@ -617,7 +618,7 @@ namespace cbm::algo::ca
   }
 
   template<typename DataT>
-  void TrackFit<
+  void TrackKalmanFilter<
     DataT>::ExtrapolateStep  // extrapolates track parameters and returns jacobian for extrapolation of CovMatrix
     (DataT zOut,             // extrapolate to this z position
      const kf::FieldRegion<DataT>& Field)
@@ -832,7 +833,7 @@ namespace cbm::algo::ca
 
 
   template<typename DataT>
-  void TrackFit<DataT>::ExtrapolateLine(DataT z_out, const kf::FieldRegion<DataT>& F)
+  void TrackKalmanFilter<DataT>::ExtrapolateLine(DataT z_out, const kf::FieldRegion<DataT>& F)
   {
     // extrapolate the track assuming fQp0 == 0
     // TODO: write special simplified procedure
@@ -844,7 +845,7 @@ namespace cbm::algo::ca
   }
 
   template<typename DataT>
-  void TrackFit<DataT>::ExtrapolateLineNoField(DataT zOut)
+  void TrackKalmanFilter<DataT>::ExtrapolateLineNoField(DataT zOut)
   {
     // extrapolate the track assuming no field
 
@@ -976,7 +977,7 @@ namespace cbm::algo::ca
 
 
   template<typename DataT>
-  void TrackFit<DataT>::MultipleScattering(DataT radThick, DataT qp0)
+  void TrackKalmanFilter<DataT>::MultipleScattering(DataT radThick, DataT qp0)
   {
     cnst kONE = 1.;
 
@@ -1002,7 +1003,7 @@ namespace cbm::algo::ca
   }
 
   template<typename DataT>
-  void TrackFit<DataT>::MultipleScatteringInThickMaterial(DataT radThick, DataT thickness, bool fDownstream)
+  void TrackKalmanFilter<DataT>::MultipleScatteringInThickMaterial(DataT radThick, DataT thickness, bool fDownstream)
   {
     cnst kONE = 1.;
 
@@ -1043,7 +1044,7 @@ namespace cbm::algo::ca
 
 
   template<typename DataT>
-  void TrackFit<DataT>::EnergyLossCorrection(DataT radThick, FitDirection direction)
+  void TrackKalmanFilter<DataT>::EnergyLossCorrection(DataT radThick, FitDirection direction)
   {
     cnst qp2cut(1. / (10. * 10.));  // 10 GeV cut
     cnst qp02 = kf::utils::max(fQp0 * fQp0, qp2cut);
@@ -1077,8 +1078,8 @@ namespace cbm::algo::ca
 
 
   template<typename DataT>
-  void TrackFit<DataT>::EnergyLossCorrection(int atomicZ, DataTscal atomicA, DataTscal rho, DataTscal radLen,
-                                             DataT radThick, FitDirection direction)
+  void TrackKalmanFilter<DataT>::EnergyLossCorrection(int atomicZ, DataTscal atomicA, DataTscal rho, DataTscal radLen,
+                                                      DataT radThick, FitDirection direction)
   {
     cnst qp2cut(1. / (10. * 10.));  // 10 GeV cut
     cnst qp02 = kf::utils::max(fQp0 * fQp0, qp2cut);
@@ -1147,9 +1148,10 @@ namespace cbm::algo::ca
 
 
   template<typename DataT>
-  void TrackFit<DataT>::GetExtrapolatedXYline(DataT z, const kf::FieldRegion<DataT>& F, DataT& extrX, DataT& extrY,
-                                              std::array<DataT, kf::TrackParamBase<DataT>::kNtrackParam>& Jx,
-                                              std::array<DataT, kf::TrackParamBase<DataT>::kNtrackParam>& Jy) const
+  void
+  TrackKalmanFilter<DataT>::GetExtrapolatedXYline(DataT z, const kf::FieldRegion<DataT>& F, DataT& extrX, DataT& extrY,
+                                                  std::array<DataT, kf::TrackParamBase<DataT>::kNtrackParam>& Jx,
+                                                  std::array<DataT, kf::TrackParamBase<DataT>::kNtrackParam>& Jy) const
   {
     // extrapolate track assuming it is straight (qp==0)
     // return the extrapolated X, Y and the derivatives of the extrapolated X and Y
@@ -1200,8 +1202,8 @@ namespace cbm::algo::ca
 
 
   template<typename DataT>
-  void TrackFit<DataT>::FilterWithTargetAtLine(DataT targZ, const kf::MeasurementXy<DataT>& targXY,
-                                               const kf::FieldRegion<DataT>& F)
+  void TrackKalmanFilter<DataT>::FilterWithTargetAtLine(DataT targZ, const kf::MeasurementXy<DataT>& targXY,
+                                                        const kf::FieldRegion<DataT>& F)
   {
     // Add the target constraint to a straight line track
 
@@ -1212,7 +1214,7 @@ namespace cbm::algo::ca
   }
 
   template<typename DataT>
-  DataT TrackFit<DataT>::ApproximateBetheBloch(DataT bg2)
+  DataT TrackKalmanFilter<DataT>::ApproximateBetheBloch(DataT bg2)
   {
     //
     // This is the parameterization of the Bethe-Bloch formula inspired by Geant.
@@ -1259,7 +1261,8 @@ namespace cbm::algo::ca
   }
 
   template<typename DataT>
-  DataT TrackFit<DataT>::ApproximateBetheBloch(DataT bg2, DataT kp0, DataT kp1, DataT kp2, DataT kp3, DataT kp4)
+  DataT TrackKalmanFilter<DataT>::ApproximateBetheBloch(DataT bg2, DataT kp0, DataT kp1, DataT kp2, DataT kp3,
+                                                        DataT kp4)
   {
     //
     // This is the parameterization of the Bethe-Bloch formula inspired by Geant.
@@ -1307,8 +1310,8 @@ namespace cbm::algo::ca
 
 
   template<typename DataT>
-  std::tuple<DataT, DataT> TrackFit<DataT>::GetChi2XChi2U(kf::MeasurementXy<DataT> m, DataT x, DataT y, DataT C00,
-                                                          DataT C10, DataT C11)
+  std::tuple<DataT, DataT> TrackKalmanFilter<DataT>::GetChi2XChi2U(kf::MeasurementXy<DataT> m, DataT x, DataT y,
+                                                                   DataT C00, DataT C10, DataT C11)
   {
 
     DataT chi2x{0.};
@@ -1359,9 +1362,9 @@ namespace cbm::algo::ca
 
 
   template<typename DataT>
-  void TrackFit<DataT>::GuessTrack(const DataT& trackZ, const DataT hitX[], const DataT hitY[], const DataT hitZ[],
-                                   const DataT hitT[], const DataT By[], const DataTmask hitW[],
-                                   const DataTmask hitWtime[], int NHits)
+  void TrackKalmanFilter<DataT>::GuessTrack(const DataT& trackZ, const DataT hitX[], const DataT hitY[],
+                                            const DataT hitZ[], const DataT hitT[], const DataT By[],
+                                            const DataTmask hitW[], const DataTmask hitWtime[], int NHits)
   {
     // gives nice initial approximation for x,y,tx,ty - almost same as KF fit. qp - is shifted by 4%, resid_ual - ~3.5% (KF fit resid_ual - 1%).
 
@@ -1487,8 +1490,8 @@ namespace cbm::algo::ca
     fQp0       = fTr.Qp();
   }
 
-  template class TrackFit<kf::fvec>;
-  template class TrackFit<float>;
-  template class TrackFit<double>;
+  template class TrackKalmanFilter<kf::fvec>;
+  template class TrackKalmanFilter<float>;
+  template class TrackKalmanFilter<double>;
 
-}  // namespace cbm::algo::ca
+}  // namespace cbm::algo::kf
diff --git a/algo/ca/core/tracking/CaTrackFit.h b/algo/kf/core/KfTrackKalmanFilter.h
similarity index 92%
rename from algo/ca/core/tracking/CaTrackFit.h
rename to algo/kf/core/KfTrackKalmanFilter.h
index 0328be57b618f93149fdac9a896b66fb267a3177..525ef228e98caa00ea649b40c8fd2f810f001c95 100644
--- a/algo/ca/core/tracking/CaTrackFit.h
+++ b/algo/kf/core/KfTrackKalmanFilter.h
@@ -3,7 +3,7 @@
    Authors: Sergey Gorbunov [committer], Maksym Zyzak */
 
 
-/// \file CaTrackFit.h
+/// \file KfTrackKalmanFilter.h
 /// \brief Track fit utilities for the CA tracking based on the Kalman filter
 /// \since 10.02.2023
 /// \author S.Gorbunov
@@ -20,7 +20,7 @@
 
 #include <type_traits>
 
-namespace cbm::algo::ca
+namespace cbm::algo::kf
 {
   class Hit;
 
@@ -38,20 +38,20 @@ namespace cbm::algo::ca
   /// Track fit utilities for the CA tracking based on the Kalman Filter
   ///
   template<typename DataT>
-  class TrackFit {
+  class TrackKalmanFilter {
 
    public:
     using DataTscal = kf::utils::scaltype<DataT>;
     using DataTmask = kf::utils::masktype<DataT>;
 
-    TrackFit() = default;
+    TrackKalmanFilter() = default;
 
-    TrackFit(const kf::TrackParamBase<DataT>& t) { SetTrack(t); }
+    TrackKalmanFilter(const kf::TrackParamBase<DataT>& t) { SetTrack(t); }
 
-    TrackFit(const DataTmask& m, bool fitV) : fMask(m), fDoFitVelocity(fitV) {}
+    TrackKalmanFilter(const DataTmask& m, bool fitV) : fMask(m), fDoFitVelocity(fitV) {}
 
     template<typename T>
-    TrackFit(const kf::TrackParamBase<T>& t)
+    TrackKalmanFilter(const kf::TrackParamBase<T>& t)
     {
       SetTrack(t);
     }
@@ -73,7 +73,7 @@ namespace cbm::algo::ca
 
     void SetDoFitVelocity(bool v) { fDoFitVelocity = v; }
 
-    void SetOneEntry(const int i0, const TrackFit& T1, const int i1);
+    void SetOneEntry(const int i0, const TrackKalmanFilter& T1, const int i1);
 
     std::string ToString(int i = -1);
 
@@ -259,38 +259,38 @@ namespace cbm::algo::ca
   // =============================================================================================
 
   template<typename DataT>
-  inline std::string TrackFit<DataT>::ToString(int i)
+  inline std::string TrackKalmanFilter<DataT>::ToString(int i)
   {
     return fTr.ToString(i);
   }
 
 
   template<typename DataT>
-  inline void TrackFit<DataT>::SetOneEntry(const int i0, const TrackFit& T1, const int i1)
+  inline void TrackKalmanFilter<DataT>::SetOneEntry(const int i0, const TrackKalmanFilter& T1, const int i1)
   {
     fTr.SetOneEntry(i0, T1.fTr, i1);
     kf::utils::VecCopy<DataT, DataT, false, false>::CopyEntries(fQp0, i0, T1.fQp0, i1);
   }
 
   template<typename DataT>
-  inline std::pair<DataT, DataT> TrackFit<DataT>::ExtrapolateLineXdX2(DataT z_out) const
+  inline std::pair<DataT, DataT> TrackKalmanFilter<DataT>::ExtrapolateLineXdX2(DataT z_out) const
   {
     DataT dz = (z_out - fTr.GetZ());
     return std::pair(fTr.GetX() + fTr.GetTx() * dz, fTr.C00() + dz * (2 * fTr.C20() + dz * fTr.C22()));
   }
 
   template<typename DataT>
-  inline std::pair<DataT, DataT> TrackFit<DataT>::ExtrapolateLineYdY2(DataT z_out) const
+  inline std::pair<DataT, DataT> TrackKalmanFilter<DataT>::ExtrapolateLineYdY2(DataT z_out) const
   {
     DataT dz = (z_out - fTr.GetZ());
     return std::pair(fTr.GetY() + fTr.GetTy() * dz, fTr.C11() + dz * (DataT(2.) * fTr.C31() + dz * fTr.C33()));
   }
 
   template<typename DataT>
-  inline DataT TrackFit<DataT>::ExtrapolateLineDxy(DataT z_out) const
+  inline DataT TrackKalmanFilter<DataT>::ExtrapolateLineDxy(DataT z_out) const
   {
     DataT dz = (z_out - fTr.GetZ());
     return fTr.C10() + dz * (fTr.C21() + fTr.C30() + dz * fTr.C32());
   }
 
-}  // namespace cbm::algo::ca
+}  // namespace cbm::algo::kf
diff --git a/reco/KF/CbmKfTrackFitter.cxx b/reco/KF/CbmKfTrackFitter.cxx
index 60b4435c15e5ffc3544fb9ef6530768b8094cb79..28c2940f4f84443292f70424cf24781d93d0b7fe 100644
--- a/reco/KF/CbmKfTrackFitter.cxx
+++ b/reco/KF/CbmKfTrackFitter.cxx
@@ -8,7 +8,6 @@
 #include "CaFramework.h"
 #include "CaSimd.h"
 #include "CaStation.h"
-#include "CaTrackFit.h"
 #include "CbmGlobalTrack.h"
 #include "CbmL1.h"
 #include "CbmL1Util.h"
@@ -30,6 +29,7 @@
 #include "CbmTrdTrackingInterface.h"
 #include "FairRootManager.h"
 #include "KFParticleDatabase.h"
+#include "KfTrackKalmanFilter.h"
 #include "KfTrackParam.h"
 #include "TClonesArray.h"
 #include "TDatabasePDG.h"
@@ -453,7 +453,7 @@ void CbmKfTrackFitter::FilterFirstMeasurement(const FitNode& n)
 }
 
 
-void CbmKfTrackFitter::AddMaterialEffects(CbmKfTrackFitter::FitNode& n, ca::FitDirection direction)
+void CbmKfTrackFitter::AddMaterialEffects(CbmKfTrackFitter::FitNode& n, kf::FitDirection direction)
 {
   // add material effects
   if (n.fMaterialLayer < 0) {
@@ -578,7 +578,7 @@ bool CbmKfTrackFitter::FitTrack(CbmKfTrackFitter::Track& t)
         fFit.SetQp0(n.fTrack.GetQp());
       }
 
-      AddMaterialEffects(n, FitDirection::kDownstream);
+      AddMaterialEffects(n, kf::FitDirection::kDownstream);
 
       if (n.fIsXySet) {
         fFit.FilterXY(n.fMxy, fSkipUnmeasuredCoordinates);
@@ -622,7 +622,7 @@ bool CbmKfTrackFitter::FitTrack(CbmKfTrackFitter::Track& t)
 
       fFit.Extrapolate(n.fZ, field);
 
-      AddMaterialEffects(n, FitDirection::kUpstream);
+      AddMaterialEffects(n, kf::FitDirection::kUpstream);
 
       if (n.fIsXySet) {
         fFit.FilterXY(n.fMxy, fSkipUnmeasuredCoordinates);
@@ -654,7 +654,7 @@ bool CbmKfTrackFitter::FitTrack(CbmKfTrackFitter::Track& t)
       if (n.fIsFitted) {
         fFit.SetQp0(n.fTrack.GetQp());
       }
-      AddMaterialEffects(n, FitDirection::kUpstream);
+      AddMaterialEffects(n, kf::FitDirection::kUpstream);
     }
   }
 
diff --git a/reco/KF/CbmKfTrackFitter.h b/reco/KF/CbmKfTrackFitter.h
index b7281881c98458a3e383eecf82c79c6507396987..00a5f11e97c317c97afecd2748b0b86c1fd4e04a 100644
--- a/reco/KF/CbmKfTrackFitter.h
+++ b/reco/KF/CbmKfTrackFitter.h
@@ -7,10 +7,10 @@
 
 #include "CaDefs.h"
 #include "CaSimd.h"
-#include "CaTrackFit.h"
 #include "CbmDefs.h"
 #include "KfMeasurementTime.h"
 #include "KfMeasurementXy.h"
+#include "KfTrackKalmanFilter.h"
 #include "KfTrackParam.h"
 
 #include <vector>
@@ -137,7 +137,7 @@ class CbmKfTrackFitter {
  private:
   void FilterFirstMeasurement(const FitNode& n);
 
-  void AddMaterialEffects(FitNode& n, ca::FitDirection direction);
+  void AddMaterialEffects(FitNode& n, kf::FitDirection direction);
 
   // combine two tracks
   bool Smooth(kf::TrackParamBase<double>& t1, const kf::TrackParamBase<double>& t2);
@@ -160,7 +160,7 @@ class CbmKfTrackFitter {
 
   bool fIsInitialized = {false};  // is the fitter initialized
   bool fSkipUnmeasuredCoordinates{false};
-  ca::TrackFit<double> fFit;  // track fit object
+  kf::TrackKalmanFilter<double> fFit;  // track fit object
 
   /// externally defined inverse momentum for the Multiple Scattering calculation.
   /// It is used for the tracks in field-free regions.
@@ -169,8 +169,8 @@ class CbmKfTrackFitter {
   double fDefaultQpForMs{1. / 0.1};
   bool fIsQpForMsFixed{false};
 
-  double fMass{ca::constants::phys::PionMass};  // mass hypothesis for the fit
-  bool fIsElectron{false};                      // fit track as an electron (with the bermsstrallung effect)
-  bool fDoSmooth{true};                         // do the KF-smoothing to define track pars at all the nodes
-  int fVerbosityLevel{0};                       // verbosity level
+  double fMass{kf::defs::PionMass<double>};  // mass hypothesis for the fit
+  bool fIsElectron{false};                   // fit track as an electron (with the bermsstrallung effect)
+  bool fDoSmooth{true};                      // do the KF-smoothing to define track pars at all the nodes
+  int fVerbosityLevel{0};                    // verbosity level
 };
diff --git a/reco/KF/ParticleFitter/CbmL1PFFitter.cxx b/reco/KF/ParticleFitter/CbmL1PFFitter.cxx
index ade81fed64ae60c43cbc3e4ee7f08a7cd7047bf0..7b5d1929840cffe49c455b9e6f1dad0859fbffce 100644
--- a/reco/KF/ParticleFitter/CbmL1PFFitter.cxx
+++ b/reco/KF/ParticleFitter/CbmL1PFFitter.cxx
@@ -31,11 +31,11 @@
 #include "CaSimd.h"
 #include "CaStation.h"
 #include "CaToolsField.h"
-#include "CaTrackFit.h"
 #include "CbmKFVertex.h"
 #include "FairRootManager.h"
 #include "KFParticleDatabase.h"
 #include "KfFieldRegion.h"
+#include "KfTrackKalmanFilter.h"
 #include "KfTrackParam.h"
 #include "TDatabasePDG.h"
 
@@ -152,7 +152,7 @@ inline int CbmL1PFFitter::GetStsStationIndex(const CbmStsHit* hit)
 }
 
 
-void FilterFirst(ca::TrackFit<fvec>& fit, kf::MeasurementXy<fvec>& mxy, fvec& t, fvec& dt2)
+void FilterFirst(kf::TrackKalmanFilter<fvec>& fit, kf::MeasurementXy<fvec>& mxy, fvec& t, fvec& dt2)
 {
   TrackParamV& tr = fit.Tr();
   tr.ResetErrors(mxy.Dx2(), mxy.Dy2(), 1., 1., 1., dt2, 1.e2);
@@ -178,7 +178,7 @@ void CbmL1PFFitter::Fit(std::vector<CbmStsTrack>& Tracks, const std::vector<CbmM
   static int nHits = CbmL1::Instance()->fpAlgo->GetParameters().GetNstationsActive();
   int nTracks_SIMD = fvec::size();
 
-  ca::TrackFit<fvec> fit;
+  kf::TrackKalmanFilter<fvec> fit;
   fit.SetParticleMass(CbmL1::Instance()->fpAlgo->GetDefaultParticleMass());
 
   TrackParamV& T = fit.Tr();  // fitting parametr coresponding to current track
@@ -372,7 +372,7 @@ void CbmL1PFFitter::Fit(std::vector<CbmStsTrack>& Tracks, const std::vector<CbmM
       fit.Extrapolate(z[i], fld);
       auto radThick = CbmL1::Instance()->fpAlgo->GetParameters().GetMaterialThickness(i, fit.Tr().X(), fit.Tr().Y());
       fit.MultipleScattering(radThick);
-      fit.EnergyLossCorrection(radThick, FitDirection::kDownstream);
+      fit.EnergyLossCorrection(radThick, kf::FitDirection::kDownstream);
 
       fit.SetMask(initialised && w[i]);
       fit.FilterXY(mxy[i]);
@@ -433,7 +433,7 @@ void CbmL1PFFitter::Fit(std::vector<CbmStsTrack>& Tracks, const std::vector<CbmM
       fit.Extrapolate(z[i], fld);
       auto radThick = CbmL1::Instance()->fpAlgo->GetParameters().GetMaterialThickness(i, fit.Tr().X(), fit.Tr().Y());
       fit.MultipleScattering(radThick);
-      fit.EnergyLossCorrection(radThick, FitDirection::kUpstream);
+      fit.EnergyLossCorrection(radThick, kf::FitDirection::kUpstream);
 
       fit.SetMask(initialised && w[i]);
       fit.FilterXY(mxy[i]);
@@ -501,7 +501,7 @@ void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<PFFieldRe
 
   int nTracks_SIMD = fvec::size();
 
-  ca::TrackFit<fvec> fit;
+  kf::TrackKalmanFilter<fvec> fit;
   TrackParamV& T = fit.Tr();  // fitting parametr coresponding to current track
 
   CbmStsTrack* tr[fvec::size()]{nullptr};
@@ -602,7 +602,7 @@ void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<PFFieldRe
       fit.Extrapolate(zSta[iSt], fld);
       auto radThick = CbmL1::Instance()->fpAlgo->GetParameters().GetMaterialThickness(iSt, fit.Tr().X(), fit.Tr().Y());
       fit.MultipleScattering(radThick);
-      fit.EnergyLossCorrection(radThick, FitDirection::kUpstream);
+      fit.EnergyLossCorrection(radThick, kf::FitDirection::kUpstream);
     }
     fit.SetMask(fmask::One());
     fit.Extrapolate(primVtx.GetRefZ(), fld);
@@ -611,7 +611,7 @@ void CbmL1PFFitter::GetChiToVertex(vector<CbmStsTrack>& Tracks, vector<PFFieldRe
     constexpr float targetRadThick = 3.73e-2f * 2;  // 250 mum Gold
 
     fit.MultipleScattering(targetRadThick);
-    fit.EnergyLossCorrection(targetRadThick, FitDirection::kUpstream);
+    fit.EnergyLossCorrection(targetRadThick, kf::FitDirection::kUpstream);
 
     Double_t Cv[3] = {primVtx.GetCovMatrix()[0], primVtx.GetCovMatrix()[1], primVtx.GetCovMatrix()[2]};
 
diff --git a/reco/L1/CbmL1Performance.cxx b/reco/L1/CbmL1Performance.cxx
index 8a3ea1070bd69096777dec2ae48d9cb7b2b7d67d..8d012fc01da836a996667b8103c4ac5adf3ff4e1 100644
--- a/reco/L1/CbmL1Performance.cxx
+++ b/reco/L1/CbmL1Performance.cxx
@@ -20,7 +20,6 @@
 
 #include "CaFramework.h"
 #include "CaToolsDebugger.h"
-#include "CaTrackFit.h"
 #include "CbmL1.h"
 #include "CbmL1Constants.h"
 #include "CbmL1Counters.h"
@@ -40,6 +39,7 @@
 #include "FairField.h"
 #include "FairRunAna.h"
 #include "FairTrackParam.h"  // for vertex pulls
+#include "KfTrackKalmanFilter.h"
 #include "KfTrackParam.h"
 #include "TFile.h"
 #include "TH1.h"
@@ -1095,7 +1095,7 @@ void CbmL1::TrackFitPerformance()
 
   static bool first_call = 1;
 
-  ca::TrackFit<fvec> fit;
+  kf::TrackKalmanFilter<fvec> fit;
   fit.SetParticleMass(fpAlgo->GetDefaultParticleMass());
   fit.SetMask(fmask::One());
   //fit.SetMaxExtrapolationStep(10.);
@@ -1325,7 +1325,7 @@ void CbmL1::TrackFitPerformance()
             //           LOG(info) << iSta << " " << dir;
             auto radThick = fpAlgo->GetParameters().GetMaterialThickness(iSta, fit.Tr().GetX(), fit.Tr().GetY());
             fit.MultipleScattering(radThick);
-            fit.EnergyLossCorrection(radThick, FitDirection::kUpstream);
+            fit.EnergyLossCorrection(radThick, kf::FitDirection::kUpstream);
           }
         }
         if (mc.GetStartZ() != tr.GetZ()[0]) continue;
@@ -1394,7 +1394,7 @@ void CbmL1::TrackFitPerformance()
             fit.Extrapolate(fpAlgo->GetParameters().GetStation(iSta).fZ, fld);
             auto radThick = fpAlgo->GetParameters().GetMaterialThickness(iSta, fit.Tr().GetX(), fit.Tr().GetY());
             fit.MultipleScattering(radThick);
-            fit.EnergyLossCorrection(radThick, FitDirection::kUpstream);
+            fit.EnergyLossCorrection(radThick, kf::FitDirection::kUpstream);
           }
           fit.Extrapolate(mc.GetStartZ(), fld);
         }
@@ -1520,7 +1520,7 @@ void CbmL1::TrackFitPerformance()
 
 void CbmL1::FillFitHistos(TrackParamV& track, const cbm::ca::tools::MCPoint& mcP, bool isTimeFitted, TH1F* h[])
 {
-  ca::TrackFit<fvec> fit;
+  kf::TrackKalmanFilter<fvec> fit;
   fit.SetParticleMass(fpAlgo->GetDefaultParticleMass());
   fit.SetMask(fmask::One());
   //fit.SetMaxExtrapolationStep(10.);
diff --git a/reco/L1/qa/CbmCaTrackFitQa.cxx b/reco/L1/qa/CbmCaTrackFitQa.cxx
index 722460a7480aae8512cb6ca4f8737aa2f58c7ba6..4639814ea8413efa659238a6bbd867bd9f2d6ea8 100644
--- a/reco/L1/qa/CbmCaTrackFitQa.cxx
+++ b/reco/L1/qa/CbmCaTrackFitQa.cxx
@@ -11,11 +11,11 @@
 
 #include "CaToolsField.h"
 #include "CaToolsMCData.h"
-#include "CaTrackFit.h"
 #include "CbmL1Track.h"
 #include "CbmQaCanvas.h"
 #include "CbmQaUtil.h"
 #include "KfFieldRegion.h"
+#include "KfTrackKalmanFilter.h"
 #include "TF1.h"
 #include "TFormula.h"
 #include "TH1.h"
@@ -160,7 +160,7 @@ void TrackFitQa::Init()
 void TrackFitQa::Fill(const TrackParamV& trPar, const tools::MCPoint& mcPoint, bool bTimeMeasured, double /*weight*/)
 {
   // Probably, a bottleneck
-  ca::TrackFit<ca::fvec> fitter;
+  cbm::algo::kf::TrackKalmanFilter<ca::fvec> fitter;
   fitter.SetParticleMass(fMass);
   fitter.SetMask(fmask::One());
   fitter.SetDoFitVelocity(true);
diff --git a/reco/L1/qa/CbmCaTrackTypeQa.cxx b/reco/L1/qa/CbmCaTrackTypeQa.cxx
index 872424ab1ddc7fc1fae75833348f0047c8b45247..9b408bda74f73e0536cbafca77b7c04b70bee35d 100644
--- a/reco/L1/qa/CbmCaTrackTypeQa.cxx
+++ b/reco/L1/qa/CbmCaTrackTypeQa.cxx
@@ -13,7 +13,6 @@
 #include "CbmCaTrackFitQa.h"
 #include "CbmL1Track.h"
 
-using cbm::algo::ca::TrackFit;
 using cbm::algo::kf::FieldRegion;
 using cbm::ca::TrackTypeQa;
 using cbm::ca::tools::MCPoint;
@@ -339,7 +338,7 @@ void TrackTypeQa::FillRecoTrack(int iTrkReco, double weight)
           auto radLength = fpParameters->GetMaterialThickness(iSt, fTrackFit.Tr().GetX(), fTrackFit.Tr().GetY());
           fTrackFit.MultipleScattering(radLength);
           fTrackFit.EnergyLossCorrection(radLength,
-                                         (direction > 0) ? FitDirection::kDownstream : FitDirection::kUpstream);
+                                         (direction > 0) ? kf::FitDirection::kDownstream : kf::FitDirection::kUpstream);
         }
         fTrackFit.Extrapolate(mcTrkVertex.GetZ(), fFieldRegion);
         const TrackParamV& trParExtr = fTrackFit.Tr();
diff --git a/reco/L1/qa/CbmCaTrackTypeQa.h b/reco/L1/qa/CbmCaTrackTypeQa.h
index a59ee5e0f80bec58eeb262fac9860402490d6776..ef0e0a12d95c312ed72724cb0e1b30b3033d3a79 100644
--- a/reco/L1/qa/CbmCaTrackTypeQa.h
+++ b/reco/L1/qa/CbmCaTrackTypeQa.h
@@ -11,12 +11,12 @@
 #pragma once
 
 #include "CaParameters.h"
-#include "CaTrackFit.h"
 #include "CbmCaTrackFitQa.h"
 #include "CbmL1DetectorID.h"
 #include "CbmL1Hit.h"
 #include "CbmQaIO.h"
 #include "KfFieldRegion.h"
+#include "KfTrackKalmanFilter.h"
 
 #include <map>
 #include <string>
@@ -293,8 +293,8 @@ namespace cbm::ca
     TProfile* fph_stations_point = nullptr;  ///< Average number of stations with MC point
     TProfile* fph_stations_hit   = nullptr;  ///< Average number of stations with hit
 
-    ca::TrackFit<ca::fvec> fTrackFit;                   ///< Track fitter
-    cbm::algo::kf::FieldRegion<ca::fvec> fFieldRegion;  ///< Magnetic field
+    cbm::algo::kf::TrackKalmanFilter<ca::fvec> fTrackFit;  ///< Track fitter
+    cbm::algo::kf::FieldRegion<ca::fvec> fFieldRegion;     ///< Magnetic field
 
     int fCounterMC        = 0;   ///< Counter of MC tracks
     int fCounterClones    = 0;   ///< Counter of clone tracks