diff --git a/reco/L1/CMakeLists.txt b/reco/L1/CMakeLists.txt
index 0168f1d368b1f669c76e1132adc6e3dc505a8e47..e57ee75a653da7ffa49e822234029f989c62e34a 100644
--- a/reco/L1/CMakeLists.txt
+++ b/reco/L1/CMakeLists.txt
@@ -1,9 +1,9 @@
-#Create a library called "libL1" which includes the source files given in
-#the array.
-#The extension is already found.Any number of sources could be listed here.
+# Create a library called "libL1" which includes the source files given in
+# the array.
+# The extension is already found.Any number of sources could be listed here.
 
 # extra warnings to examine the code
-#ADD_DEFINITIONS(-Wall -Wextra -Wshadow -Weffc++)
+# ADD_DEFINITIONS(-Wall -Wextra -Wshadow -Weffc++)
 
 # L1 defines
 ADD_DEFINITIONS(-DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS)
@@ -18,31 +18,35 @@ set(INCLUDE_DIRECTORIES
   ${CMAKE_CURRENT_SOURCE_DIR}/qa
   ${CMAKE_CURRENT_SOURCE_DIR}/L1Algo/utils
   ${CMAKE_CURRENT_SOURCE_DIR}/catools
-  )
+)
 
 set(SRCS
-  #L1Algo / L1CATrackFinder.cxx
-  #CbmL1Performance.cxx
-  #CbmL1ReadEvent.cxx
-  #CbmL1CATrdTrackFinderSA.cxx 
-  CbmL1TrdTracklet.cxx 
-  CbmL1TrdTracklet4.cxx 
+
+  # L1Algo / L1CATrackFinder.cxx
+  # CbmL1Performance.cxx
+  # CbmL1ReadEvent.cxx
+  # CbmL1CATrdTrackFinderSA.cxx
+  CbmL1TrdTracklet.cxx
+  CbmL1TrdTracklet4.cxx
   CbmL1.cxx
-  #CbmL1TrdTrackFinderSts.cxx 
-  CbmL1TrackMerger.cxx 
+
+  # CbmL1TrdTrackFinderSts.cxx
+  CbmL1TrackMerger.cxx
   CbmL1TofMerger.cxx
- # L1AlgoInputData.cxx
-  OffLineInterface/CbmL1StsTrackFinder.cxx 
-  OffLineInterface/CbmL1GlobalTrackFinder.cxx 
+
+  # L1AlgoInputData.cxx
+  OffLineInterface/CbmL1StsTrackFinder.cxx
+  OffLineInterface/CbmL1GlobalTrackFinder.cxx
   OffLineInterface/CbmL1GlobalFindTracksEvents.cxx
 
   L1Algo/L1Algo.cxx
+  L1Algo/L1TrackPar.cxx
   L1Algo/L1CATrackFinder.cxx
   L1Algo/L1BranchExtender.cxx
   L1Algo/L1TrackFitter.cxx
   L1Algo/L1HitsSortHelper.cxx
   L1Algo/L1Grid.cxx
-  CbmL1Performance.cxx 
+  CbmL1Performance.cxx
   CbmL1ReadEvent.cxx
   CbmCaPerformance.cxx
   L1Algo/L1Station.cxx
@@ -105,41 +109,41 @@ set(HEADERS
   qa/CbmCaInputQaBase.h
 )
 
-
-
-
 If(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
-  ADD_DEFINITIONS(-Wall -Wsign-promo -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wno-parentheses) #   -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root.
-#-- - Check for compiler flags
+  ADD_DEFINITIONS(-Wall -Wsign-promo -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wno-parentheses) # -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root.
+
+  # -- - Check for compiler flags
   CHECK_CXX_COMPILER_FLAG("-Werror -Wno-pmf-conversions" HAS_PMF)
+
   If(HAS_PMF)
     ADD_DEFINITIONS(-Wno-pmf-conversions)
   EndIf()
+
   CHECK_CXX_COMPILER_FLAG("-Werror -Wstrict-null-sentinel" HAS_SENTINEL)
+
   If(HAS_SENTINEL)
     ADD_DEFINITIONS(-Wstrict-null-sentinel)
   EndIf()
+
   CHECK_CXX_COMPILER_FLAG("-Werror -Wno-non-template-friend" HAS_TEMPLATE_FRIEND)
+
   If(HAS_TEMPLATE_FRIEND)
     ADD_DEFINITIONS(-Wno-non-template-friend)
   EndIf()
 Else()
-  ADD_DEFINITIONS(-Wall -Wsign-promo  -Wno-pmf-conversions -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wstrict-null-sentinel -Wno-non-template-friend -Wno-parentheses) #   -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root. 
+  ADD_DEFINITIONS(-Wall -Wsign-promo -Wno-pmf-conversions -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wstrict-null-sentinel -Wno-non-template-friend -Wno-parentheses) # -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root.
 EndIf()
 
-
-IF (SSE_FOUND)
+IF(SSE_FOUND)
   ADD_DEFINITIONS(-DHAVE_SSE)
-  SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS 
-  "-msse -O3")
+  SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS
+    "-msse -O3")
   Message(STATUS "L1 will be compiled with SSE support")
-ELSE (SSE_FOUND)
+ELSE(SSE_FOUND)
   Message(STATUS "L1 will be compiled without SSE support")
-  SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS 
-  "-O3")
-ENDIF (SSE_FOUND)
-
-
+  SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS
+    "-O3")
+ENDIF(SSE_FOUND)
 
 set(LIBRARY_NAME L1)
 set(LINKDEF ${LIBRARY_NAME}LinkDef.h)
@@ -155,10 +159,10 @@ set(PUBLIC_DEPENDENCIES
   ROOT::Graf
   ROOT::Hist
   ROOT::Physics
-  )
+)
 
 if(OpenMP_CXX_FOUND)
-    list(APPEND PUBLIC_DEPENDENCIES OpenMP::OpenMP_CXX)
+  list(APPEND PUBLIC_DEPENDENCIES OpenMP::OpenMP_CXX)
 endif()
 
 set(PRIVATE_DEPENDENCIES
@@ -181,38 +185,37 @@ set(PRIVATE_DEPENDENCIES
   ROOT::Matrix
   ROOT::Minuit
   ROOT::RIO
-  )
-
+)
 
 generate_cbm_library()
 
 add_dependencies(G__L1 KFPARTICLE)
 
 install(FILES CbmL1Counters.h
-              L1Algo/L1Assert.h
-              L1Algo/L1EventEfficiencies.h
-              L1Algo/L1Branch.h
-              L1Algo/L1HitPoint.h
-              L1Algo/L1Hit.h
-              L1Algo/L1Portion.h
-              L1Algo/L1Triplet.h
-              L1Algo/L1Event.h
-              L1Algo/L1EventMatch.h
-              L1Algo/L1ObjectInitController.h
-              L1Algo/L1Constants.h
-              L1Algo/L1Utils.h
-              L1Algo/L1NaN.h
-              L1Algo/L1SimdSerializer.h
-              L1Algo/L1TrackPar.h
-              L1Algo/L1Track.h
-              qa/CbmCaInputQaBase.h
-        DESTINATION include
-       )
+  L1Algo/L1Assert.h
+  L1Algo/L1EventEfficiencies.h
+  L1Algo/L1Branch.h
+  L1Algo/L1HitPoint.h
+  L1Algo/L1Hit.h
+  L1Algo/L1Portion.h
+  L1Algo/L1Triplet.h
+  L1Algo/L1Event.h
+  L1Algo/L1EventMatch.h
+  L1Algo/L1ObjectInitController.h
+  L1Algo/L1Constants.h
+  L1Algo/L1Utils.h
+  L1Algo/L1NaN.h
+  L1Algo/L1SimdSerializer.h
+  L1Algo/L1TrackPar.h
+  L1Algo/L1Track.h
+  qa/CbmCaInputQaBase.h
+  DESTINATION include
+)
 
 install(FILES L1Algo/L1Algo.h
-              L1Algo/L1Branch.h
-              L1Algo/L1Field.h
-              L1Algo/L1Hit.h
-              L1Algo/L1Vector.h
-        DESTINATION include/L1Algo
-       )
+  L1Algo/L1Branch.h
+  L1Algo/L1Field.h
+  L1Algo/L1Hit.h
+  L1Algo/L1Vector.h
+  DESTINATION include/L1Algo
+)
diff --git a/reco/L1/L1Algo/L1BranchExtender.cxx b/reco/L1/L1Algo/L1BranchExtender.cxx
index 64beea36593134832fce9bfedaa2cbad142bc1e1..00d60be0de2bf0ec1f6a6dd3cd1e6de48d1348fd 100644
--- a/reco/L1/L1Algo/L1BranchExtender.cxx
+++ b/reco/L1/L1Algo/L1BranchExtender.cxx
@@ -70,7 +70,6 @@ void L1Algo::BranchFitterFast(const L1Branch& t, L1TrackPar& Tout, const bool di
 
   fvec dzi = fvec(1.) / (z1 - z0);
 
-  const fvec vINF = fvec(.1);
   T.x             = x0;
   T.y             = y0;
   if (initParams) {
@@ -80,23 +79,15 @@ void L1Algo::BranchFitterFast(const L1Branch& t, L1TrackPar& Tout, const bool di
   }
   fit.SetQp0(qp0);
 
-  T.z = z0;
-  T.t = hit0.t;
+  T.z  = z0;
+  T.t  = hit0.t;
+  T.vi = 0.;
 
-  // T.t[0]=(hit0.t+hit1.t+hit2.t)/3;
-  T.chi2 = fvec(0.);
-  T.NDF  = fvec(2.);
+  T.ResetErrors(1., 1., .1, .1, 1., (sta0.timeInfo ? hit0.dt2 : 1.e6), 1.e6);
+  T.NDF = fvec(2.);
 
   std::tie(T.C00, T.C10, T.C11) = sta0.FormXYCovarianceMatrix(hit0.du2, hit0.dv2);
 
-  T.C20 = T.C21 = 0;
-  T.C30 = T.C31 = T.C32 = 0;
-  T.C40 = T.C41 = T.C42 = T.C43 = 0;
-  T.C50 = T.C51 = T.C52 = T.C53 = T.C54 = 0;
-  T.C22 = T.C33 = vINF;
-  T.C44         = 1.;
-  T.C55         = sta0.timeInfo ? hit0.dt2 : vINF;
-
   L1FieldValue fldB0, fldB1, fldB2 _fvecalignment;
   L1FieldRegion fld _fvecalignment;
   fvec fldZ0 = sta1.fZ;  // suppose field is smoth
diff --git a/reco/L1/L1Algo/L1CATrackFinder.cxx b/reco/L1/L1Algo/L1CATrackFinder.cxx
index a35ab55006d2ba094bcef87c882e71c0137c5af2..0a9f7e8efb27f2d8e5a3cc7a54d9556dbd341db3 100644
--- a/reco/L1/L1Algo/L1CATrackFinder.cxx
+++ b/reco/L1/L1Algo/L1CATrackFinder.cxx
@@ -260,12 +260,6 @@ inline void L1Algo::findSingletsStep1(  /// input 1st stage of singlet search
 
     L1TrackPar& T = fit.Tr();
 
-    T.chi2 = 0.;
-    T.NDF  = (fpCurrentIteration->GetPrimaryFlag()) ? fvec(2.) : fvec(0.);
-
-    // TODO: iteration parameter: "Starting NDF of track parameters"
-    // NDF = number of track parameters (6: x, y, tx, ty, qp, time) - number of measured parameters (3: x, y, time) on station or (2: x, y) on target
-
     T.x  = xl;
     T.y  = yl;
     T.z  = zl;
@@ -273,16 +267,18 @@ inline void L1Algo::findSingletsStep1(  /// input 1st stage of singlet search
     T.ty = ty;
     T.qp = fvec(0.);
     T.t  = time;
+    T.vi = fvec(0.);
 
-    T.C20 = T.C21 = fvec(0.);
-    T.C30 = T.C31 = T.C32 = fvec(0.);
-    T.C40 = T.C41 = T.C42 = T.C43 = fvec(0.);
-    T.C50 = T.C51 = T.C52 = T.C53 = T.C54 = fvec(0.);
+    fvec txErr2 = fMaxSlopePV * fMaxSlopePV / fvec(9.);
+    fvec qpErr2 = fMaxInvMom * fMaxInvMom / fvec(9.);
 
-    T.C22 = T.C33 = fMaxSlopePV * fMaxSlopePV / fvec(9.);
+    T.ResetErrors(1., 1., txErr2, txErr2, qpErr2, timeEr2, 1.e2);
+
+    T.chi2 = 0.;
+    T.NDF  = (fpCurrentIteration->GetPrimaryFlag()) ? fvec(2.) : fvec(0.);
 
-    T.C44 = fMaxInvMom / fvec(3.) * fMaxInvMom / fvec(3.);
-    T.C55 = timeEr2;
+    // TODO: iteration parameter: "Starting NDF of track parameters"
+    // NDF = number of track parameters (6: x, y, tx, ty, qp, time) - number of measured parameters (3: x, y, time) on station or (2: x, y) on target
 
     {  // add the target constraint
 
@@ -609,7 +605,7 @@ inline void L1Algo::findTripletsStep0(  // input
 
     // add the middle hit
 
-    fit.ExtrapolateLine(zPos_2);
+    fit.ExtrapolateLineNoField(zPos_2);
 
     fit.Filter(stam.frontInfo, u_front_2, du2_2);
     fit.Filter(stam.backInfo, u_back_2, dv2_2);
@@ -686,14 +682,17 @@ inline void L1Algo::findTripletsStep0(  // input
         fit3.SetTrack(T2);
         L1TrackPar& T_cur = fit3.Tr();
 
-        fit3.ExtrapolateLine(zr);
+        fit3.ExtrapolateLineNoField(zr);
 
-        if ((star.timeInfo) && (stam.timeInfo))
-          if (fabs(T_cur.t[i2_4] - hitr.T()) > sqrt(T_cur.C55[i2_4] + hitr.dT2()) * 5) continue;
+        if ((star.timeInfo) && (stam.timeInfo)) {
+          auto dt = T_cur.t[i2_4] - hitr.T();
+          if (dt > (T_cur.C55[i2_4] + hitr.dT2()) * 5) continue;
+        }
 
         // TODO: SG: hardcoded cut of 30 ns
-        if ((star.timeInfo) && (stam.timeInfo))
+        if ((star.timeInfo) && (stam.timeInfo)) {
           if (fabs(T_cur.t[i2_4] - hitr.T()) > 30) continue;
+        }
 
         // - check whether hit belong to the window ( track position +\- errors ) -
         // check lower boundary
@@ -709,6 +708,7 @@ inline void L1Algo::findTripletsStep0(  // input
         const fscal dY2 = dY * dY;
 
         if (dY2 > dy_est2) continue;  // if (yr > y_plus_new [i2_4] ) continue;
+
         // check x-boundaries
         fvec x, C00;
         fit3.ExtrapolateXC00Line(zr, x, C00);
@@ -810,7 +810,7 @@ inline void L1Algo::findTripletsStep1(  // input
   fit.SetMask(fmask::One());
   for (Tindex i3_V = 0; i3_V < n3_V; ++i3_V) {
     fit.SetTrack(T_3[i3_V]);
-    fit.ExtrapolateLine(z_Pos[i3_V]);
+    fit.ExtrapolateLineNoField(z_Pos[i3_V]);
     fit.Filter(star.frontInfo, u_front_[i3_V], du2_3[i3_V]);
     fit.Filter(star.backInfo, u_back_[i3_V], dv2_3[i3_V]);
     if (kMcbm != fTrackingMode) { fit.FilterTime(t_3[i3_V], dt2_3[i3_V], star.timeInfo); }
@@ -917,6 +917,7 @@ inline void L1Algo::findTripletsStep2(Tindex n3, int istal, int istam, int istar
       T.tx      = (x[1] - x[0]) * dz01;
       T.ty      = (y[1] - y[0]) * dz01;
       T.qp      = 0.;  //(fscal) T3.qp[i3_4];
+      T.vi      = 0.;
     }
 
     // repeat several times in order to improve the precision
@@ -927,21 +928,18 @@ inline void L1Algo::findTripletsStep2(Tindex n3, int istal, int istam, int istar
         fit.Qp0()(fit.Qp0() > GetMaxInvMom())  = GetMaxInvMom();
         fit.Qp0()(fit.Qp0() < -GetMaxInvMom()) = -GetMaxInvMom();
 
-        T.ResetErrors(200., 200., 1., 1., 100., 1.e4);
-        //T.ResetErrors(200., 200., 10., 10., 100., 1.e4);
-        T.NDF   = ndf;
         T.qp    = 0.;
+        T.vi    = 0.;
         int ih0 = 0;
         T.x     = x[ih0];
         T.y     = y[ih0];
         T.z     = z[ih0];
         T.t     = t[ih0];
 
-        //std::tie(T.C00, T.C10, T.C11) = sta[ih0].FormXYCovarianceMatrix(du2[ih0], dv2[ih0]);
+        T.ResetErrors(1., 1., 1., 1., 100., (sta[ih0].timeInfo ? dt2[ih0] : 1.e6), 1.e2);
+        std::tie(T.C00, T.C10, T.C11) = sta[ih0].FormXYCovarianceMatrix(du2[ih0], dv2[ih0]);
 
-        fit.Filter(sta[ih0].frontInfo, u[ih0], du2[ih0]);
-        fit.Filter(sta[ih0].backInfo, v[ih0], dv2[ih0]);
-        fit.FilterTime(t[ih0], dt2[ih0], sta[ih0].timeInfo);
+        T.NDF = ndf;
 
         //  add the target constraint
         fit.AddTargetToLine(fTargX, fTargY, fTargZ, TargetXYInfo, fldTarget);
@@ -965,20 +963,19 @@ inline void L1Algo::findTripletsStep2(Tindex n3, int istal, int istam, int istar
         fit.Qp0()(fit.Qp0() > GetMaxInvMom())  = GetMaxInvMom();
         fit.Qp0()(fit.Qp0() < -GetMaxInvMom()) = -GetMaxInvMom();
 
-        T.ResetErrors(200., 200., 1., 1., 100., 1.e4);
         T.NDF   = ndf;
         T.qp    = 0.;
+        T.vi    = 0.;
         int ih0 = NHits - 1;
         T.x     = x[ih0];
         T.y     = y[ih0];
         T.z     = z[ih0];
         T.t     = t[ih0];
-        T.C55   = dt2[ih0];
 
-        //std::tie(T.C00, T.C10, T.C11) = sta[ih0].FormXYCovarianceMatrix(du2[ih0], dv2[ih0]);
-        fit.Filter(sta[ih0].frontInfo, u[ih0], du2[ih0]);
-        fit.Filter(sta[ih0].backInfo, v[ih0], dv2[ih0]);
-        fit.FilterTime(t[ih0], dt2[ih0], sta[ih0].timeInfo);
+        T.ResetErrors(1., 1., 1., 1., 100., (sta[ih0].timeInfo ? dt2[ih0] : 1.e6), 1.e2);
+        std::tie(T.C00, T.C10, T.C11) = sta[ih0].FormXYCovarianceMatrix(du2[ih0], dv2[ih0]);
+
+        T.NDF = ndf;
 
         for (int ih = NHits - 2; ih >= 0; --ih) {
           fit.Extrapolate(z[ih], fld);
diff --git a/reco/L1/L1Algo/L1CloneMerger.cxx b/reco/L1/L1Algo/L1CloneMerger.cxx
index 80a1f062b31b78be6980cd451a39f6059d514fd6..16a469c6d2615c02c57f08c9bfe70a096d718689 100644
--- a/reco/L1/L1Algo/L1CloneMerger.cxx
+++ b/reco/L1/L1Algo/L1CloneMerger.cxx
@@ -106,68 +106,12 @@ void L1CloneMerger::Exec(L1Vector<L1Track>& extTracks, L1Vector<L1HitIndex_t>& e
 
       unsigned short stab = firstStation[iTr];
 
-      Tb.x   = extTracks[iTr].TFirst[0];
-      Tb.y   = extTracks[iTr].TFirst[1];
-      Tb.tx  = extTracks[iTr].TFirst[2];
-      Tb.ty  = extTracks[iTr].TFirst[3];
-      Tb.qp  = extTracks[iTr].TFirst[4];
-      Tb.z   = extTracks[iTr].TFirst[5];
-      Tb.t   = extTracks[iTr].TFirst[6];
-      Tb.C00 = extTracks[iTr].CFirst[0];
-      Tb.C10 = extTracks[iTr].CFirst[1];
-      Tb.C11 = extTracks[iTr].CFirst[2];
-      Tb.C20 = extTracks[iTr].CFirst[3];
-      Tb.C21 = extTracks[iTr].CFirst[4];
-      Tb.C22 = extTracks[iTr].CFirst[5];
-      Tb.C30 = extTracks[iTr].CFirst[6];
-      Tb.C31 = extTracks[iTr].CFirst[7];
-      Tb.C32 = extTracks[iTr].CFirst[8];
-      Tb.C33 = extTracks[iTr].CFirst[9];
-      Tb.C40 = extTracks[iTr].CFirst[10];
-      Tb.C41 = extTracks[iTr].CFirst[11];
-      Tb.C42 = extTracks[iTr].CFirst[12];
-      Tb.C43 = extTracks[iTr].CFirst[13];
-      Tb.C44 = extTracks[iTr].CFirst[14];
-      Tb.C50 = extTracks[iTr].CFirst[15];
-      Tb.C51 = extTracks[iTr].CFirst[16];
-      Tb.C52 = extTracks[iTr].CFirst[17];
-      Tb.C53 = extTracks[iTr].CFirst[18];
-      Tb.C54 = extTracks[iTr].CFirst[19];
-      Tb.C55 = extTracks[iTr].CFirst[20];
-
+      Tb.copyFromArrays(extTracks[iTr].TFirst, extTracks[iTr].CFirst);
       fitB.SetQp0(fitB.Tr().qp);
 
       unsigned short staf = lastStation[jTr];
 
-      Tf.x   = extTracks[jTr].TLast[0];
-      Tf.y   = extTracks[jTr].TLast[1];
-      Tf.tx  = extTracks[jTr].TLast[2];
-      Tf.ty  = extTracks[jTr].TLast[3];
-      Tf.qp  = extTracks[jTr].TLast[4];
-      Tf.z   = extTracks[jTr].TLast[5];
-      Tf.t   = extTracks[jTr].TLast[6];
-      Tf.C00 = extTracks[jTr].CLast[0];
-      Tf.C10 = extTracks[jTr].CLast[1];
-      Tf.C11 = extTracks[jTr].CLast[2];
-      Tf.C20 = extTracks[jTr].CLast[3];
-      Tf.C21 = extTracks[jTr].CLast[4];
-      Tf.C22 = extTracks[jTr].CLast[5];
-      Tf.C30 = extTracks[jTr].CLast[6];
-      Tf.C31 = extTracks[jTr].CLast[7];
-      Tf.C32 = extTracks[jTr].CLast[8];
-      Tf.C33 = extTracks[jTr].CLast[9];
-      Tf.C40 = extTracks[jTr].CLast[10];
-      Tf.C41 = extTracks[jTr].CLast[11];
-      Tf.C42 = extTracks[jTr].CLast[12];
-      Tf.C43 = extTracks[jTr].CLast[13];
-      Tf.C44 = extTracks[jTr].CLast[14];
-      Tf.C50 = extTracks[jTr].CLast[15];
-      Tf.C51 = extTracks[jTr].CLast[16];
-      Tf.C52 = extTracks[jTr].CLast[17];
-      Tf.C53 = extTracks[jTr].CLast[18];
-      Tf.C54 = extTracks[jTr].CLast[19];
-      Tf.C55 = extTracks[jTr].CLast[20];
-
+      Tf.copyFromArrays(extTracks[jTr].TLast, extTracks[jTr].CLast);
       fitF.SetQp0(fitF.Tr().qp);
 
       if (fabs(Tf.t[0] - Tb.t[0]) > 3 * sqrt(Tf.C55[0] + Tb.C55[0])) continue;
diff --git a/reco/L1/L1Algo/L1Fit.cxx b/reco/L1/L1Algo/L1Fit.cxx
index 7ea106f6e0904a2398faf80fa1ab8cb4f467b357..1b17d6982fad5f290204f703ea3718fbfe2a76c5 100644
--- a/reco/L1/L1Algo/L1Fit.cxx
+++ b/reco/L1/L1Algo/L1Fit.cxx
@@ -9,8 +9,8 @@
 void L1Fit::Filter(const L1UMeasurementInfo& info, cnst& u, cnst& sigma2)
 {
   fvec zeta, HCH;
-  fvec F0, F1, F2, F3, F4, F5;
-  fvec K1, K2, K3, K4, K5;
+  fvec F0, F1, F2, F3, F4, F5, F6;
+  fvec K1, K2, K3, K4, K5, K6;
 
   zeta = info.cos_phi * fTr.x + info.sin_phi * fTr.y - u;
 
@@ -24,6 +24,7 @@ void L1Fit::Filter(const L1UMeasurementInfo& info, cnst& u, cnst& sigma2)
   F3 = info.cos_phi * fTr.C30 + info.sin_phi * fTr.C31;
   F4 = info.cos_phi * fTr.C40 + info.sin_phi * fTr.C41;
   F5 = info.cos_phi * fTr.C50 + info.sin_phi * fTr.C51;
+  F6 = info.cos_phi * fTr.C60 + info.sin_phi * fTr.C61;
 
   const fmask maskDoFilter = (HCH < sigma2 * 16.f);
   //cnst maskDoFilter = _f32vec4_true;
@@ -43,6 +44,7 @@ void L1Fit::Filter(const L1UMeasurementInfo& info, cnst& u, cnst& sigma2)
   K3 = F3 * wi;
   K4 = F4 * wi;
   K5 = F5 * wi;
+  K6 = F6 * wi;
 
   fTr.x -= F0 * zetawi;
   fTr.y -= F1 * zetawi;
@@ -50,6 +52,7 @@ void L1Fit::Filter(const L1UMeasurementInfo& info, cnst& u, cnst& sigma2)
   fTr.ty -= F3 * zetawi;
   fTr.qp -= F4 * zetawi;
   fTr.t -= F5 * zetawi;
+  fTr.vi -= F6 * zetawi;
 
   fTr.C00 -= F0 * F0 * wi;
   fTr.C10 -= K1 * F0;
@@ -72,6 +75,13 @@ void L1Fit::Filter(const L1UMeasurementInfo& info, cnst& u, cnst& sigma2)
   fTr.C53 -= K5 * F3;
   fTr.C54 -= K5 * F4;
   fTr.C55 -= K5 * F5;
+  fTr.C60 -= K6 * F0;
+  fTr.C61 -= K6 * F1;
+  fTr.C62 -= K6 * F2;
+  fTr.C63 -= K6 * F3;
+  fTr.C64 -= K6 * F4;
+  fTr.C65 -= K6 * F5;
+  fTr.C66 -= K6 * F6;
 }
 
 
@@ -86,6 +96,7 @@ void L1Fit::FilterTime(cnst& t, cnst& dt2, cnst& timeInfo)
   fvec F3 = fTr.C53;
   fvec F4 = fTr.C54;
   fvec F5 = fTr.C55;
+  fvec F6 = fTr.C65;
 
   fvec HCH = fTr.C55;
 
@@ -112,6 +123,7 @@ void L1Fit::FilterTime(cnst& t, cnst& dt2, cnst& timeInfo)
   fvec K3 = F3 * wi;
   fvec K4 = F4 * wi;
   fvec K5 = F5 * wi;
+  fvec K6 = F6 * wi;
 
   fTr.x -= F0 * zetawi;
   fTr.y -= F1 * zetawi;
@@ -119,6 +131,7 @@ void L1Fit::FilterTime(cnst& t, cnst& dt2, cnst& timeInfo)
   fTr.ty -= F3 * zetawi;
   fTr.qp -= F4 * zetawi;
   fTr.t -= F5 * zetawi;
+  fTr.vi -= F6 * zetawi;
 
   fTr.C00 -= F0 * F0 * wi;
   fTr.C10 -= K1 * F0;
@@ -141,6 +154,13 @@ void L1Fit::FilterTime(cnst& t, cnst& dt2, cnst& timeInfo)
   fTr.C53 -= K5 * F3;
   fTr.C54 -= K5 * F4;
   fTr.C55 -= K5 * F5;
+  fTr.C60 -= K6 * F0;
+  fTr.C61 -= K6 * F1;
+  fTr.C62 -= K6 * F2;
+  fTr.C63 -= K6 * F3;
+  fTr.C64 -= K6 * F4;
+  fTr.C65 -= K6 * F5;
+  fTr.C66 -= K6 * F6;
 }
 
 
@@ -149,8 +169,10 @@ void L1Fit::FilterXY(const L1XYMeasurementInfo& info, cnst& x, cnst& y)
   cnst TWO(2.);
 
   fvec zeta0, zeta1, S00, S10, S11, si;
-  fvec F00, F10, F20, F30, F40, F50, F01, F11, F21, F31, F41, F51;
-  fvec K00, K10, K20, K30, K40, K50, K01, K11, K21, K31, K41, K51;
+  fvec F00, F10, F20, F30, F40, F50, F60;
+  fvec F01, F11, F21, F31, F41, F51, F61;
+  fvec K00, K10, K20, K30, K40, K50, K60;
+  fvec K01, K11, K21, K31, K41, K51, K61;
 
   zeta0 = fTr.x - x;
   zeta1 = fTr.y - y;
@@ -162,12 +184,15 @@ void L1Fit::FilterXY(const L1XYMeasurementInfo& info, cnst& x, cnst& y)
   F30 = fTr.C30;
   F40 = fTr.C40;
   F50 = fTr.C50;
+  F60 = fTr.C60;
+
   F01 = fTr.C10;
   F11 = fTr.C11;
   F21 = fTr.C21;
   F31 = fTr.C31;
   F41 = fTr.C41;
   F51 = fTr.C51;
+  F61 = fTr.C61;
 
   S00 = F00 + info.C00;
   S10 = F10 + info.C10;
@@ -194,34 +219,51 @@ void L1Fit::FilterXY(const L1XYMeasurementInfo& info, cnst& x, cnst& y)
   K41 = F40 * S10 + F41 * S11;
   K50 = F50 * S00 + F51 * S10;
   K51 = F50 * S10 + F51 * S11;
+  K60 = F60 * S00 + F61 * S10;
+  K61 = F60 * S10 + F61 * S11;
 
   fTr.x -= K00 * zeta0 + K01 * zeta1;
   fTr.y -= K10 * zeta0 + K11 * zeta1;
   fTr.tx -= K20 * zeta0 + K21 * zeta1;
   fTr.ty -= K30 * zeta0 + K31 * zeta1;
   fTr.qp -= K40 * zeta0 + K41 * zeta1;
+  fTr.t -= K50 * zeta0 + K51 * zeta1;
+  fTr.vi -= K60 * zeta0 + K61 * zeta1;
 
   fTr.C00 -= K00 * F00 + K01 * F01;
+
   fTr.C10 -= K10 * F00 + K11 * F01;
   fTr.C11 -= K10 * F10 + K11 * F11;
+
   fTr.C20 -= K20 * F00 + K21 * F01;
   fTr.C21 -= K20 * F10 + K21 * F11;
   fTr.C22 -= K20 * F20 + K21 * F21;
+
   fTr.C30 -= K30 * F00 + K31 * F01;
   fTr.C31 -= K30 * F10 + K31 * F11;
   fTr.C32 -= K30 * F20 + K31 * F21;
   fTr.C33 -= K30 * F30 + K31 * F31;
+
   fTr.C40 -= K40 * F00 + K41 * F01;
   fTr.C41 -= K40 * F10 + K41 * F11;
   fTr.C42 -= K40 * F20 + K41 * F21;
   fTr.C43 -= K40 * F30 + K41 * F31;
   fTr.C44 -= K40 * F40 + K41 * F41;
+
   fTr.C50 -= K50 * F00 + K51 * F01;
   fTr.C51 -= K50 * F10 + K51 * F11;
   fTr.C52 -= K50 * F20 + K51 * F21;
   fTr.C53 -= K50 * F30 + K51 * F31;
   fTr.C54 -= K50 * F40 + K51 * F41;
   fTr.C55 -= K50 * F50 + K51 * F51;
+
+  fTr.C60 -= K60 * F00 + K61 * F01;
+  fTr.C61 -= K60 * F10 + K61 * F11;
+  fTr.C62 -= K60 * F20 + K61 * F21;
+  fTr.C63 -= K60 * F30 + K61 * F31;
+  fTr.C64 -= K60 * F40 + K61 * F41;
+  fTr.C65 -= K60 * F50 + K61 * F51;
+  fTr.C66 -= K60 * F60 + K61 * F61;
 }
 
 void L1Fit::FilterExtrapolatedXY(cnst& x, cnst& y, const L1XYMeasurementInfo& info, cnst& extrX, cnst& extrY,
@@ -315,10 +357,313 @@ void L1Fit::Extrapolate  // extrapolates track parameters and returns jacobian f
   while (!(fMaskF * abs(z_out - fTr.z) <= fvec(1.e-6)).isFull()) {
     fvec zNew                              = fTr.z + sgn * fvec(50.);  // max. 50 cm step
     zNew(sgn * (z_out - zNew) <= fvec(0.)) = z_out;
-    ExtrapolateStep(zNew, F);
+    ExtrapolateStepFull(zNew, F);
   }
 }
 
+void L1Fit::ExtrapolateStepFull  // extrapolates track parameters and returns jacobian for extrapolation of CovMatrix
+  (cnst& zOut,                   // extrapolate to this z position
+   const L1FieldRegion& F)
+{
+  // use Q/p linearisation at fQp0
+  // implementation of the Runge-Kutta method without optimization
+  //
+
+  //
+  // Forth-order Runge-Kutta method for solution of the equation
+  // of motion of a particle with parameter qp = Q /P
+  //              in the magnetic field B()
+  //
+  //   ( x )            tx
+  //   ( y )            ty
+  //   ( tx)        c_light * qp * L * (     tx*ty * Bx - (1+tx*tx) * By + ty * Bz  )
+  // d ( ty) / dz = c_light * qp * L * ( (1+ty*ty) * Bx     - tx*ty * By - tx * Bz  )  ,
+  //   ( qp)             0.
+  //   ( t )         L * vi
+  //   ( vi)             0.
+  //
+  //   where  L = sqrt ( 1 + tx*tx + ty*ty ) .
+  //   c_light = 0.000299792458 [(GeV/c)/kG/cm]
+  //   c_light_ns =  29.9792458 [cm/ns]
+  //
+  //  In the following for RK step :
+  //   r[7] = {x, y, tx, ty, qp, t, vi}
+  //   dr(z)/dz = f(z,r)
+  //
+  //
+  //========================================================================
+  //
+  //  NIM A395 (1997) 169-184; NIM A426 (1999) 268-282.
+  //
+  //  the routine is based on LHC(b) utility code
+  //
+  //========================================================================
+
+
+  cnst c_light = 0.000299792458;
+
+  //----------------------------------------------------------------
+
+  cnst zMasked = iif(fMask, zOut, fTr.z);
+
+  fvec qp_in = fTr.qp;
+  cnst h     = (zMasked - fTr.z);
+
+  cnst a[4] = {0., h * fvec(0.5), h * fvec(0.5), h};
+  cnst c[4] = {h / fvec(6.), h / fvec(3.), h / fvec(3.), h / fvec(6.)};
+
+  fvec f0[4] = {{0.}};  // ( dx/dz  )[step]
+  fvec f1[4] = {{0.}};  // ( dy/dz  )[step]
+  fvec f2[4] = {{0.}};  // ( dtx/dz )[step]
+  fvec f3[4] = {{0.}};  // ( dty/dz )[step]
+  fvec f4[4] = {{0.}};  // ( dqp/dz )[step]
+  fvec f5[4] = {{0.}};  // ( dt/dz  )[step]
+  fvec f6[4] = {{0.}};  // ( dvi/dz )[step]
+
+  //fvec df0[4][7] = {{0.}};  // df0[step] / d {x,y,tx,ty,qp,t,vi}
+  //fvec df1[4][7] = {{0.}};  // df1[step] / d {x,y,tx,ty,qp,t,vi}
+  fvec df2[4][7] = {{0.}};  // df2[step] / d {x,y,tx,ty,qp,t,vi}
+  fvec df3[4][7] = {{0.}};  // df3[step] / d {x,y,tx,ty,qp,t,vi}
+  //fvec df4[4][7] = {{0.}};  // df4[step] / d {x,y,tx,ty,qp,t,vi}
+  fvec df5[4][7] = {{0.}};  // df5[step] / d {x,y,tx,ty,qp,t,vi}
+  //fvec df6[4][7] = {{0.}};  // df6[step] / d {x,y,tx,ty,qp,t,vi}
+
+  fvec k[5][7] = {{0.}};  // [ step-1 ] [ {x,y,tx,ty,qp,t,vi} ]
+
+  //   Runge-Kutta steps for track parameters
+  //
+  {
+    fvec r0[7] = {fTr.x, fTr.y, fTr.tx, fTr.ty, fTr.qp, fTr.t, fTr.vi};
+
+    for (int step = 0; step < 4; ++step) {
+      fvec z = fTr.z + a[step];
+      fvec r[7];
+      for (int i = 0; i < 7; ++i) {
+        r[i] = r0[i] + a[step] * k[step][i];
+      }
+
+      fvec B[3];
+      cnst& Bx = B[0];
+      cnst& By = B[1];
+      cnst& Bz = B[2];
+
+      F.Get(r[0], r[1], z, B);
+
+      fvec tx    = r[2];
+      fvec ty    = r[3];
+      fvec tx2   = tx * tx;
+      fvec ty2   = ty * ty;
+      fvec txty  = tx * ty;
+      fvec L2    = fvec(1.) + tx2 + ty2;
+      fvec L2i   = fvec(1.) / L2;
+      fvec L     = sqrt(L2);
+      fvec cL    = c_light * L;
+      fvec cLqp0 = cL * fQp0;
+
+      f0[step] = tx;
+      f1[step] = ty;
+
+      fvec f2tmp   = (txty * Bx + ty * Bz) - (fvec(1.) + tx2) * By;
+      f2[step]     = cLqp0 * f2tmp;
+      df2[step][2] = cLqp0 * (tx * f2tmp * L2i + ty * Bx - fvec(2.) * tx * By);
+      df2[step][3] = cLqp0 * (ty * f2tmp * L2i + tx * Bx + Bz);
+      df2[step][4] = cL * f2tmp;
+
+      fvec f3tmp   = -txty * By - tx * Bz + (fvec(1.) + ty2) * Bx;
+      f3[step]     = cLqp0 * f3tmp;
+      df3[step][2] = cLqp0 * (tx * f3tmp * L2i - ty * By - Bz);
+      df3[step][3] = cLqp0 * (ty * f3tmp * L2i + fvec(2.) * ty * Bx - tx * By);
+      df3[step][4] = cL * f3tmp;
+
+      fvec vi = r[6];
+      fvec m2 = fMass2;
+      if (!fDoFitVelocity) { vi = sqrt(fvec(1.) + m2 * fQp0 * fQp0) / fvec(29.9792458f); }
+
+      f5[step]     = vi * L;
+      df5[step][2] = vi * tx / L;
+      df5[step][3] = vi * ty / L;
+      df5[step][4] = 0.;
+      df5[step][5] = 0.;
+      df5[step][6] = L;
+
+      if (!fDoFitVelocity) {
+        df5[step][4] = (m2 * fQp0) * (L / sqrt(fvec(1.) + m2 * fQp0 * fQp0) / fvec(29.9792458f));
+        df5[step][6] = 0.;
+      }
+
+      k[step + 1][0] = f0[step];
+      k[step + 1][1] = f1[step];
+      k[step + 1][2] = f2[step];
+      k[step + 1][3] = f3[step];
+      k[step + 1][4] = f4[step];  // == 0
+      k[step + 1][5] = f5[step];
+      k[step + 1][6] = f6[step];  // == 0
+
+    }  // end of Runge-Kutta step
+
+    fTr.x  = r0[0] + (c[0] * k[1][0] + c[1] * k[2][0] + c[2] * k[3][0] + c[3] * k[4][0]);
+    fTr.y  = r0[1] + (c[0] * k[1][1] + c[1] * k[2][1] + c[2] * k[3][1] + c[3] * k[4][1]);
+    fTr.tx = r0[2] + (c[0] * k[1][2] + c[1] * k[2][2] + c[2] * k[3][2] + c[3] * k[4][2]);
+    fTr.ty = r0[3] + (c[0] * k[1][3] + c[1] * k[2][3] + c[2] * k[3][3] + c[3] * k[4][3]);
+    //fTr.qp = r0[4] + (c[0] * k[1][4] + c[1] * k[2][4] + c[2] * k[3][4] + c[3] * k[4][4]);
+    fTr.t = r0[5] + (c[0] * k[1][5] + c[1] * k[2][5] + c[2] * k[3][5] + c[3] * k[4][5]);
+    //fTr.vi  = r0[6] + (c[0] * k[1][6] + c[1] * k[2][6] + c[2] * k[3][6] + c[3] * k[4][6]);
+
+    fTr.z = zMasked;
+  }
+
+
+  // Jacobian of extrapolation
+
+  //
+  //    derivatives d/dx and d/dy
+  //
+  fvec Jx[7] = {1., 0., 0., 0., 0., 0., 0.};  // D new { x,y,tx,ty,qp,t,vi } / D old x
+  fvec Jy[7] = {0., 1., 0., 0., 0., 0., 0.};  // D new { x,y,tx,ty,qp,t,vi } / D old y
+
+  //
+  //   Runge-Kutta steps for derivatives d/dtx
+  //
+  fvec Jtx[7] = {0., 0., 1., 0., 0., 0., 0.};  // D new { x,y,tx,ty,qp,t,vi } / D old tx
+  {
+    for (int step = 0; step < 4; ++step) {
+      fvec r2        = Jtx[2] + a[step] * k[step][2];  // dtx[step]/dtx0
+      fvec r3        = Jtx[3] + a[step] * k[step][3];  // dty[step]/dtx0
+      k[step + 1][0] = r2;
+      k[step + 1][1] = r3;
+      k[step + 1][2] = df2[step][2] * r2 + df2[step][3] * r3;
+      k[step + 1][3] = df3[step][2] * r2 + df3[step][3] * r3;
+      k[step + 1][4] = 0.;
+      k[step + 1][5] = df5[step][2] * r2 + df5[step][3] * r3;
+      k[step + 1][6] = 0.;
+    }
+    for (int i = 0; i < 7; ++i) {
+      Jtx[i] += c[0] * k[1][i] + c[1] * k[2][i] + c[2] * k[3][i] + c[3] * k[4][i];
+    }
+  }
+
+  //
+  //   Runge-Kutta steps for derivatives d/dty
+  //
+  fvec Jty[7] = {0., 0., 0., 1., 0., 0., 0.};  // D new { x,y,tx,ty,qp,t,vi } / D old ty
+  {
+    for (int step = 0; step < 4; ++step) {
+      fvec r2        = Jty[2] + a[step] * k[step][2];  // dtx[step]/dty0
+      fvec r3        = Jty[3] + a[step] * k[step][3];  // dty[step]/dty0
+      k[step + 1][0] = r2;
+      k[step + 1][1] = r3;
+      k[step + 1][2] = df2[step][2] * r2 + df2[step][3] * r3;
+      k[step + 1][3] = df3[step][2] * r2 + df3[step][3] * r3;
+      k[step + 1][4] = 0.;
+      k[step + 1][5] = df5[step][2] * r2 + df5[step][3] * r3;
+      k[step + 1][6] = 0.;
+    }
+    for (int i = 0; i < 7; ++i) {
+      Jty[i] += c[0] * k[1][i] + c[1] * k[2][i] + c[2] * k[3][i] + c[3] * k[4][i];
+    }
+  }
+
+  //
+  //   Runge-Kutta steps for derivatives d/dqp
+  //
+  fvec Jqp[7] = {0., 0., 0., 0., 1., 0., 0.};  // D new { x,y,tx,ty,qp,t,vi } / D old qp
+  {
+    for (int step = 0; step < 4; ++step) {
+      fvec r2        = Jqp[2] + a[step] * k[step][2];  // dtx/dqp
+      fvec r3        = Jqp[3] + a[step] * k[step][3];  // dty/dqp;
+      fvec r4        = Jqp[4] + a[step] * k[step][4];  // dqp/dqp == 1
+      k[step + 1][0] = r2;
+      k[step + 1][1] = r3;
+      k[step + 1][2] = df2[step][2] * r2 + df2[step][3] * r3 + df2[step][4] * r4;
+      k[step + 1][3] = df3[step][2] * r2 + df3[step][3] * r3 + df3[step][4] * r4;
+      k[step + 1][4] = 0.;
+      k[step + 1][5] = df5[step][2] * r2 + df5[step][3] * r3 + df5[step][4] * r4;
+      k[step + 1][6] = 0.;
+    }
+    for (int i = 0; i < 7; ++i) {
+      Jqp[i] += c[0] * k[1][i] + c[1] * k[2][i] + c[2] * k[3][i] + c[3] * k[4][i];
+    }
+  }
+
+
+  //
+  //    derivatives d/dt
+  //
+  fvec Jt[7] = {0., 0., 0., 0., 0., 1., 0.};  // D new { x,y,tx,ty,qp,t,vi } / D old t
+
+  //
+  //    derivatives d/dvi
+  //
+  fvec Jvi[7] = {0., 0., 0., 0., 0., 0., 1.};  // D new { x,y,tx,ty,qp,t,vi } / D old vi
+  {
+    for (int step = 0; step < 4; ++step) {
+      fvec r2        = Jvi[2] + a[step] * k[step][2];  // dtx/dvi
+      fvec r3        = Jvi[3] + a[step] * k[step][3];  // dty/dvi;
+      fvec r6        = Jvi[6] + a[step] * k[step][6];  //(dvi/dvi == 1)
+      k[step + 1][0] = r2;
+      k[step + 1][1] = r3;
+      k[step + 1][2] = df2[step][2] * r2 + df2[step][3] * r3;
+      k[step + 1][3] = df3[step][2] * r2 + df3[step][3] * r3;
+      k[step + 1][4] = 0.;
+      k[step + 1][5] = df5[step][2] * r2 + df5[step][3] * r3 + df5[step][6] * r6;
+      k[step + 1][6] = 0.;
+    }
+    for (int i = 0; i < 7; ++i) {
+      Jvi[i] += c[0] * k[1][i] + c[1] * k[2][i] + c[2] * k[3][i] + c[3] * k[4][i];
+    }
+  }
+
+
+  {  // update parameters
+    fvec dqp = qp_in - fQp0;
+    fTr.x += Jqp[0] * dqp;
+    fTr.y += Jqp[1] * dqp;
+    fTr.tx += Jqp[2] * dqp;
+    fTr.ty += Jqp[3] * dqp;
+    fTr.t += Jqp[5] * dqp;
+  }
+
+  //          covariance matrix transport
+
+  fvec J[7][7];
+  for (int i = 0; i < 7; i++) {
+    J[i][0] = Jx[i];   // d {x,y,tx,ty,qp,t,vi} / dx
+    J[i][1] = Jy[i];   // d * / dy
+    J[i][2] = Jtx[i];  // d * / dtx
+    J[i][3] = Jty[i];  // d * / dty
+    J[i][4] = Jqp[i];  // d * / dqp
+    J[i][5] = Jt[i];   // d * / dt
+    J[i][6] = Jvi[i];  // d * / dvi
+  }
+
+  fvec C[7][7];
+  for (int i = 0; i < 7; i++) {
+    for (int j = 0; j < 7; j++) {
+      C[i][j] = fTr.C(i, j);
+    }
+  }
+
+  fvec JC[7][7];
+  for (int i = 0; i < 7; i++) {
+    for (int j = 0; j < 7; j++) {
+      JC[i][j] = 0.;
+      for (int m = 0; m < 7; m++) {
+        JC[i][j] += J[i][m] * C[m][j];
+      }
+    }
+  }
+  for (int i = 0; i < 7; i++) {
+    for (int j = 0; j < 7; j++) {
+      fvec Cij = 0.;
+      for (int m = 0; m < 7; m++) {
+        Cij += JC[i][m] * J[j][m];
+      }
+      fTr.C(i, j) = Cij;
+    }
+  }
+}
+
+
 void L1Fit::ExtrapolateStep  // extrapolates track parameters and returns jacobian for extrapolation of CovMatrix
   (cnst& zOut,               // extrapolate to this z position
    const L1FieldRegion& F)
@@ -377,7 +722,7 @@ void L1Fit::ExtrapolateStep  // extrapolates track parameters and returns jacobi
   fvec f2_ty[4], f3_ty[4], f4_ty[4];  // df* / dty
   fvec f2_qp[4], f3_qp[4], f4_qp[4];  // df* / dqp
 
-  fvec k[5][5] {{0.}};
+  fvec k[5][5] = {0., 0., 0., 0., 0.};
 
   //   Runge-Kutta steps for track parameters
   //
@@ -936,13 +1281,14 @@ void L1Fit::ExtrapolateLine(cnst& z_out, const L1FieldRegion& F)
   fQp0 = qp0;
 }
 
-void L1Fit::ExtrapolateLine(cnst& z_out)
+void L1Fit::ExtrapolateLineNoField(cnst& z_out)
 {
-  // extrapolate the track assuming fQp0 == 0
+  // extrapolate the track assuming no field
   //
   // it is a copy of a sequence two routines
   //  L1ExtrapolateTime() and L1ExtrapolateLine()
   // TODO: make it right
+  //
 
   cnst c_light(29.9792458);
   fvec dz = (z_out - fTr.z);
diff --git a/reco/L1/L1Algo/L1Fit.h b/reco/L1/L1Algo/L1Fit.h
index 4e95f91e7f5e14285390212a55dba257d8f81757..72fe29a978b094b3c60bd9b88987a0018b490d96 100644
--- a/reco/L1/L1Algo/L1Fit.h
+++ b/reco/L1/L1Algo/L1Fit.h
@@ -41,9 +41,9 @@ public:
   }
 
   template<typename T>
-  void SetTrack(const T* tr, const T* C)
+  void SetTrack(const T p[7], const T c[28])
   {
-    fTr.Set(tr, C);
+    fTr.copyFromArrays(p, c);
     fQp0 = fTr.qp;
   }
 
@@ -59,6 +59,8 @@ public:
 
   fvec& Qp0() { return fQp0; }
 
+  void SetDoFitVelocity(bool v) { fDoFitVelocity = v; }
+
   void SetOneEntry(const int i0, const L1Fit& T1, const int i1);
 
   void Print(int i = -1);
@@ -90,8 +92,9 @@ public:
   void Extrapolate(cnst& z_out, const L1FieldRegion& F);
 
   void ExtrapolateStep(cnst& z_out, const L1FieldRegion& F);
+  void ExtrapolateStepFull(cnst& z_out, const L1FieldRegion& F);
   void ExtrapolateStepAnalytic(cnst& z_out, const L1FieldRegion& F);
-  void ExtrapolateLine(cnst& z_out);
+  void ExtrapolateLineNoField(cnst& z_out);
   void ExtrapolateLine(cnst& z_out, const L1FieldRegion& F);
 
   void EnergyLossCorrection(cnst& radThick, cnst& upstreamDirection);
@@ -139,6 +142,9 @@ private:
 
   fvec fPipeRadThick {7.87e-3f};        // 0.7 mm Aluminium  // TODO:
   fvec fTargetRadThick {3.73e-2f * 2};  // 250 mum Gold      // TODO:
+
+  bool fDoFitVelocity {0};  // should the track velocity be fitted as an independent parameter
+
 } _fvecalignment;
 
 // =============================================================================================
diff --git a/reco/L1/L1Algo/L1Track.h b/reco/L1/L1Algo/L1Track.h
index 23cbafaf74706b8c5a2ff9861d3f1020b83a0167..e6223f1132fec881708f653cf076fb9c1de9491f 100644
--- a/reco/L1/L1Algo/L1Track.h
+++ b/reco/L1/L1Algo/L1Track.h
@@ -35,12 +35,12 @@ public:
   unsigned char n;          ///< TODO: ??
   float Momentum {kNaN};    ///< TODO: ??
   float fTrackTime {kNaN};  ///< Track time
-  fscal TFirst[7] {kNaN};   ///< Track parameters on the first station
-  fscal CFirst[21] {kNaN};  ///< Track parameter covariation matrix elements on the first station
-  fscal TLast[7] {kNaN};    ///< Track parameters on the last station
-  fscal CLast[21] {kNaN};   ///< Track parameter covariation matrix elements on the second station
-  fscal Tpv[7] {kNaN};      ///< Track parameters in the primary vertex
-  fscal Cpv[21] {kNaN};     ///< Track parameter covariation matrix elements in the primary vertex
+  fscal TFirst[8] {kNaN};   ///< Track parameters on the first station
+  fscal CFirst[28] {kNaN};  ///< Track parameter covariation matrix elements on the first station
+  fscal TLast[8] {kNaN};    ///< Track parameters on the last station
+  fscal CLast[28] {kNaN};   ///< Track parameter covariation matrix elements on the second station
+  fscal Tpv[8] {kNaN};      ///< Track parameters in the primary vertex
+  fscal Cpv[28] {kNaN};     ///< Track parameter covariation matrix elements in the primary vertex
   fscal chi2 {kNaN};        ///< Track fit chi-square value
   short int NDF;            ///< Track fit NDF value
 
@@ -66,11 +66,5 @@ public:
   static bool compare(const L1Track& a, const L1Track& b) { return (a.Cpv[20] <= b.Cpv[20]); }
 };
 
-// #include "cmath"
-//   bool operator==(const L1Track &other) const {
-//     cout<<int(NHits)<<" NHits"<<endl;
-//      if ((other.NHits==NHits)&&(fabs(other.Momentum-Momentum)<1.e-6)) return true;
-//      else return false;
-//   }
 
 #endif  // L1Track_H
diff --git a/reco/L1/L1Algo/L1TrackFitter.cxx b/reco/L1/L1Algo/L1TrackFitter.cxx
index 1bc56c0b0d08a321b802526c59287c6341f46ea7..4ed3a4b1dc825420d582555e272ca5a630e63a69 100644
--- a/reco/L1/L1Algo/L1TrackFitter.cxx
+++ b/reco/L1/L1Algo/L1TrackFitter.cxx
@@ -17,9 +17,6 @@ using std::vector;
 namespace NS_L1TrackFitter
 {
   const fvec c_light(0.000299792458), c_light_i(fvec(1.) / c_light);
-  const fvec ZERO(0.);
-  const fvec ONE(1.);
-  const fvec vINF(0.1);
 }  // namespace NS_L1TrackFitter
 using namespace NS_L1TrackFitter;
 
@@ -45,6 +42,7 @@ void L1Algo::L1KFTrackFitter()
   L1TrackPar& tr = fit.Tr();
 
   fit.SetParticleMass(GetDefaultParticleMass());
+  fit.SetDoFitVelocity(false);
 
   L1Track* t[fvec::size()] {nullptr};
 
@@ -228,7 +226,13 @@ void L1Algo::L1KFTrackFitter()
       time_last = iif(w_time[ista], time_last, fvec::Zero());
       dt2_last  = iif(w_time[ista], dt2_last, fvec(1.e6));
 
-      FilterFirst(fit, x_last, y_last, time_last, dt2_last, d_xx_lst, d_yy_lst, d_xy_lst);
+      tr.ResetErrors(d_xx_lst, d_yy_lst, 0.1, 0.1, 1.0, dt2_last, 1.e2);
+      tr.C10 = d_xy_lst;
+      tr.x   = x_last;
+      tr.y   = y_last;
+      tr.t   = time_last;
+      tr.NDF = -3.0;
+
 
       fldZ1 = z[ista];
 
@@ -301,74 +305,17 @@ void L1Algo::L1KFTrackFitter()
         }
       }
 
-      const L1TrackPar& Tf = fit.Tr();
+      L1TrackPar Tf = fit.Tr();
+      if (kGlobal == fTrackingMode) { Tf.qp = fitpv.Tr().qp; }
 
       for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
-        t[iVec]->TFirst[0] = Tf.x[iVec];
-        t[iVec]->TFirst[1] = Tf.y[iVec];
-        t[iVec]->TFirst[2] = Tf.tx[iVec];
-        t[iVec]->TFirst[3] = Tf.ty[iVec];
-        t[iVec]->TFirst[4] = Tf.qp[iVec];
-        if (kGlobal == fTrackingMode) { t[iVec]->TFirst[4] = fitpv.Tr().qp[iVec]; }
-        t[iVec]->TFirst[5] = Tf.z[iVec];
-        t[iVec]->TFirst[6] = Tf.t[iVec];
-
-        t[iVec]->CFirst[0]  = Tf.C00[iVec];
-        t[iVec]->CFirst[1]  = Tf.C10[iVec];
-        t[iVec]->CFirst[2]  = Tf.C11[iVec];
-        t[iVec]->CFirst[3]  = Tf.C20[iVec];
-        t[iVec]->CFirst[4]  = Tf.C21[iVec];
-        t[iVec]->CFirst[5]  = Tf.C22[iVec];
-        t[iVec]->CFirst[6]  = Tf.C30[iVec];
-        t[iVec]->CFirst[7]  = Tf.C31[iVec];
-        t[iVec]->CFirst[8]  = Tf.C32[iVec];
-        t[iVec]->CFirst[9]  = Tf.C33[iVec];
-        t[iVec]->CFirst[10] = Tf.C40[iVec];
-        t[iVec]->CFirst[11] = Tf.C41[iVec];
-        t[iVec]->CFirst[12] = Tf.C42[iVec];
-        t[iVec]->CFirst[13] = Tf.C43[iVec];
-        t[iVec]->CFirst[14] = Tf.C44[iVec];
-        t[iVec]->CFirst[15] = Tf.C50[iVec];
-        t[iVec]->CFirst[16] = Tf.C51[iVec];
-        t[iVec]->CFirst[17] = Tf.C52[iVec];
-        t[iVec]->CFirst[18] = Tf.C53[iVec];
-        t[iVec]->CFirst[19] = Tf.C54[iVec];
-        t[iVec]->CFirst[20] = Tf.C55[iVec];
-
+        Tf.copyToArrays(iVec, t[iVec]->TFirst, t[iVec]->CFirst);
         t[iVec]->chi2 = Tf.chi2[iVec];
         t[iVec]->NDF  = (int) Tf.NDF[iVec];
       }
 
       for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
-        t[iVec]->Tpv[0] = fitpv.Tr().x[iVec];
-        t[iVec]->Tpv[1] = fitpv.Tr().y[iVec];
-        t[iVec]->Tpv[2] = fitpv.Tr().tx[iVec];
-        t[iVec]->Tpv[3] = fitpv.Tr().ty[iVec];
-        t[iVec]->Tpv[4] = fitpv.Tr().qp[iVec];
-        t[iVec]->Tpv[5] = fitpv.Tr().z[iVec];
-        t[iVec]->Tpv[6] = fitpv.Tr().t[iVec];
-
-        t[iVec]->Cpv[0]  = fitpv.Tr().C00[iVec];
-        t[iVec]->Cpv[1]  = fitpv.Tr().C10[iVec];
-        t[iVec]->Cpv[2]  = fitpv.Tr().C11[iVec];
-        t[iVec]->Cpv[3]  = fitpv.Tr().C20[iVec];
-        t[iVec]->Cpv[4]  = fitpv.Tr().C21[iVec];
-        t[iVec]->Cpv[5]  = fitpv.Tr().C22[iVec];
-        t[iVec]->Cpv[6]  = fitpv.Tr().C30[iVec];
-        t[iVec]->Cpv[7]  = fitpv.Tr().C31[iVec];
-        t[iVec]->Cpv[8]  = fitpv.Tr().C32[iVec];
-        t[iVec]->Cpv[9]  = fitpv.Tr().C33[iVec];
-        t[iVec]->Cpv[10] = fitpv.Tr().C40[iVec];
-        t[iVec]->Cpv[11] = fitpv.Tr().C41[iVec];
-        t[iVec]->Cpv[12] = fitpv.Tr().C42[iVec];
-        t[iVec]->Cpv[13] = fitpv.Tr().C43[iVec];
-        t[iVec]->Cpv[14] = fitpv.Tr().C44[iVec];
-        t[iVec]->Cpv[15] = fitpv.Tr().C50[iVec];
-        t[iVec]->Cpv[16] = fitpv.Tr().C51[iVec];
-        t[iVec]->Cpv[17] = fitpv.Tr().C52[iVec];
-        t[iVec]->Cpv[18] = fitpv.Tr().C53[iVec];
-        t[iVec]->Cpv[19] = fitpv.Tr().C54[iVec];
-        t[iVec]->Cpv[20] = fitpv.Tr().C55[iVec];
+        fitpv.Tr().copyToArrays(iVec, t[iVec]->Tpv, t[iVec]->Cpv);
       }
 
       if (iter == 1) continue;  // only 1.5 iterations
@@ -415,41 +362,15 @@ void L1Algo::L1KFTrackFitter()
         fldZ1 = fldZ0;
       }
 
+      L1TrackPar Tl = fit.Tr();
+      if (kGlobal == fTrackingMode) { Tl.qp = fitpv.Tr().qp; }
+
       for (int iVec = 0; iVec < nTracks_SIMD; iVec++) {
-        t[iVec]->TLast[0] = tr.x[iVec];
-        t[iVec]->TLast[1] = tr.y[iVec];
-        t[iVec]->TLast[2] = tr.tx[iVec];
-        t[iVec]->TLast[3] = tr.ty[iVec];
-        t[iVec]->TLast[4] = tr.qp[iVec];
-        if (kGlobal == fTrackingMode) { t[iVec]->TLast[4] = fitpv.Tr().qp[iVec]; }
-        t[iVec]->TLast[5] = tr.z[iVec];
-        t[iVec]->TLast[6] = tr.t[iVec];
-
-        t[iVec]->CLast[0]  = tr.C00[iVec];
-        t[iVec]->CLast[1]  = tr.C10[iVec];
-        t[iVec]->CLast[2]  = tr.C11[iVec];
-        t[iVec]->CLast[3]  = tr.C20[iVec];
-        t[iVec]->CLast[4]  = tr.C21[iVec];
-        t[iVec]->CLast[5]  = tr.C22[iVec];
-        t[iVec]->CLast[6]  = tr.C30[iVec];
-        t[iVec]->CLast[7]  = tr.C31[iVec];
-        t[iVec]->CLast[8]  = tr.C32[iVec];
-        t[iVec]->CLast[9]  = tr.C33[iVec];
-        t[iVec]->CLast[10] = tr.C40[iVec];
-        t[iVec]->CLast[11] = tr.C41[iVec];
-        t[iVec]->CLast[12] = tr.C42[iVec];
-        t[iVec]->CLast[13] = tr.C43[iVec];
-        t[iVec]->CLast[14] = tr.C44[iVec];
-        t[iVec]->CLast[15] = tr.C50[iVec];
-        t[iVec]->CLast[16] = tr.C51[iVec];
-        t[iVec]->CLast[17] = tr.C52[iVec];
-        t[iVec]->CLast[18] = tr.C53[iVec];
-        t[iVec]->CLast[19] = tr.C54[iVec];
-        t[iVec]->CLast[20] = tr.C55[iVec];
-
-        t[iVec]->chi2 = tr.chi2[iVec];
-        t[iVec]->NDF  = (int) tr.NDF[iVec];
+        Tl.copyToArrays(iVec, t[iVec]->TLast, t[iVec]->CLast);
+        t[iVec]->chi2 = Tl.chi2[iVec];
+        t[iVec]->NDF  = (int) Tl.NDF[iVec];
       }
+
     }  // iter
   }
 }
@@ -460,22 +381,15 @@ void L1Algo::GuessVecNoField(L1Fit& track, fvec& x_last, fvec& x_2last, fvec& y_
 
   fvec dzi = fvec(1.) / (z_end - z_2last);
 
-  tr.x    = x_last;
-  tr.y    = y_last;
-  tr.tx   = (x_last - x_2last) * dzi;
-  tr.ty   = (y_last - y_2last) * dzi;
-  tr.t    = time_last;
-  tr.z    = z_end;
-  tr.chi2 = fvec(0.);
-  tr.NDF  = fvec(2.);
-
-  tr.C20 = tr.C21 = fvec(0.);
-  tr.C30 = tr.C31 = tr.C32 = fvec(0.);
-  tr.C40 = tr.C41 = tr.C42 = tr.C43 = fvec(0.);
-  tr.C50 = tr.C51 = tr.C52 = tr.C53 = tr.C54 = fvec(0.);
-  tr.C22 = tr.C33 = vINF;
-  tr.C44          = fvec(1.);
-  tr.C55          = fvec(dt2_last);
+  tr.x  = x_last;
+  tr.y  = y_last;
+  tr.tx = (x_last - x_2last) * dzi;
+  tr.ty = (y_last - y_2last) * dzi;
+  tr.t  = time_last;
+  tr.z  = z_end;
+
+  tr.ResetErrors(1., 1., 1., 1., 1., dt2_last, 1.e2);
+  tr.NDF = fvec(2.);
 }
 
 
@@ -483,7 +397,7 @@ void L1Algo::GuessVec(L1TrackPar& tr, fvec* xV, fvec* yV, fvec* zV, fvec* Sy, fm
 // 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%).
 {
 
-  fvec A0, A1 = ZERO, A2 = ZERO, A3 = ZERO, A4 = ZERO, A5 = ZERO, a0, a1 = ZERO, a2 = ZERO, b0, b1 = ZERO, b2 = ZERO;
+  fvec A0, A1 = 0., A2 = 0., A3 = 0., A4 = 0., A5 = 0., a0, a1 = 0., a2 = 0., b0, b1 = 0., b2 = 0.;
   fvec z0, x, y, z, S, w, wz, wS;
 
   int i = NHits - 1;
@@ -553,7 +467,7 @@ void L1Algo::GuessVec(L1Fit& track, fvec* xV, fvec* yV, fvec* zV, fvec* Sy, fmas
 {
   L1TrackPar& tr = track.Tr();
 
-  fvec A0, A1 = ZERO, A2 = ZERO, A3 = ZERO, A4 = ZERO, A5 = ZERO, a0, a1 = ZERO, a2 = ZERO, b0, b1 = ZERO, b2 = ZERO;
+  fvec A0, A1 = 0., A2 = 0., A3 = 0., A4 = 0., A5 = 0., a0, a1 = 0., a2 = 0., b0, b1 = 0., b2 = 0.;
   fvec z0, x, y, z, S, w, wz, wS, time;
 
   time = fvec(0.);
@@ -639,31 +553,11 @@ void L1Algo::FilterFirst(L1Fit& track, fvec& x, fvec& y, fvec& t, fvec& dt2, fve
 {
   L1TrackPar& tr = track.Tr();
 
-  tr.C00 = d_xx;
+  tr.ResetErrors(d_xx, d_yy, 0.1, 0.1, 1., dt2, 1.e2);
   tr.C10 = d_xy;
-  tr.C11 = d_yy;
-  tr.C20 = ZERO;
-  tr.C21 = ZERO;
-  tr.C22 = vINF;
-  tr.C30 = ZERO;
-  tr.C31 = ZERO;
-  tr.C32 = ZERO;
-  tr.C33 = vINF;
-  tr.C40 = ZERO;
-  tr.C41 = ZERO;
-  tr.C42 = ZERO;
-  tr.C43 = ZERO;
-  tr.C44 = ONE;
-  tr.C50 = ZERO;
-  tr.C51 = ZERO;
-  tr.C52 = ZERO;
-  tr.C53 = ZERO;
-  tr.C54 = ZERO;
-  tr.C55 = dt2;
-
-  tr.x    = x;
-  tr.y    = y;
-  tr.t    = t;
-  tr.NDF  = -3.0;
-  tr.chi2 = ZERO;
+
+  tr.x   = x;
+  tr.y   = y;
+  tr.t   = t;
+  tr.NDF = -3.0;
 }
diff --git a/reco/L1/L1Algo/L1TrackPar.cxx b/reco/L1/L1Algo/L1TrackPar.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..5bc71fb8de151dd5e4288bbae10924761bade891
--- /dev/null
+++ b/reco/L1/L1Algo/L1TrackPar.cxx
@@ -0,0 +1,226 @@
+/* Copyright (C) 2007-2020 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Igor Kulakov [committer], Maksym Zyzak */
+
+#include "L1TrackPar.h"
+
+#include <iomanip>
+#include <iostream>
+
+
+void L1TrackPar::Print(int i) const
+{
+  std::ios_base::fmtflags coutFlags(std::cout.flags());
+  std::cout.setf(std::ios::scientific, std::ios::floatfield);
+  if (i == -1) {
+    std::cout << "T = " << std::endl;
+    std::cout << " x " << x << std::endl;
+    std::cout << " y " << y << std::endl;
+    std::cout << " tx " << tx << std::endl;
+    std::cout << " ty " << ty << std::endl;
+    std::cout << " qp " << qp << std::endl;
+    std::cout << " t " << t << std::endl;
+    std::cout << " v " << fvec(1.) / vi << std::endl;
+    std::cout << " z " << z << std::endl;
+    std::cout << "C = " << std::endl;
+    std::cout << " c00 " << C00 << std::endl;
+    std::cout << " c11 " << C11 << std::endl;
+    std::cout << " c22 " << C22 << std::endl;
+    std::cout << " c33 " << C33 << std::endl;
+    std::cout << " c44 " << C44 << std::endl;
+    std::cout << " c55 " << C55 << std::endl;
+    std::cout << " c66 " << C66 << std::endl;
+  }
+  else {
+    std::cout << "T = ";
+    std::cout << " x " << x[i];
+    std::cout << " y " << y[i];
+    std::cout << " tx " << tx[i];
+    std::cout << " ty " << ty[i];
+    std::cout << " qp " << qp[i];
+    std::cout << " t " << t[i];
+    std::cout << " v " << 1. / vi[i];
+
+    std::cout << " z " << z[i] << std::endl;
+    std::cout << "C = ";
+    std::cout << " c00 " << C00[i];
+    std::cout << " c11 " << C11[i];
+    std::cout << " c22 " << C22[i];
+    std::cout << " c33 " << C33[i];
+    std::cout << " c44 " << C44[i] << std::endl;
+    std::cout << " c55 " << C55[i] << std::endl;
+    std::cout << " c66 " << C66[i] << std::endl;
+  }
+  PrintCorrelations(i);
+  std::cout.flags(coutFlags);
+}
+
+void L1TrackPar::PrintCorrelations(int i) const
+{
+  auto flagSafe = std::cout.flags();
+  // std::cout.setf(std::ios::scientific, std::ios::floatfield);
+  std::cout << std::setprecision(6);
+
+  if (i == -1) {
+    fvec s0 = sqrt(C00);
+    fvec s1 = sqrt(C11);
+    fvec s2 = sqrt(C22);
+    fvec s3 = sqrt(C33);
+    fvec s4 = sqrt(C44);
+    fvec s5 = sqrt(C55);
+    fvec s6 = sqrt(C66);
+
+    std::cout << "K = " << std::endl;
+    std::cout << " k10 " << C10 / s1 / s0 << std::endl;
+
+    std::cout << "\n k20 " << C20 / s2 / s0 << std::endl;
+    std::cout << " k21 " << C21 / s2 / s1 << std::endl;
+
+    std::cout << "\n k30 " << C30 / s3 / s0 << std::endl;
+    std::cout << " k31 " << C31 / s3 / s1 << std::endl;
+    std::cout << " k32 " << C32 / s3 / s2 << std::endl;
+
+    std::cout << "\n k40 " << C40 / s4 / s0 << std::endl;
+    std::cout << " k41 " << C41 / s4 / s1 << std::endl;
+    std::cout << " k42 " << C42 / s4 / s2 << std::endl;
+    std::cout << " k43 " << C43 / s4 / s3 << std::endl;
+
+    std::cout << "\n k50 " << C50 / s5 / s0 << std::endl;
+    std::cout << " k51 " << C51 / s5 / s1 << std::endl;
+    std::cout << " k52 " << C52 / s5 / s2 << std::endl;
+    std::cout << " k53 " << C53 / s5 / s3 << std::endl;
+    std::cout << " k54 " << C54 / s5 / s4 << std::endl;
+
+    std::cout << "\n k60 " << C60 / s6 / s0 << std::endl;
+    std::cout << " k61 " << C61 / s6 / s1 << std::endl;
+    std::cout << " k62 " << C62 / s6 / s2 << std::endl;
+    std::cout << " k63 " << C63 / s6 / s3 << std::endl;
+    std::cout << " k64 " << C64 / s6 / s4 << std::endl;
+    std::cout << " k65 " << C65 / s6 / s5 << std::endl;
+  }
+  else {
+    float s0 = sqrt(C00[i]);
+    float s1 = sqrt(C11[i]);
+    float s2 = sqrt(C22[i]);
+    float s3 = sqrt(C33[i]);
+    float s4 = sqrt(C44[i]);
+    float s5 = sqrt(C55[i]);
+    float s6 = sqrt(C66[i]);
+
+    std::cout << "K = " << std::endl;
+    std::cout << " " << C10[i] / s1 / s0 << std::endl;
+    std::cout << " " << C20[i] / s2 / s0 << " " << C21[i] / s2 / s1 << std::endl;
+    std::cout << " " << C30[i] / s3 / s0 << " " << C31[i] / s3 / s1 << " " << C32[i] / s3 / s2 << std::endl;
+    std::cout << " " << C40[i] / s4 / s0 << " " << C41[i] / s4 / s1 << " " << C42[i] / s4 / s2 << " "
+              << C43[i] / s4 / s3 << std::endl;
+    std::cout << " " << C50[i] / s5 / s0 << " " << C51[i] / s5 / s1 << " " << C52[i] / s5 / s2 << " "
+              << C53[i] / s5 / s3 << " " << C54[i] / s5 / s4 << std::endl;
+    std::cout << " " << C60[i] / s6 / s0 << " " << C61[i] / s6 / s1 << " " << C62[i] / s6 / s2 << " "
+              << C63[i] / s6 / s3 << " " << C64[i] / s6 / s4 << " " << C65[i] / s6 / s5 << std::endl;
+  }
+  std::cout.flags(flagSafe);
+}
+
+bool L1TrackPar::IsEntryConsistent(bool printWhenWrong, int k) const
+{
+  bool ok = true;
+
+  // verify that all the numbers in the object are valid floats
+  const fvec* memberFirst = &x;
+  const fvec* memberLast  = &NDF;
+  for (int i = 0; i < &memberLast - &memberFirst + 1; i++) {
+    if (!std::isfinite(memberFirst[i][k])) {
+      ok = false;
+      if (printWhenWrong) {
+        std::cout << " L1TrackPar member N " << i << ", vector entry " << k
+                  << " is not a number: " << memberFirst[i][k];
+      }
+    }
+  }
+
+  // verify diagonal elements.
+  // Cii is a squared dispersion of i-th parameter, it must be positive
+
+  for (int i = 0; i < 7; i++) {
+    if (C(i, i)[k] <= 0.f) {
+      ok = false;
+      if (printWhenWrong) {
+        std::cout << " L1TrackPar: C[" << i << "," << i << "], vec entry " << k << " is not positive: " << C(i, i)[k]
+                  << std::endl;
+      }
+    }
+  }
+
+  // verify non-diagonal elements.
+  // Cij/sqrt(Cii*Cjj) is a correlation between i-th and j-th parameter,
+  // it must belong to [-1,1]
+
+  for (int i = 1; i < 7; i++) {
+    for (int j = 0; j < i; j++) {
+      double tolerance = 1.0;
+      if (C(i, j)[k] * C(i, j)[k] > tolerance * (C(i, i)[k] * C(j, j)[k])) {
+        ok = false;
+        if (printWhenWrong) {
+          std::cout << " L1TrackPar: correlation [" << i << "," << j << "], vec entry " << k
+                    << " is too large: " << C(i, i)[k] / sqrt(C(i, i)[k] * C(j, j)[k]) << std::endl;
+        }
+      }
+    }
+  }
+
+  // verify triplets of correlations
+  // Kxy * Kxy + Kxz * Kxz + Kyz * Kyz <= 1 + 2 * Kxy * Kxz * Kyz
+
+  for (int i = 2; i < 7; i++) {
+    for (int j = 1; j < i; j++) {
+      for (int m = 0; m < j; m++) {
+        double tolerance = 1.0;
+        double Cxx       = C(i, i)[k];
+        double Cyy       = C(j, j)[k];
+        double Czz       = C(m, m)[k];
+        double Cxy       = C(i, j)[k];
+        double Cxz       = C(i, m)[k];
+        double Cyz       = C(j, m)[k];
+        if (Cxx * Cyz * Cyz + Cyy * Cxz * Cxz + Czz * Cxy * Cxy
+            > tolerance * (Cxx * Cyy * Czz + 2. * Cxy * Cyz * Cxz)) {
+          ok = false;
+          if (printWhenWrong) {
+            double Kxy = Cxy / sqrt(Cxx * Cyy);
+            double Kxz = Cxz / sqrt(Cxx * Czz);
+            double Kyz = Cyz / sqrt(Cyy * Czz);
+            std::cout << " L1TrackPar: correlations between parametetrs " << i << ", " << j << ", " << m
+                      << ", vec entry " << k << " are wrong: " << Kxy << " " << Kxz << " " << Kyz << std::endl;
+            std::cout << " inequation: " << Kxy * Kxy + Kxz * Kxz + Kyz * Kyz << " > " << 1 + 2 * Kxy * Kxz * Kyz
+                      << std::endl;
+          }
+        }
+      }
+    }
+  }
+
+  if (!ok && printWhenWrong) {
+    std::cout << "L1TrackPar parameters are not consistent: " << std::endl;
+    Print(k);
+  }
+  return ok;
+}
+
+bool L1TrackPar::IsConsistent(bool printWhenWrong, int nFilled) const
+{
+  assert(nFilled <= (int) fvec::size());
+  bool ok = true;
+  if (nFilled < 0) { nFilled = fvec::size(); }
+  for (int i = 0; i < nFilled; ++i) {
+    ok = ok && IsEntryConsistent(printWhenWrong, i);
+  }
+
+  if (!ok && printWhenWrong) {
+    std::cout << "L1TrackPar parameters are not consistent: " << std::endl;
+    if (nFilled == (int) fvec::size()) { std::cout << "  All vector elements are filled " << std::endl; }
+    else {
+      std::cout << "  Only first " << nFilled << " vector elements are filled " << std::endl;
+    }
+    Print(-1);
+  }
+  return ok;
+}
diff --git a/reco/L1/L1Algo/L1TrackPar.h b/reco/L1/L1Algo/L1TrackPar.h
index 4f60d6d804055586a3191f48449fd15d9e1cb577..25e4fb43a7d60be9a88519c5683282afde5b3986 100644
--- a/reco/L1/L1Algo/L1TrackPar.h
+++ b/reco/L1/L1Algo/L1TrackPar.h
@@ -5,19 +5,31 @@
 #ifndef L1TrackPar_h
 #define L1TrackPar_h 1
 
-#include <iomanip>
-#include <iostream>
-
+#include "CaSimd.h"
 #include "L1Def.h"
 
+using namespace cbm::algo::ca;
+
 class L1TrackPar {
 
 public:
-  fvec x {0.}, y {0.}, tx {0.}, ty {0.}, qp {0.}, z {0.}, t {0.};
+  fvec x {0.}, y {0.}, tx {0.}, ty {0.}, qp {0.}, z {0.}, t {0.}, vi {0.};
+
+  fvec C00 {0.},
+
+    C10 {0.}, C11 {0.},
+
+    C20 {0.}, C21 {0.}, C22 {0.},
+
+    C30 {0.}, C31 {0.}, C32 {0.}, C33 {0.},
 
-  fvec C00 {0.}, C10 {0.}, C11 {0.}, C20 {0.}, C21 {0.}, C22 {0.}, C30 {0.}, C31 {0.}, C32 {0.}, C33 {0.}, C40 {0.},
-    C41 {0.}, C42 {0.}, C43 {0.}, C44 {0.}, C50 {0.}, C51 {0.}, C52 {0.}, C53 {0.}, C54 {0.}, C55 {0.}, chi2 {0.},
-    NDF {0.};
+    C40 {0.}, C41 {0.}, C42 {0.}, C43 {0.}, C44 {0.},
+
+    C50 {0.}, C51 {0.}, C52 {0.}, C53 {0.}, C54 {0.}, C55 {0.},
+
+    C60 {0.}, C61 {0.}, C62 {0.}, C63 {0.}, C64 {0.}, C65 {0.}, C66 {0.};
+
+  fvec chi2 {0.}, NDF {0.};
 
   L1TrackPar() = default;
 
@@ -27,43 +39,8 @@ public:
     Set(tr, C);
   }
 
-  template<typename T>
-  void Set(const T* tr, const T* C)
-  {
-    x  = tr[0];
-    y  = tr[1];
-    tx = tr[2];
-    ty = tr[3];
-    qp = tr[4];
-    z  = tr[5];
-    t  = tr[6];
-
-    chi2 = 0.;
-    NDF  = 0.;
-
-    C00 = C[0];
-    C10 = C[1];
-    C11 = C[2];
-    C20 = C[3];
-    C21 = C[4];
-    C22 = C[5];
-    C30 = C[6];
-    C31 = C[7];
-    C32 = C[8];
-    C33 = C[9];
-    C40 = C[10];
-    C41 = C[11];
-    C42 = C[12];
-    C43 = C[13];
-    C44 = C[14];
-    C50 = C[15];
-    C51 = C[16];
-    C52 = C[17];
-    C53 = C[18];
-    C54 = C[19];
-    C55 = C[20];
-  }
-
+  //template<typename T>
+  //void Set(const T* tr, const T* C);
 
   void SetOneEntry(const int i0, const L1TrackPar& T1, const int i1);
 
@@ -81,6 +58,9 @@ public:
     return c[ind];
   }
 
+
+  void ResetErrors(fvec c00, fvec c11, fvec c22, fvec c33, fvec c44, fvec c55, fvec c66);
+
   void Print(int i = -1) const;
 
   void PrintCorrelations(int i = -1) const;
@@ -89,134 +69,91 @@ public:
 
   bool IsConsistent(bool printWhenWrong, int nFilled) const;
 
-  void ResetErrors(fvec c00, fvec c11, fvec c22, fvec c33, fvec c44, fvec c55)
-  {
-    C10 = 0.;
-    C20 = C21 = 0.;
-    C30 = C31 = C32 = 0.;
-    C40 = C41 = C42 = C43 = 0.;
-    C50 = C51 = C52 = C53 = C54 = 0.;
-
-    C00  = c00;
-    C11  = c11;
-    C22  = c22;
-    C33  = c33;
-    C44  = c44;
-    C55  = c55;
-    chi2 = 0.;
-    NDF  = 0;
-  }
+  template<typename T>
+  void copyToArrays(const int iVec, T p[7], T c[28]) const;
+
+  template<typename T>
+  void copyFromArrays(const int iVec, const T p[7], const T c[28]);
+
+  template<typename T>
+  void copyFromArrays(const T p[7], const T c[28]);
 
 } _fvecalignment;
 
 // =============================================================================================
 
-inline void L1TrackPar::Print(int i) const
+template<typename T>
+inline void L1TrackPar::copyToArrays(const int iVec, T p[7], T c[28]) const
 {
-  std::ios_base::fmtflags coutFlags(std::cout.flags());
-  std::cout.setf(std::ios::scientific, std::ios::floatfield);
-  if (i == -1) {
-    std::cout << "T = " << std::endl;
-    std::cout << " x " << x << std::endl;
-    std::cout << " y " << y << std::endl;
-    std::cout << " tx " << tx << std::endl;
-    std::cout << " ty " << ty << std::endl;
-    std::cout << " qp " << qp << std::endl;
-    std::cout << " t " << t << std::endl;
-    std::cout << " z " << z << std::endl;
-    std::cout << "C = " << std::endl;
-    std::cout << " c00 " << C00 << std::endl;
-    std::cout << " c11 " << C11 << std::endl;
-    std::cout << " c22 " << C22 << std::endl;
-    std::cout << " c33 " << C33 << std::endl;
-    std::cout << " c44 " << C44 << std::endl;
-    std::cout << " c55 " << C55 << std::endl;
-  }
-  else {
-    std::cout << "T = ";
-    std::cout << " x " << x[i];
-    std::cout << " y " << y[i];
-    std::cout << " tx " << tx[i];
-    std::cout << " ty " << ty[i];
-    std::cout << " qp " << qp[i];
-    std::cout << " t " << t[i];
-    std::cout << " z " << z[i] << std::endl;
-    std::cout << "C = ";
-    std::cout << " c00 " << C00[i];
-    std::cout << " c11 " << C11[i];
-    std::cout << " c22 " << C22[i];
-    std::cout << " c33 " << C33[i];
-    std::cout << " c44 " << C44[i] << std::endl;
-    std::cout << " c55 " << C55[i] << std::endl;
+  p[0] = x[iVec];
+  p[1] = y[iVec];
+  p[2] = tx[iVec];
+  p[3] = ty[iVec];
+  p[4] = qp[iVec];
+  p[5] = z[iVec];
+  p[6] = t[iVec];
+  p[7] = vi[iVec];
+
+  const fvec* tC = &(C00);
+  for (int i = 0; i < 28; i++) {
+    c[i] = tC[i][iVec];
   }
-  PrintCorrelations(i);
-  std::cout.flags(coutFlags);
 }
 
-inline void L1TrackPar::PrintCorrelations(int i) const
+template<typename T>
+inline void L1TrackPar::copyFromArrays(const int iVec, const T p[7], const T c[28])
 {
-  auto flagSafe = std::cout.flags();
-  // std::cout.setf(std::ios::scientific, std::ios::floatfield);
-  std::cout << std::setprecision(6);
-
-  if (i == -1) {
-    fvec s0 = sqrt(C00);
-    fvec s1 = sqrt(C11);
-    fvec s2 = sqrt(C22);
-    fvec s3 = sqrt(C33);
-    fvec s4 = sqrt(C44);
-    fvec s5 = sqrt(C55);
-
-    std::cout << "K = " << std::endl;
-    std::cout << " k10 " << C10 / s1 / s0 << std::endl;
-
-    std::cout << "\n k20 " << C20 / s2 / s0 << std::endl;
-    std::cout << " k21 " << C21 / s2 / s1 << std::endl;
-
-    std::cout << "\n k30 " << C30 / s3 / s0 << std::endl;
-    std::cout << " k31 " << C31 / s3 / s1 << std::endl;
-    std::cout << " k32 " << C32 / s3 / s2 << std::endl;
-
-    std::cout << "\n k40 " << C40 / s4 / s0 << std::endl;
-    std::cout << " k41 " << C41 / s4 / s1 << std::endl;
-    std::cout << " k42 " << C42 / s4 / s2 << std::endl;
-    std::cout << " k43 " << C43 / s4 / s3 << std::endl;
-
-    std::cout << "\n k50 " << C50 / s5 / s0 << std::endl;
-    std::cout << " k51 " << C51 / s5 / s1 << std::endl;
-    std::cout << " k52 " << C52 / s5 / s2 << std::endl;
-    std::cout << " k53 " << C53 / s5 / s3 << std::endl;
-    std::cout << " k54 " << C54 / s5 / s4 << std::endl;
-  }
-  else {
-    float s0 = sqrt(C00[i]);
-    float s1 = sqrt(C11[i]);
-    float s2 = sqrt(C22[i]);
-    float s3 = sqrt(C33[i]);
-    float s4 = sqrt(C44[i]);
-    float s5 = sqrt(C55[i]);
-
-    std::cout << "K = " << std::endl;
-    std::cout << " " << C10[i] / s1 / s0 << std::endl;
-    std::cout << " " << C20[i] / s2 / s0 << " " << C21[i] / s2 / s1 << std::endl;
-    std::cout << " " << C30[i] / s3 / s0 << " " << C31[i] / s3 / s1 << " " << C32[i] / s3 / s2 << std::endl;
-    std::cout << " " << C40[i] / s4 / s0 << " " << C41[i] / s4 / s1 << " " << C42[i] / s4 / s2 << " "
-              << C43[i] / s4 / s3 << std::endl;
-    std::cout << " " << C50[i] / s5 / s0 << " " << C51[i] / s5 / s1 << " " << C52[i] / s5 / s2 << " "
-              << C53[i] / s5 / s3 << " " << C54[i] / s5 / s4 << std::endl;
-  }
-  std::cout.flags(flagSafe);
+  x[iVec]  = p[0];
+  y[iVec]  = p[1];
+  tx[iVec] = p[2];
+  ty[iVec] = p[3];
+  qp[iVec] = p[4];
+  z[iVec]  = p[5];
+  t[iVec]  = p[6];
+  vi[iVec] = p[7];
+
+  fvec* tC = &(C00);
+  for (int i = 0; i < 28; i++) {
+    tC[i][iVec] = c[i];
+  }
+
+  chi2 = 0.;
+  NDF  = 0.;
+}
+
+template<typename T>
+inline void L1TrackPar::copyFromArrays(const T p[7], const T c[28])
+{
+  x  = p[0];
+  y  = p[1];
+  tx = p[2];
+  ty = p[3];
+  qp = p[4];
+  z  = p[5];
+  t  = p[6];
+  vi = p[7];
+
+  fvec* tC = &(C00);
+  for (int i = 0; i < 28; i++) {
+    tC[i] = c[i];
+  }
+
+  chi2 = 0.;
+  NDF  = 0.;
 }
 
+
 inline void L1TrackPar::SetOneEntry(const int i0, const L1TrackPar& T1, const int i1)
 {
-  x[i0]   = T1.x[i1];
-  y[i0]   = T1.y[i1];
-  tx[i0]  = T1.tx[i1];
-  ty[i0]  = T1.ty[i1];
-  qp[i0]  = T1.qp[i1];
-  z[i0]   = T1.z[i1];
-  t[i0]   = T1.t[i1];
+  x[i0]  = T1.x[i1];
+  y[i0]  = T1.y[i1];
+  tx[i0] = T1.tx[i1];
+  ty[i0] = T1.ty[i1];
+  qp[i0] = T1.qp[i1];
+  z[i0]  = T1.z[i1];
+  t[i0]  = T1.t[i1];
+  vi[i0] = T1.vi[i1];
+
   C00[i0] = T1.C00[i1];
   C10[i0] = T1.C10[i1];
   C11[i0] = T1.C11[i1];
@@ -238,114 +175,36 @@ inline void L1TrackPar::SetOneEntry(const int i0, const L1TrackPar& T1, const in
   C53[i0] = T1.C53[i1];
   C54[i0] = T1.C54[i1];
   C55[i0] = T1.C55[i1];
+  C60[i0] = T1.C60[i1];
+  C61[i0] = T1.C61[i1];
+  C62[i0] = T1.C62[i1];
+  C63[i0] = T1.C63[i1];
+  C64[i0] = T1.C64[i1];
+  C65[i0] = T1.C65[i1];
+  C66[i0] = T1.C66[i1];
 
   chi2[i0] = T1.chi2[i1];
   NDF[i0]  = T1.NDF[i1];
 }  // SetOneEntry
 
-inline bool L1TrackPar::IsEntryConsistent(bool printWhenWrong, int k) const
+inline void L1TrackPar::ResetErrors(fvec c00, fvec c11, fvec c22, fvec c33, fvec c44, fvec c55, fvec c66)
 {
-  bool ok = true;
-
-  // verify that all the numbers in the object are valid floats
-  const fvec* memberFirst = &x;
-  const fvec* memberLast  = &NDF;
-  for (int i = 0; i < &memberLast - &memberFirst + 1; i++) {
-    if (!std::isfinite(memberFirst[i][k])) {
-      ok = false;
-      if (printWhenWrong) {
-        std::cout << " L1TrackPar member N " << i << ", vector entry " << k
-                  << " is not a number: " << memberFirst[i][k];
-      }
-    }
-  }
-
-  // verify diagonal elements.
-  // Cii is a squared dispersion of i-th parameter, it must be positive
-
-  for (int i = 0; i < 6; i++) {
-    if (C(i, i)[k] <= 0.f) {
-      ok = false;
-      if (printWhenWrong) {
-        std::cout << " L1TrackPar: C[" << i << "," << i << "], vec entry " << k << " is not positive: " << C(i, i)[k]
-                  << std::endl;
-      }
-    }
-  }
-
-  // verify non-diagonal elements.
-  // Cij/sqrt(Cii*Cjj) is a correlation between i-th and j-th parameter,
-  // it must belong to [-1,1]
-
-  for (int i = 1; i < 6; i++) {
-    for (int j = 0; j < i; j++) {
-      double tolerance = 1.0;
-      if (C(i, j)[k] * C(i, j)[k] > tolerance * (C(i, i)[k] * C(j, j)[k])) {
-        ok = false;
-        if (printWhenWrong) {
-          std::cout << " L1TrackPar: correlation [" << i << "," << j << "], vec entry " << k
-                    << " is too large: " << C(i, i)[k] / sqrt(C(i, i)[k] * C(j, j)[k]) << std::endl;
-        }
-      }
-    }
-  }
-
-  // verify triplets of correlations
-  // Kxy * Kxy + Kxz * Kxz + Kyz * Kyz <= 1 + 2 * Kxy * Kxz * Kyz
-
-  for (int i = 2; i < 6; i++) {
-    for (int j = 1; j < i; j++) {
-      for (int m = 0; m < j; m++) {
-        double tolerance = 1.0;
-        double Cxx       = C(i, i)[k];
-        double Cyy       = C(j, j)[k];
-        double Czz       = C(m, m)[k];
-        double Cxy       = C(i, j)[k];
-        double Cxz       = C(i, m)[k];
-        double Cyz       = C(j, m)[k];
-        if (Cxx * Cyz * Cyz + Cyy * Cxz * Cxz + Czz * Cxy * Cxy
-            > tolerance * (Cxx * Cyy * Czz + 2. * Cxy * Cyz * Cxz)) {
-          ok = false;
-          if (printWhenWrong) {
-            double Kxy = Cxy / sqrt(Cxx * Cyy);
-            double Kxz = Cxz / sqrt(Cxx * Czz);
-            double Kyz = Cyz / sqrt(Cyy * Czz);
-            std::cout << " L1TrackPar: correlations between parametetrs " << i << ", " << j << ", " << m
-                      << ", vec entry " << k << " are wrong: " << Kxy << " " << Kxz << " " << Kyz << std::endl;
-            std::cout << " inequation: " << Kxy * Kxy + Kxz * Kxz + Kyz * Kyz << " > " << 1 + 2 * Kxy * Kxz * Kyz
-                      << std::endl;
-          }
-        }
-      }
-    }
-  }
-
-  if (!ok && printWhenWrong) {
-    std::cout << "L1TrackPar parameters are not consistent: " << std::endl;
-    Print(k);
-  }
-  return ok;
+  C10 = 0.;
+  C20 = C21 = 0.;
+  C30 = C31 = C32 = 0.;
+  C40 = C41 = C42 = C43 = 0.;
+  C50 = C51 = C52 = C53 = C54 = 0.;
+  C60 = C61 = C62 = C63 = C64 = C65 = 0.;
+
+  C00  = c00;
+  C11  = c11;
+  C22  = c22;
+  C33  = c33;
+  C44  = c44;
+  C55  = c55;
+  C66  = c66;
+  chi2 = 0.;
+  NDF  = -6.;
 }
 
-inline bool L1TrackPar::IsConsistent(bool printWhenWrong, int nFilled) const
-{
-  assert(nFilled <= (int) fvec::size());
-  bool ok = true;
-  if (nFilled < 0) { nFilled = fvec::size(); }
-  for (int i = 0; i < nFilled; ++i) {
-    ok = ok && IsEntryConsistent(printWhenWrong, i);
-  }
-
-  if (!ok && printWhenWrong) {
-    std::cout << "L1TrackPar parameters are not consistent: " << std::endl;
-    if (nFilled == (int) fvec::size()) { std::cout << "  All vector elements are filled " << std::endl; }
-    else {
-      std::cout << "  Only first " << nFilled << " vector elements are filled " << std::endl;
-    }
-    Print(-1);
-  }
-  return ok;
-}
-
-
 #endif
diff --git a/reco/L1/ParticleFinder/CbmL1PFFitter.cxx b/reco/L1/ParticleFinder/CbmL1PFFitter.cxx
index ab9b8c0aaddb5723ee1d3fa94397a82f903c3d8e..3264abf8aac9a8744d4deefe9a40c7e4790a5a16 100644
--- a/reco/L1/ParticleFinder/CbmL1PFFitter.cxx
+++ b/reco/L1/ParticleFinder/CbmL1PFFitter.cxx
@@ -100,27 +100,13 @@ inline CbmL1PFFitter::PFFieldRegion::PFFieldRegion(const L1FieldRegion& fld, int
 void FilterFirst(L1Fit& fit, fvec& x, fvec& y, fvec& dxx, fvec& dxy, fvec& dyy)
 {
   L1TrackPar& tr = fit.Tr();
-
-  tr.C00 = dxx;
+  tr.ResetErrors(dxx, dyy, vINF, vINF, 1., 1.e6, 1.e2);
   tr.C10 = dxy;
-  tr.C11 = dyy;
-  tr.C20 = ZERO;
-  tr.C21 = ZERO;
-  tr.C22 = vINF;
-  tr.C30 = ZERO;
-  tr.C31 = ZERO;
-  tr.C32 = ZERO;
-  tr.C33 = vINF;
-  tr.C40 = ZERO;
-  tr.C41 = ZERO;
-  tr.C42 = ZERO;
-  tr.C43 = ZERO;
-  tr.C44 = ONE;
-
-  tr.x    = x;
-  tr.y    = y;
-  tr.NDF  = -3.0;
-  tr.chi2 = ZERO;
+  tr.x   = x;
+  tr.y   = y;
+  tr.t   = 0.;
+  tr.vi  = 0.;
+  tr.NDF = -3.0;
 }
 
 void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
@@ -181,6 +167,10 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
 
   for (unsigned short itrack = 0; itrack < N_vTracks; itrack += fvec::size()) {
 
+    T.t  = 0.;
+    T.vi = 0.;
+    T.ResetErrors(1.e2, 1.e2, 1.e4, 1.e4, 1.e4, 1.e6, 1.e2);
+
     if (N_vTracks - itrack < static_cast<unsigned short>(fvec::size())) nTracks_SIMD = N_vTracks - itrack;
     for (i = 0; i < nTracks_SIMD; i++) {
       tr[i]    = &Tracks[itrack + i];  // current track
@@ -211,6 +201,7 @@ void CbmL1PFFitter::Fit(vector<CbmStsTrack>& Tracks, vector<int>& pidHypo)
       //       mass[i] = TDatabasePDG::Instance()->GetParticle(pid)->Mass();
       mass[i] = KFParticleDatabase::Instance()->GetMass(pid);
     }
+
     fit.SetParticleMass(mass);
 
     // get hits of current track