diff --git a/reco/KF/CbmKfFitTracksTask.cxx b/reco/KF/CbmKfFitTracksTask.cxx
index 0962838adf8bd988d288a90efde181010dc646eb..2f43763fa8ef09894573c04ebc8b4e0fff7fc040 100644
--- a/reco/KF/CbmKfFitTracksTask.cxx
+++ b/reco/KF/CbmKfFitTracksTask.cxx
@@ -101,7 +101,7 @@ void CbmKfFitTracksTask::Exec(Option_t* /*opt*/)
         return;
       }
       CbmKfTrackFitter::Track t;
-      if (!fFitter.CreateMvdStsTrack(t, *stsTrack)) {
+      if (!fFitter.CreateMvdStsTrack(t, iTr)) {
         LOG(fatal) << "CbmKfFitTracksTask: can not create the sts track for the fit! ";
         return;
       }
diff --git a/reco/KF/CbmKfTrackFitter.cxx b/reco/KF/CbmKfTrackFitter.cxx
index 0d0c80e4c5c3b9a27d270baf2b0f227295dd5b68..272cf0e93b5ed3ddddc8ebf039a498bcdeed99b5 100644
--- a/reco/KF/CbmKfTrackFitter.cxx
+++ b/reco/KF/CbmKfTrackFitter.cxx
@@ -120,18 +120,115 @@ void CbmKfTrackFitter::SetMassHypothesis(double mass)
 void CbmKfTrackFitter::SetElectronFlag(bool isElectron) { fIsElectron = isElectron; }
 
 
-bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const CbmGlobalTrack& globalTrack)
+bool CbmKfTrackFitter::CreateMvdStsTrack(CbmKfTrackFitter::Track& kfTrack, int stsTrackIndex)
+{
+  Init();
+  if (!fIsInitialized) return false;
+
+  if (!fInputStsTracks) {
+    LOG(error) << "CbmKfTrackFitter: Sts track array not found!";
+    return false;
+  }
+  if (stsTrackIndex >= fInputStsTracks->GetEntriesFast()) {
+    LOG(error) << "CbmKfTrackFitter: Sts track index " << stsTrackIndex << " is out of range!";
+    return false;
+  }
+  auto* stsTrack = dynamic_cast<const CbmStsTrack*>(fInputStsTracks->At(stsTrackIndex));
+  if (!stsTrack) {
+    LOG(error) << "CbmKfTrackFitter: Sts track is null!";
+    return false;
+  }
+
+  CbmGlobalTrack globalTrack;
+  globalTrack.SetStsTrackIndex(stsTrackIndex);
+  globalTrack.SetParamFirst(*dynamic_cast<const FairTrackParam*>(stsTrack->GetParamFirst()));
+
+  return CreateGlobalTrack(kfTrack, globalTrack);
+}
+
+
+bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, int globalTrackIndex)
 {
   Init();
   if (!fIsInitialized) return false;
 
-  std::vector<CbmMvdHit> mvdHits;
-  std::vector<CbmStsHit> stsHits;
-  std::vector<CbmMuchPixelHit> muchHits;
-  std::vector<CbmTrdHit> trdHits;
-  std::vector<CbmTofHit> tofHits;
+  if (!fInputGlobalTracks) {
+    LOG(error) << "CbmKfTrackFitter: Global track array not found!";
+    return false;
+  }
+
+  if (globalTrackIndex >= fInputGlobalTracks->GetEntriesFast()) {
+    LOG(error) << "CbmKfTrackFitter: Global track index " << globalTrackIndex << " is out of range!";
+    return false;
+  }
+
+  auto* globalTrack = dynamic_cast<const CbmGlobalTrack*>(fInputGlobalTracks->At(globalTrackIndex));
+  if (!globalTrack) {
+    LOG(error) << "CbmKfTrackFitter: Global track is null!";
+    return false;
+  }
+
+  return CreateGlobalTrack(kfTrack, *globalTrack);
+}
+
 
+bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const CbmGlobalTrack& globalTrack)
+{
   kfTrack = {};
+  Init();
+  if (!fIsInitialized) return false;
+
+  const ca::Parameters& caPar = CbmL1::Instance()->fpAlgo->GetParameters();
+
+  int nStations = caPar.GetNstationsActive();
+
+  CbmKfTrackFitter::Track t;
+
+  {
+    t.fNodes.resize(nStations);
+    for (int i = 0; i < nStations; i++) {
+      CbmKfTrackFitter::FitNode& n = t.fNodes[i];
+      n                            = {};
+      n.fMaterialLayer             = i;
+      n.fZ                         = caPar.GetStation(i).GetZScal();
+      n.fRadThick                  = 0.;
+      n.fIsRadThickSet             = false;
+      n.fIsFitted                  = false;
+      n.fIsXySet                   = false;
+      n.fIsTimeSet                 = false;
+      n.fHitSystemId               = ECbmModuleId::kNotExist;
+      n.fHitAddress                = -1;
+      n.fHitIndex                  = -1;
+    }
+    t.fFirstHitNode = nStations - 1;
+    t.fLastHitNode  = 0;
+  }
+
+  // lambda to set the node from the pixel hit
+  auto setNode = [&](const CbmPixelHit& h, int stIdx, int hitIdx, ca::EDetectorID detId) {
+    int ista = caPar.GetStationIndexActive(stIdx, detId);
+    if (ista < 0) return;
+    assert(ista < nStations);
+    CbmKfTrackFitter::FitNode& n = t.fNodes[ista];
+    n.fZ                         = h.GetZ();
+    n.fMxy.SetX(h.GetX());
+    n.fMxy.SetY(h.GetY());
+    n.fMxy.SetDx2(h.GetDx() * h.GetDx());
+    n.fMxy.SetDy2(h.GetDy() * h.GetDy());
+    n.fMxy.SetDxy(h.GetDxy());
+    n.fMxy.SetNdfX(1);
+    n.fMxy.SetNdfY(1);
+    n.fIsXySet = true;
+    n.fMt.SetT(h.GetTime());
+    n.fMt.SetDt2(h.GetTimeError() * h.GetTimeError());
+    n.fMt.SetNdfT(1);
+    n.fIsTimeSet     = (detId != ca::EDetectorID::kMvd);
+    n.fRadThick      = 0.;
+    n.fIsRadThickSet = false;
+    n.fHitSystemId   = cbm::L1Util::ConvertDetSystemId(detId);
+    n.fHitAddress    = h.GetAddress();
+    n.fHitIndex      = hitIdx;
+  };
 
   // Read MVD & STS hits
 
@@ -161,14 +258,15 @@ bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const
         LOG(error) << "CbmKfTrackFitter: Mvd hit array not found!";
         return false;
       }
-      mvdHits.reserve(nMvdHits);
       for (int ih = 0; ih < nMvdHits; ih++) {
         int hitIndex = stsTrack->GetMvdHitIndex(ih);
         if (hitIndex >= fInputMvdHits->GetEntriesFast()) {
           LOG(error) << "CbmKfTrackFitter: Mvd hit index " << hitIndex << " is out of range!";
           return false;
         }
-        mvdHits.push_back(*dynamic_cast<const CbmMvdHit*>(fInputMvdHits->At(hitIndex)));
+        const auto& hit = *dynamic_cast<const CbmMvdHit*>(fInputMvdHits->At(hitIndex));
+        setNode(hit, CbmMvdTrackingInterface::Instance()->GetTrackingStationIndex(&hit), hitIndex,
+                ca::EDetectorID::kMvd);
       }
     }
 
@@ -180,14 +278,15 @@ bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const
         LOG(error) << "CbmKfTrackFitter: Sts hit array not found!";
         return false;
       }
-      stsHits.reserve(nStsHits);
       for (int ih = 0; ih < nStsHits; ih++) {
         int hitIndex = stsTrack->GetStsHitIndex(ih);
         if (hitIndex >= fInputStsHits->GetEntriesFast()) {
           LOG(error) << "CbmKfTrackFitter: Sts hit index " << hitIndex << " is out of range!";
           return false;
         }
-        stsHits.push_back(*dynamic_cast<const CbmStsHit*>(fInputStsHits->At(hitIndex)));
+        const auto& hit = *dynamic_cast<const CbmStsHit*>(fInputStsHits->At(hitIndex));
+        setNode(hit, CbmStsTrackingInterface::Instance()->GetTrackingStationIndex(&hit), hitIndex,
+                ca::EDetectorID::kSts);
       }
     }
   }  // MVD & STS hits
@@ -216,14 +315,15 @@ bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const
         LOG(error) << "CbmKfTrackFitter: Much hit array not found!";
         return false;
       }
-      muchHits.reserve(nHits);
       for (int ih = 0; ih < nHits; ih++) {
         int hitIndex = track->GetHitIndex(ih);
         if (hitIndex >= fInputMuchHits->GetEntriesFast()) {
           LOG(error) << "CbmKfTrackFitter: Much hit index " << hitIndex << " is out of range!";
           return false;
         }
-        muchHits.push_back(*dynamic_cast<const CbmMuchPixelHit*>(fInputMuchHits->At(hitIndex)));
+        const auto& hit = *dynamic_cast<const CbmMuchPixelHit*>(fInputMuchHits->At(hitIndex));
+        setNode(hit, CbmMuchTrackingInterface::Instance()->GetTrackingStationIndex(&hit), hitIndex,
+                ca::EDetectorID::kMuch);
       }
     }
   }
@@ -251,14 +351,15 @@ bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const
         LOG(error) << "CbmKfTrackFitter: Trd hit array not found!";
         return false;
       }
-      trdHits.reserve(nHits);
       for (int ih = 0; ih < nHits; ih++) {
         int hitIndex = track->GetHitIndex(ih);
         if (hitIndex >= fInputTrdHits->GetEntriesFast()) {
           LOG(error) << "CbmKfTrackFitter: Trd hit index " << hitIndex << " is out of range!";
           return false;
         }
-        trdHits.push_back(*dynamic_cast<const CbmTrdHit*>(fInputTrdHits->At(hitIndex)));
+        const auto& hit = *dynamic_cast<const CbmTrdHit*>(fInputTrdHits->At(hitIndex));
+        setNode(hit, CbmTrdTrackingInterface::Instance()->GetTrackingStationIndex(&hit), hitIndex,
+                ca::EDetectorID::kTrd);
       }
     }
   }
@@ -288,157 +389,30 @@ bool CbmKfTrackFitter::CreateGlobalTrack(CbmKfTrackFitter::Track& kfTrack, const
         LOG(error) << "CbmKfTrackFitter: Tof hit array not found!";
         return false;
       }
-      tofHits.reserve(nHits);
       for (int ih = 0; ih < nHits; ih++) {
         int hitIndex = track->GetHitIndex(ih);
         if (hitIndex >= fInputTofHits->GetEntriesFast()) {
           LOG(error) << "CbmKfTrackFitter: Tof hit index " << hitIndex << " is out of range!";
           return false;
         }
-        tofHits.push_back(*dynamic_cast<const CbmTofHit*>(fInputTofHits->At(hitIndex)));
+        const auto& hit = *dynamic_cast<const CbmTofHit*>(fInputTofHits->At(hitIndex));
+        setNode(hit, CbmTofTrackingInterface::Instance()->GetTrackingStationIndex(&hit), hitIndex,
+                ca::EDetectorID::kTof);
       }
     }
   }
 
-  return CreateTrack(kfTrack, *globalTrack.GetParamFirst(), mvdHits, stsHits, muchHits, trdHits, tofHits);
-}
-
-
-bool CbmKfTrackFitter::CreateMvdStsTrack(CbmKfTrackFitter::Track& kfTrack, const CbmStsTrack& stsTrack)
-{
-  Init();
-  if (!fIsInitialized) return false;
-
-  std::vector<CbmMvdHit> mvdHits;
-  std::vector<CbmStsHit> stsHits;
-  std::vector<CbmMuchPixelHit> muchHits;
-  std::vector<CbmTrdHit> trdHits;
-  std::vector<CbmTofHit> tofHits;
-
-  kfTrack = {};
-
-  // Read MVD hits
-
-  int nMvdHits = stsTrack.GetNofMvdHits();
-  if (nMvdHits > 0) {
-    if (!fInputMvdHits) {
-      LOG(error) << "CbmKfTrackFitter: Mvd hit array not found!";
-      return false;
-    }
-    mvdHits.reserve(nMvdHits);
-    for (int ih = 0; ih < nMvdHits; ih++) {
-      int hitIndex = stsTrack.GetMvdHitIndex(ih);
-      mvdHits.push_back(*dynamic_cast<const CbmMvdHit*>(fInputMvdHits->At(hitIndex)));
-    }
-  }
-
-  // Read STS hits
-
-  int nStsHits = stsTrack.GetNofStsHits();
-  if (nStsHits > 0) {
-    if (!fInputStsHits) {
-      LOG(error) << "CbmKfTrackFitter: Sts hit array not found!";
-      return false;
-    }
-    stsHits.reserve(nStsHits);
-    for (int ih = 0; ih < nStsHits; ih++) {
-      int hitIndex = stsTrack.GetStsHitIndex(ih);
-      stsHits.push_back(*dynamic_cast<const CbmStsHit*>(fInputStsHits->At(hitIndex)));
-    }
-  }
-
-  return CreateTrack(kfTrack, *stsTrack.GetParamFirst(), mvdHits, stsHits, muchHits, trdHits, tofHits);
-}
-
-
-bool CbmKfTrackFitter::CreateTrack(CbmKfTrackFitter::Track& kfTrack, const FairTrackParam& trackFirst,
-                                   const std::vector<CbmMvdHit>& mvdHits, const std::vector<CbmStsHit>& stsHits,
-                                   const std::vector<CbmMuchPixelHit>& muchHits, const std::vector<CbmTrdHit>& trdHits,
-                                   const std::vector<CbmTofHit>& tofHits
-
-)
-{
-  kfTrack = {};
-  Init();
-  if (!fIsInitialized) return false;
-
-  const ca::Parameters& caPar = CbmL1::Instance()->fpAlgo->GetParameters();
-
-  int nStations = caPar.GetNstationsActive();
-
-  CbmKfTrackFitter::Track t;
-
-  {
-    t.fNodes.resize(nStations);
-    for (int i = 0; i < nStations; i++) {
-      CbmKfTrackFitter::FitNode& n = t.fNodes[i];
-      n                            = {};
-      n.fMaterialLayer             = i;
-      n.fZ                         = caPar.GetStation(i).GetZScal();
-      n.fRadThick                  = 0.;
-      n.fIsRadThickSet             = false;
-      n.fIsFitted                  = false;
-      n.fIsXySet                   = false;
-      n.fIsTimeSet                 = false;
-    }
-    t.fFirstHitNode = nStations - 1;
-    t.fLastHitNode  = 0;
-  }
-
-  // lambda to set the node from the pixel hit
-  auto setNode = [&](const CbmPixelHit& h, int stIdx, ca::EDetectorID detId) {
-    int ista = caPar.GetStationIndexActive(stIdx, detId);
-    if (ista < 0) return;
-    assert(ista < nStations);
-    CbmKfTrackFitter::FitNode& n = t.fNodes[ista];
-    n.fZ                         = h.GetZ();
-    n.fMxy.SetX(h.GetX());
-    n.fMxy.SetY(h.GetY());
-    n.fMxy.SetDx2(h.GetDx() * h.GetDx());
-    n.fMxy.SetDy2(h.GetDy() * h.GetDy());
-    n.fMxy.SetDxy(h.GetDxy());
-    n.fMxy.SetNdfX(1);
-    n.fMxy.SetNdfY(1);
-    n.fIsXySet = true;
-    n.fMt.SetT(h.GetTime());
-    n.fMt.SetDt2(h.GetTimeError() * h.GetTimeError());
-    n.fMt.SetNdfT(1);
-    n.fIsTimeSet     = (detId != ca::EDetectorID::kMvd);
-    n.fRadThick      = 0.;
-    n.fIsRadThickSet = false;
-    n.fSystemId      = cbm::L1Util::ConvertDetSystemId(detId);
-    n.fAddress       = h.GetAddress();
-  };
-
-  for (auto& h : mvdHits) {
-    setNode(h, CbmMvdTrackingInterface::Instance()->GetTrackingStationIndex(&h), ca::EDetectorID::kMvd);
-  }
-
-  for (auto& h : stsHits) {
-    setNode(h, CbmStsTrackingInterface::Instance()->GetTrackingStationIndex(&h), ca::EDetectorID::kSts);
-  }
-
-  for (auto& h : muchHits) {
-    setNode(h, CbmMuchTrackingInterface::Instance()->GetTrackingStationIndex(&h), ca::EDetectorID::kMuch);
-  }
-
-  for (auto& h : trdHits) {
-    setNode(h, CbmTrdTrackingInterface::Instance()->GetTrackingStationIndex(&h), ca::EDetectorID::kTrd);
-  }
-
-  for (auto& h : tofHits) {
-    setNode(h, CbmTofTrackingInterface::Instance()->GetTrackingStationIndex(&h), ca::EDetectorID::kTof);
-  }
-
   t.MakeConsistent();
 
-  ca::TrackParamD tmp = cbm::L1Util::ConvertTrackParam(trackFirst);
+  ca::TrackParamD tmp = cbm::L1Util::ConvertTrackParam(*globalTrack.GetParamFirst());
 
   t.fNodes[t.fFirstHitNode].fTrack.Set(tmp);
   t.fNodes[t.fFirstHitNode].fIsFitted = 1;
 
   kfTrack = t;
   return true;
+
+  //  return CreateTrack(kfTrack, *globalTrack.GetParamFirst(), mvdHits, stsHits, muchHits, trdHits, tofHits);
 }
 
 
@@ -492,6 +466,7 @@ void CbmKfTrackFitter::AddMaterialEffects(const CbmKfTrackFitter::Track& t, CbmK
   fFit.EnergyLossCorrection(n.fRadThick, upstreamDirection ? fvec::One() : fvec::Zero());
 }
 
+
 void CbmKfTrackFitter::FitTrack(CbmKfTrackFitter::Track& t)
 {
   // fit the track
diff --git a/reco/KF/CbmKfTrackFitter.h b/reco/KF/CbmKfTrackFitter.h
index 7e17effd462847d723d99687632d7d097ae81ff7..f9ba682f713a29aca8a82adb71bd5b59a3cd2ee7 100644
--- a/reco/KF/CbmKfTrackFitter.h
+++ b/reco/KF/CbmKfTrackFitter.h
@@ -65,8 +65,9 @@ class CbmKfTrackFitter {
 
     ca::MeasurementTime<ca::fvec> fMt{};  ///< time measurement at fZ
 
-    ECbmModuleId fSystemId{ECbmModuleId::kNotExist};  ///< detector system ID of the hit
-    int fAddress{-1};                                 ///< detector ID of the hit
+    ECbmModuleId fHitSystemId{ECbmModuleId::kNotExist};  ///< detector system ID of the hit
+    int fHitAddress{-1};                                 ///< detector ID of the hit
+    int fHitIndex{-1};                                   ///< hit index in the detector hit array
 
     /// == Flags etc
     bool fIsXySet{false};        ///< true if the XY measurement is set
@@ -109,11 +110,8 @@ class CbmKfTrackFitter {
   /// set electron flag (bremmstrallung will be applied)
   void SetElectronFlag(bool isElectron);
 
-  bool CreateTrack(Track& kfTrack, const FairTrackParam& trackFirst, const std::vector<CbmMvdHit>& mvdHits,
-                   const std::vector<CbmStsHit>& stsHits, const std::vector<CbmMuchPixelHit>& muchHits,
-                   const std::vector<CbmTrdHit>& trdHits, const std::vector<CbmTofHit>& tofHits);
-
-  bool CreateMvdStsTrack(Track& kfTrack, const CbmStsTrack& stsTrack);
+  bool CreateMvdStsTrack(Track& kfTrack, int stsTrackIndex);
+  bool CreateGlobalTrack(Track& kfTrack, int globalTrackIndex);
   bool CreateGlobalTrack(Track& kfTrack, const CbmGlobalTrack& globalTrack);
 
   /// fit the track
diff --git a/reco/L1/qa/CbmCaTrackFitQa.cxx b/reco/L1/qa/CbmCaTrackFitQa.cxx
index f642be83d43949bbb5d22a2453e65b8c4f3fddda..e7b612b521b22aa6b384310d47844d1be6bdfe6d 100644
--- a/reco/L1/qa/CbmCaTrackFitQa.cxx
+++ b/reco/L1/qa/CbmCaTrackFitQa.cxx
@@ -224,8 +224,8 @@ void TrackFitQa::SetDefaultProperties()
   fvRLo[ETrackParType::kQP]     = -.3;     ///< Lower boundary, residual of q/p [ec/GeV]
   fvRUp[ETrackParType::kQP]     = +.3;     ///< Upper boundary, residual of q/p [ec/GeV]
   fvRBins[ETrackParType::kTIME] = 200;     ///< Number of bins, residual of time
-  fvRLo[ETrackParType::kTIME]   = -1.;     ///< Lower boundary, residual of time [ns]
-  fvRUp[ETrackParType::kTIME]   = +1.;     ///< Upper boundary, residual of time [ns]
+  fvRLo[ETrackParType::kTIME]   = -10.;    ///< Lower boundary, residual of time [ns]
+  fvRUp[ETrackParType::kTIME]   = +10.;    ///< Upper boundary, residual of time [ns]
   fvRBins[ETrackParType::kVI]   = 200;     ///< Number of bins, residual of inverse speed
   fvRLo[ETrackParType::kVI]     = -2.;     ///< Lower boundary, residual of inverse speed [1/c]
   fvRUp[ETrackParType::kVI]     = +2.;     ///< Upper boundary, residual of inverse speed [1/c]
diff --git a/reco/alignment/CbmBbaAlignmentTask.cxx b/reco/alignment/CbmBbaAlignmentTask.cxx
index c7e143158b467746d97c005e3b6f044e26854b5c..3df2712526b61ac2ca3fcb37f7c83ff64a772957 100644
--- a/reco/alignment/CbmBbaAlignmentTask.cxx
+++ b/reco/alignment/CbmBbaAlignmentTask.cxx
@@ -60,7 +60,7 @@ void CbmBbaAlignmentTask::TrackContainer::MakeConsistent()
   fNtrdHits  = 0;
   fNtofHits  = 0;
   for (const auto& n : fUnalignedTrack.fNodes) {
-    switch (n.fSystemId) {
+    switch (n.fHitSystemId) {
       case ECbmModuleId::kMvd: fNmvdHits++; break;
       case ECbmModuleId::kSts: fNstsHits++; break;
       case ECbmModuleId::kMuch: fNmuchHits++; break;
@@ -177,7 +177,7 @@ void CbmBbaAlignmentTask::Exec(Option_t* /*opt*/)
       const CbmStsTrack* stsTrack = dynamic_cast<CbmStsTrack*>(fInputStsTracks->At(iTr));
       if (!stsTrack) continue;
       TrackContainer t;
-      if (!fFitter.CreateMvdStsTrack(t.fUnalignedTrack, *stsTrack)) continue;
+      if (!fFitter.CreateMvdStsTrack(t.fUnalignedTrack, iTr)) continue;
       t.MakeConsistent();
       fFitter.FitTrack(t.fUnalignedTrack);
       t.fAlignedTrack = t.fUnalignedTrack;