diff --git a/algo/ca/TrackingChain.cxx b/algo/ca/TrackingChain.cxx
index e9f8ab396a3e3f6fa966128d663bab569399564b..451d9cd177c68396d1cf9810e05b139580dd6397 100644
--- a/algo/ca/TrackingChain.cxx
+++ b/algo/ca/TrackingChain.cxx
@@ -55,21 +55,25 @@ void TrackingChain::Init()
 TrackingChain::Return_t TrackingChain::Run(Input_t recoResults)
 {
   //xpu::scoped_timer t_("CA");  // TODO: pass timings to monitoring for throughput?
-  ca::TrackingMonitorData monitorData;
+  fCaMonitorData.Reset();
+  fCaMonitorData.StartTimer(ca::ETimer::Tracking);
 
   // ----- Init input data ---------------------------------------------------------------------------------------------
+  fCaMonitorData.StartTimer(ca::ETimer::PrepareInput);
   this->PrepareInput(recoResults);
+  fCaMonitorData.StopTimer(ca::ETimer::PrepareInput);
 
   // ----- Run reconstruction ------------------------------------------------------------------------------------------
-  fCaFramework.SetMonitorData(monitorData);
+  fCaFramework.SetMonitorData(fCaMonitorData);
   fCaFramework.fTrackFinder.FindTracks();
-  monitorData = fCaFramework.GetMonitorData();
-  L_(info) << "Timeslice contains " << monitorData.GetCounterValue(ca::ECounter::RecoTrack) << " tracks";
+  fCaMonitorData = fCaFramework.GetMonitorData();
+  L_(info) << "Timeslice contains " << fCaMonitorData.GetCounterValue(ca::ECounter::RecoTrack) << " tracks";
 
   // ----- Init output data --------------------------------------------------------------------------------------------
   // FIXME: SZh 22.10.2023: Provide a class for the tracking output data (tracks, hit indices and monitor)
-  fCaMonitor.AddMonitorData(monitorData);
-  return std::make_pair(std::move(fCaFramework.fRecoTracks), monitorData);
+  fCaMonitor.AddMonitorData(fCaMonitorData);
+  fCaMonitorData.StopTimer(ca::ETimer::Tracking);
+  return std::make_pair(std::move(fCaFramework.fRecoTracks), fCaMonitorData);
 }
 
 // ---------------------------------------------------------------------------------------------------------------------
@@ -97,9 +101,12 @@ void TrackingChain::PrepareInput(Input_t recoResults)
 template<EDetectorID DetID>
 void TrackingChain::ReadHits(PartitionedSpan<const ca::HitTypes_t::at<DetID>> hits)
 {
-  using Hit_t          = ca::HitTypes_t::at<DetID>;
-  constexpr bool IsSTS = (DetID == EDetectorID::Sts);
-  constexpr bool IsTOF = (DetID == EDetectorID::Tof);
+  using Hit_t           = ca::HitTypes_t::at<DetID>;
+  constexpr bool IsMvd  = (DetID == EDetectorID::Mvd);
+  constexpr bool IsSts  = (DetID == EDetectorID::Sts);
+  constexpr bool IsMuch = (DetID == EDetectorID::Much);
+  constexpr bool IsTrd  = (DetID == EDetectorID::Trd);
+  constexpr bool IsTof  = (DetID == EDetectorID::Tof);
 
   xpu::t_add_bytes(hits.NElements() * sizeof(Hit_t));  // Assumes call from Run, for existence of timer!
 
@@ -112,8 +119,8 @@ void TrackingChain::ReadHits(PartitionedSpan<const ca::HitTypes_t::at<DetID>> hi
     int iStLocal       = -1;
     // FIXME: This definition of the station index works only for STS, and there is no any guaranty, that it will
     //        work for other mCBM setups.
-    if constexpr (IsSTS) { iStLocal = (extHitAddress >> 4) & 0xF; }
-    if constexpr (IsTOF) { iStLocal = tof::Config::GetTofTrackingStation(extHitAddress); }
+    if constexpr (IsSts) { iStLocal = (extHitAddress >> 4) & 0xF; }
+    if constexpr (IsTof) { iStLocal = tof::Config::GetTofTrackingStation(extHitAddress); }
 
     int iStActive  = (iStLocal != -1) ? fCaFramework.GetParameters().GetStationIndexActive(iStLocal, DetID) : -1;
     size_t iOffset = hits.Offsets()[iPartition];
@@ -124,7 +131,7 @@ void TrackingChain::ReadHits(PartitionedSpan<const ca::HitTypes_t::at<DetID>> hi
       int iHitExt     = iOffset + iPartHit;
       // ---- Fill ca::Hit
       ca::Hit caHit;
-      if constexpr (IsSTS) {
+      if constexpr (IsSts) {
         caHit.SetFrontKey(firstHitKey + hit.fFrontClusterId);
         caHit.SetBackKey(firstHitKey + hit.fBackClusterId);
       }
@@ -138,7 +145,7 @@ void TrackingChain::ReadHits(PartitionedSpan<const ca::HitTypes_t::at<DetID>> hi
       caHit.SetT(hit.Time());
       caHit.SetDx2(hit.Dx() * hit.Dx());
       caHit.SetDy2(hit.Dy() * hit.Dy());
-      if constexpr (IsSTS) caHit.SetDxy(hit.fDxy);
+      if constexpr (IsSts) caHit.SetDxy(hit.fDxy);
       caHit.SetDt2(hit.TimeError() * hit.TimeError());
       /// FIXME: Define ranges from the hit, when will be available
       caHit.SetRangeX(3.5 * hit.Dx());
@@ -146,10 +153,19 @@ void TrackingChain::ReadHits(PartitionedSpan<const ca::HitTypes_t::at<DetID>> hi
       caHit.SetRangeT(3.5 * hit.TimeError());
       caHit.SetStation(iStActive);
       caHit.SetId(fCaDataManager.GetNofHits());
-      fCaDataManager.PushBackHit(caHit, dataStream);
+      if (caHit.Check()) {
+        fCaDataManager.PushBackHit(caHit, dataStream);
+        if (fNofHitKeys <= caHit.FrontKey()) { fNofHitKeys = caHit.FrontKey() + 1; }
+        if (fNofHitKeys <= caHit.BackKey()) { fNofHitKeys = caHit.BackKey() + 1; }
+      }
+      else {
+        if constexpr (IsMvd) { fCaMonitorData.IncrementCounter(ca::ECounter::UndefinedMvdHit); }
+        if constexpr (IsSts) { fCaMonitorData.IncrementCounter(ca::ECounter::UndefinedStsHit); }
+        if constexpr (IsMuch) { fCaMonitorData.IncrementCounter(ca::ECounter::UndefinedMuchHit); }
+        if constexpr (IsTrd) { fCaMonitorData.IncrementCounter(ca::ECounter::UndefinedTrdHit); }
+        if constexpr (IsTof) { fCaMonitorData.IncrementCounter(ca::ECounter::UndefinedTofHit); }
+      }
       // ---- Update number of hit keys
-      if (fNofHitKeys <= caHit.FrontKey()) { fNofHitKeys = caHit.FrontKey() + 1; }
-      if (fNofHitKeys <= caHit.BackKey()) { fNofHitKeys = caHit.BackKey() + 1; }
     }  // iPartHit
   }    // iPartition
 }
diff --git a/algo/ca/TrackingChain.h b/algo/ca/TrackingChain.h
index 22f8a4a7db4bdd06c9992e0da8bcac32cb73a818..29301e005fb743d7f0edac848aaab28c3e99edaf 100644
--- a/algo/ca/TrackingChain.h
+++ b/algo/ca/TrackingChain.h
@@ -73,10 +73,10 @@ namespace cbm::algo
     // *************************
     // **  Framework variables
 
-    ca::TrackingMonitor fCaMonitor {};  ///< CA internal monitor (debug purposes)
-    ca::Framework fCaFramework {};      ///< CA framework instance
-    ca::DataManager fCaDataManager {};  ///< CA data manager
-
+    ca::TrackingMonitor fCaMonitor {};          ///< CA internal monitor (debug purposes)
+    ca::TrackingMonitorData fCaMonitorData {};  ///< CA monitor data object
+    ca::Framework fCaFramework {};              ///< CA framework instance
+    ca::DataManager fCaDataManager {};          ///< CA data manager
 
     // ************************
     // **  Auxilary variables
diff --git a/algo/ca/core/data/CaHit.h b/algo/ca/core/data/CaHit.h
index 6a090f3c05ed5bade8d0c022a96ba9ad4d71d80b..1544c57fb1f676679cd5fa9e43599d69d7100070 100644
--- a/algo/ca/core/data/CaHit.h
+++ b/algo/ca/core/data/CaHit.h
@@ -29,6 +29,11 @@ namespace cbm::algo::ca
     /// Default constructor
     Hit() = default;
 
+    /// \brief Checks, if the hit is defined
+    /// \return true  Hit is defined
+    /// \return false Hit is undefined and will be skipped
+    bool Check() const;
+
     ///-----------------------------------------------------------------------------
     /// setters
 
@@ -182,4 +187,20 @@ namespace cbm::algo::ca
     }
   };
 
+  // -------------------------------------------------------------------------------------------------------------------
+  //
+  inline bool Hit::Check() const
+  {
+    bool res = true;
+    res &= std::isfinite(fX);
+    res &= std::isfinite(fY);
+    res &= std::isfinite(fZ);
+    res &= std::isfinite(fT);
+    res &= std::isfinite(fDx2);
+    res &= std::isfinite(fDy2);
+    res &= std::isfinite(fDxy);
+    res &= std::isfinite(fDt2);
+    return res;
+  }
+
 }  // namespace cbm::algo::ca
diff --git a/algo/ca/core/tracking/CaTrackFinder.cxx b/algo/ca/core/tracking/CaTrackFinder.cxx
index fac6e0986958c1d3d1847473835d712ab6c93ddd..37f0c51a79aeba28627eb03f0952da9aa16cfcc2 100644
--- a/algo/ca/core/tracking/CaTrackFinder.cxx
+++ b/algo/ca/core/tracking/CaTrackFinder.cxx
@@ -49,7 +49,7 @@ void TrackFinder::FindTracks()
   //
   frAlgo.fMonitorData.IncrementCounter(ECounter::TrackingCall);
   frAlgo.fMonitorData.IncrementCounter(ECounter::RecoHit, frAlgo.fInputData.GetNhits());
-  frAlgo.fMonitorData.StartTimer(ETimer::Tracking);
+  frAlgo.fMonitorData.StartTimer(ETimer::FindTracks);
 
   auto timerStart = std::chrono::high_resolution_clock::now();
 
@@ -304,7 +304,7 @@ void TrackFinder::FindTracks()
     tsStart -= 5;  // do 5 ns margin
   }
 
-  frAlgo.fMonitorData.StopTimer(ETimer::Tracking);
+  frAlgo.fMonitorData.StopTimer(ETimer::FindTracks);
   frAlgo.fMonitorData.IncrementCounter(ECounter::RecoTrack, frAlgo.fRecoTracks.size());
   frAlgo.fMonitorData.IncrementCounter(ECounter::RecoHitUsed, frAlgo.fRecoHits.size());
 
diff --git a/algo/ca/core/utils/CaTrackingMonitor.h b/algo/ca/core/utils/CaTrackingMonitor.h
index d127d0f1135e557bce5b5702dc924fd09da960f7..2d76b3ee1aa791c4a9f81e51176cc97c339c08b3 100644
--- a/algo/ca/core/utils/CaTrackingMonitor.h
+++ b/algo/ca/core/utils/CaTrackingMonitor.h
@@ -23,6 +23,12 @@ namespace cbm::algo::ca
     RecoHit,       ///< number of reconstructed hits
     RecoHitUsed,   ///< number of used reconstructed hits
     Triplet,       ///< number of triplets
+    // TODO: Provide counters vs. detector ID
+    UndefinedMvdHit,   ///< number of undefined MVD hits
+    UndefinedStsHit,   ///< number of undefined STS hits
+    UndefinedMuchHit,  ///< number of undefined MuCh hits
+    UndefinedTrdHit,   ///< number of undefined TRD hits
+    UndefinedTofHit,   ///< number of undefined TOF hits
     kEND
   };
 
@@ -31,6 +37,8 @@ namespace cbm::algo::ca
   enum class ETimer
   {
     Tracking,
+    PrepareInput,
+    FindTracks,
     TrackFinder,
     TrackFitter,
     TripletConstruction,
@@ -53,7 +61,14 @@ namespace cbm::algo::ca
       SetCounterName(ECounter::Triplet, "triplets");
       SetCounterName(ECounter::RecoHitUsed, "used reco hits");
       SetCounterName(ECounter::SubTS, "sub-timeslices");
+      SetCounterName(ECounter::UndefinedMvdHit, "undefined MVD hits");
+      SetCounterName(ECounter::UndefinedStsHit, "undefined STS hits");
+      SetCounterName(ECounter::UndefinedMuchHit, "undefined MuCh hits");
+      SetCounterName(ECounter::UndefinedTrdHit, "undefined TRD hits");
+      SetCounterName(ECounter::UndefinedTofHit, "undefined TOF hits");
       SetTimerName(ETimer::Tracking, "full tracking");
+      SetTimerName(ETimer::PrepareInput, "input data initialization");
+      SetTimerName(ETimer::FindTracks, "find tracks procedure");
       SetTimerName(ETimer::TrackFinder, "track finder");
       SetTimerName(ETimer::TrackFitter, "track fitter");
       SetTimerName(ETimer::TripletConstruction, "triplet construction");