diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx
index 78abe8256f4785fc766a510187a7ff1b254ad781..d315c13d71ceda63406ac527fe256e380207e39a 100644
--- a/reco/L1/CbmL1.cxx
+++ b/reco/L1/CbmL1.cxx
@@ -641,7 +641,7 @@ InitStatus CbmL1::Init()
     trackingIterFastPrim.SetTripletChi2Cut(23.4450f);  // = 7.815 * 3;  // prob = 0.05
     trackingIterFastPrim.SetDoubletChi2Cut(7.56327f);  // = 1.3449 * 2.f / 3.f;  // prob = 0.1
     trackingIterFastPrim.SetPickGather(3.0f);
-    trackingIterFastPrim.SetPickNeighbour(5.0f);
+    trackingIterFastPrim.SetTripletLinkChi2(25.);
     trackingIterFastPrim.SetMaxInvMom(1.0 / 0.5);
     trackingIterFastPrim.SetMaxSlopePV(1.1f);
     trackingIterFastPrim.SetMaxSlope(2.748f);
@@ -657,7 +657,7 @@ InitStatus CbmL1::Init()
     trackingIterAllPrim.SetTripletChi2Cut(23.4450f);
     trackingIterAllPrim.SetDoubletChi2Cut(7.56327f);
     trackingIterAllPrim.SetPickGather(4.0f);
-    trackingIterAllPrim.SetPickNeighbour(5.0f);
+    trackingIterAllPrim.SetTripletLinkChi2(25.);
     trackingIterAllPrim.SetMaxInvMom(1.0 / 0.05);
     trackingIterAllPrim.SetMaxSlopePV(1.1f);
     trackingIterAllPrim.SetMaxSlope(2.748f);
@@ -673,7 +673,7 @@ InitStatus CbmL1::Init()
     trackingIterFastPrim2.SetTripletChi2Cut(21.1075f);
     trackingIterFastPrim2.SetDoubletChi2Cut(7.56327f);
     trackingIterFastPrim2.SetPickGather(3.0f);
-    trackingIterFastPrim2.SetPickNeighbour(5.0f);
+    trackingIterFastPrim2.SetTripletLinkChi2(25.);
     trackingIterFastPrim2.SetMaxInvMom(1.0 / 0.5);
     trackingIterFastPrim2.SetMaxSlopePV(1.1f);
     trackingIterFastPrim2.SetMaxSlope(2.748f);
@@ -689,7 +689,7 @@ InitStatus CbmL1::Init()
     trackingIterAllSec.SetTripletChi2Cut(18.7560f);  // = 6.252 * 3;  // prob = 0.1
     trackingIterAllSec.SetDoubletChi2Cut(7.56327f);
     trackingIterAllSec.SetPickGather(4.0f);
-    trackingIterAllSec.SetPickNeighbour(5.0f);
+    trackingIterAllSec.SetTripletLinkChi2(25.);
     trackingIterAllSec.SetMaxInvMom(1.0 / 0.1);
     trackingIterAllSec.SetMaxSlopePV(1.5f);
     trackingIterAllSec.SetMaxSlope(2.748f);
@@ -705,7 +705,7 @@ InitStatus CbmL1::Init()
     trackingIterFastPrimJump.SetTripletChi2Cut(21.1075f);  // prob = 0.01
     trackingIterFastPrimJump.SetDoubletChi2Cut(7.56327f);
     trackingIterFastPrimJump.SetPickGather(3.0f);
-    trackingIterFastPrimJump.SetPickNeighbour(5.0f);
+    trackingIterFastPrimJump.SetTripletLinkChi2(25.);
     trackingIterFastPrimJump.SetMaxInvMom(1.0 / 0.5);
     trackingIterFastPrimJump.SetMaxSlopePV(1.1f);
     trackingIterFastPrimJump.SetMaxSlope(2.748f);
@@ -722,7 +722,7 @@ InitStatus CbmL1::Init()
     trackingIterAllPrimJump.SetTripletChi2Cut(18.7560f);
     trackingIterAllPrimJump.SetDoubletChi2Cut(7.56327f);
     trackingIterAllPrimJump.SetPickGather(4.0f);
-    trackingIterAllPrimJump.SetPickNeighbour(5.0f);
+    trackingIterAllPrimJump.SetTripletLinkChi2(25.);
     trackingIterAllPrimJump.SetMaxInvMom(1.0 / 0.1);
     trackingIterAllPrimJump.SetMaxSlopePV(1.1f);
     trackingIterAllPrimJump.SetMaxSlope(2.748f);
@@ -739,7 +739,7 @@ InitStatus CbmL1::Init()
     trackingIterAllSecJump.SetTripletChi2Cut(21.1075f);
     trackingIterAllSecJump.SetDoubletChi2Cut(7.56327f);
     trackingIterAllSecJump.SetPickGather(4.0f);
-    trackingIterAllSecJump.SetPickNeighbour(5.0f);
+    trackingIterAllSecJump.SetTripletLinkChi2(25.);
     trackingIterAllSecJump.SetMaxInvMom(1.0 / 0.1);
     trackingIterAllSecJump.SetMaxSlopePV(1.5f);
     trackingIterAllSecJump.SetMaxSlope(2.748f);
@@ -756,7 +756,7 @@ InitStatus CbmL1::Init()
     trackingIterAllPrimE.SetTripletChi2Cut(23.4450f);
     trackingIterAllPrimE.SetDoubletChi2Cut(7.56327f);
     trackingIterAllPrimE.SetPickGather(4.0f);
-    trackingIterAllPrimE.SetPickNeighbour(5.0f);
+    trackingIterAllPrimE.SetTripletLinkChi2(25.);
     trackingIterAllPrimE.SetMaxInvMom(1.0 / 0.05);
     trackingIterAllPrimE.SetMaxSlopePV(1.1f);
     trackingIterAllPrimE.SetMaxSlope(2.748f);
@@ -773,7 +773,7 @@ InitStatus CbmL1::Init()
     trackingIterAllSecE.SetTripletChi2Cut(18.7560f);
     trackingIterAllSecE.SetDoubletChi2Cut(7.56327f);
     trackingIterAllSecE.SetPickGather(4.0f);
-    trackingIterAllSecE.SetPickNeighbour(5.0f);
+    trackingIterAllSecE.SetTripletLinkChi2(25.);
     trackingIterAllSecE.SetMaxInvMom(1.0 / 0.05);
     trackingIterAllSecE.SetMaxSlopePV(1.5f);
     trackingIterAllSecE.SetMaxSlope(2.748f);
@@ -830,7 +830,7 @@ InitStatus CbmL1::Init()
         it.SetTripletChi2Cut(23.4450f);  // = 7.815 * 3;  // prob = 0.05
         it.SetDoubletChi2Cut(7.56327f);  // = 1.3449 * 2.f / 3.f;  // prob = 0.1
         it.SetPickGather(3.0f);
-        it.SetPickNeighbour(4.0f);
+        it.SetTripletLinkChi2(16.0);
         it.SetMaxInvMom(1.0 / 0.1);  //(1.0 / 0.5);
         it.SetMaxSlopePV(.1f);
         it.SetMaxSlope(.5f);
@@ -850,7 +850,7 @@ InitStatus CbmL1::Init()
       trd2dIter2.SetTripletChi2Cut(2 * 23.4450f);   // = 7.815 * 3;  // prob = 0.05
       trd2dIter2.SetDoubletChi2Cut(4. * 7.56327f);  // = 1.3449 * 2.f / 3.f;  // prob = 0.1
       trd2dIter2.SetPickGather(3.0f);
-      trd2dIter2.SetPickNeighbour(4.0f);
+      trd2dIter2.SetTripletLinkChi2(16.);
       trd2dIter2.SetMaxInvMom(1.0 / 0.05);  //(1.0 / 0.5);
       trd2dIter2.SetMaxSlopePV(.5f);
       trd2dIter2.SetMaxSlope(.5f);
diff --git a/reco/L1/L1Algo/L1Algo.h b/reco/L1/L1Algo/L1Algo.h
index a9ee938f8134b6da6be3efa2be38c6aa6e8d9d31..6a4d8da4159767d1832763cbdada9791ea704bf8 100644
--- a/reco/L1/L1Algo/L1Algo.h
+++ b/reco/L1/L1Algo/L1Algo.h
@@ -407,6 +407,8 @@ public:
   int GetMcTrackIdForUnusedHit(int iHit);
 
 private:
+  bool checkTripletMatch(const L1Triplet& l, const L1Triplet& r, fscal& dchi2) const;
+
   int fNstationsBeforePipe {0};  ///< number of stations before pipe (MVD stations in CBM)
   int fNfieldStations {0};       ///< number of stations in the field region
   //alignas(16) L1StationsArray_t fStations {};  ///< array of L1Station objects
@@ -560,11 +562,11 @@ private:
 
   /// parameters which are different for different iterations. Set in the begin of CAL1TrackFinder
 
-  float fPickGather {L1Utils::kNaN};     ///< same for attaching additional hits to track
-  float fPickNeighbour {L1Utils::kNaN};  ///< (fPickNeighbour < dp/dp_error)  =>  triplets are neighbours
-  fvec fMaxInvMom {L1Utils::kNaN};       ///< max considered q/p for tracks
-  fvec fMaxSlopePV {L1Utils::kNaN};      ///< max slope (tx\ty) in prim vertex
-  float fMaxSlope {L1Utils::kNaN};       ///< max slope (tx\ty) in 3d hit position of a triplet
+  float fPickGather {L1Utils::kNaN};       ///< same for attaching additional hits to track
+  float fTripletLinkChi2 {L1Utils::kNaN};  ///< (dp2/dp_error2 < fTripletLinkChi2)  =>  triplets are neighbours
+  fvec fMaxInvMom {L1Utils::kNaN};         ///< max considered q/p for tracks
+  fvec fMaxSlopePV {L1Utils::kNaN};        ///< max slope (tx\ty) in prim vertex
+  float fMaxSlope {L1Utils::kNaN};         ///< max slope (tx\ty) in 3d hit position of a triplet
 
   fvec fTargX {L1Utils::kNaN};  ///< target position x coordinate for the current iteration (modifiable)
   fvec fTargY {L1Utils::kNaN};  ///< target position y coordinate for the current iteration (modifiable)
diff --git a/reco/L1/L1Algo/L1CAIteration.cxx b/reco/L1/L1Algo/L1CAIteration.cxx
index 2239687a2b81cd381242b80eb2196253d6f01bed..6fc58614647e525a2b8c787b0894a9987f0a27c4 100644
--- a/reco/L1/L1Algo/L1CAIteration.cxx
+++ b/reco/L1/L1Algo/L1CAIteration.cxx
@@ -34,7 +34,7 @@ bool L1CAIteration::Check() const
   res = this->CheckValueLimits<float>("triplet_chi2_cut", fTripletChi2Cut, 0.f, kMaxFloat) && res;
   res = this->CheckValueLimits<float>("doublet_chi2_cut", fDoubletChi2Cut, 0.f, kMaxFloat) && res;
   res = this->CheckValueLimits<float>("pick_gather", fPickGather, 0.f, kMaxFloat) && res;
-  res = this->CheckValueLimits<float>("pick_neighbour", fPickNeighbour, 0.f, kMaxFloat) && res;
+  res = this->CheckValueLimits<float>("triplet_link_chi2", fTripletLinkChi2, 0.f, kMaxFloat) && res;
   res = this->CheckValueLimits<float>("min_momentum", fMaxInvMom, 1.f / kMaxFloat, 1.f / 0.001f) && res;
   res = this->CheckValueLimits<float>("max_slope_pv", fMaxSlopePV, 0.f, kMaxFloat) && res;
   res = this->CheckValueLimits<float>("max_slope", fMaxSlope, 0.f, kMaxFloat) && res;
@@ -82,7 +82,7 @@ std::string L1CAIteration::ToString(int indentLevel) const
   aStream << indent << indCh << "Triplet chi2 cut:                       " << fTripletChi2Cut << '\n';
   aStream << indent << indCh << "Doublet chi2 cut:                       " << fDoubletChi2Cut << '\n';
   aStream << indent << indCh << "Pick gather:                            " << fPickGather << '\n';
-  aStream << indent << indCh << "Pick neighbour:                         " << fPickNeighbour << '\n';
+  aStream << indent << indCh << "Triplet link chi2:                      " << fTripletLinkChi2 << '\n';
   aStream << indent << indCh << "Max inverse momentum:                   " << fMaxInvMom << '\n';
   aStream << indent << indCh << "Max slope at primary vertex:            " << fMaxSlopePV << '\n';
   aStream << indent << indCh << "Max slope:                              " << fMaxSlope << '\n';
diff --git a/reco/L1/L1Algo/L1CAIteration.h b/reco/L1/L1Algo/L1CAIteration.h
index dabec209a6c83a1198f9f8c09f9adddf039f5940..a6e3d59f0360f8f44bd00f6ee50e23619ad17fcb 100644
--- a/reco/L1/L1Algo/L1CAIteration.h
+++ b/reco/L1/L1Algo/L1CAIteration.h
@@ -87,7 +87,7 @@ public:
   float GetPickGather() const { return fPickGather; }
 
   /// Gets min value of dp/dp_error, for which two tiplets are neighbours
-  float GetPickNeighbour() const { return fPickNeighbour; }
+  float GetTripletLinkChi2() const { return fTripletLinkChi2; }
 
   /// Checks flag: true - only primary tracks are searched, false - [all or only secondary?]
   bool GetPrimaryFlag() const { return fIsPrimary; }
@@ -161,7 +161,7 @@ public:
   void SetPickGather(float input) { fPickGather = input; }
 
   /// Sets min value of dp/dp_error, for which two tiplets are neighbours
-  void SetPickNeighbour(float input) { fPickNeighbour = input; }
+  void SetTripletLinkChi2(float input) { fTripletLinkChi2 = input; }
 
   /// Sets flag: primary tracks - true, secondary tracks - false
   void SetPrimaryFlag(bool flag) { fIsPrimary = flag; }
@@ -209,18 +209,18 @@ private:
   // NOTE: For each new cut one should not forget to create a setter and a getter, insert the value
   //       initialization in the copy constructor and the Swap operator as well as a string repre-
   //       sentation to the ToString method (S.Zharko)
-  float fTrackChi2Cut       = 10.f;                 ///< Track chi2 upper cut
-  float fTripletChi2Cut     = 21.1075f;             ///< Triplet chi2 upper cut
-  float fDoubletChi2Cut     = 11.3449 * 2.f / 3.f;  ///< Doublet chi2 upper cut
-  float fPickGather         = 3.0;                  ///< Size of region to attach new hits to the created track
-  float fPickNeighbour      = 5.0;                  ///< Min value of dp/dp_error, for which two tiplets are neighbours
-  float fMaxInvMom          = 1.0 / 0.5;            ///< Max considered q/p for tracks
-  float fMaxSlopePV         = 1.1;                  ///< Max slope (tx\ty) in primary vertex
-  float fMaxSlope           = 2.748;                ///< Max slope (tx\ty) in 3D hit position of a triplet
-  float fMaxDZ              = 0.f;                  ///< Correction for accounting overlaping and iff z [cm]
-  float fTargetPosSigmaX    = 0;                    ///< Constraint on target position in X direction [cm]
-  float fTargetPosSigmaY    = 0;                    ///< Constraint on target position in Y direction [cm]
-  int fFirstStationIndex = 0;                       ///< First station, used for tracking
+  float fTrackChi2Cut    = 10.f;                 ///< Track chi2 upper cut
+  float fTripletChi2Cut  = 21.1075f;             ///< Triplet chi2 upper cut
+  float fDoubletChi2Cut  = 11.3449 * 2.f / 3.f;  ///< Doublet chi2 upper cut
+  float fPickGather      = 3.0;                  ///< Size of region to attach new hits to the created track
+  float fTripletLinkChi2 = 25.0;                 ///< Min value of dp^2/dp_error^2, for which two tiplets are neighbours
+  float fMaxInvMom       = 1.0 / 0.5;            ///< Max considered q/p for tracks
+  float fMaxSlopePV      = 1.1;                  ///< Max slope (tx\ty) in primary vertex
+  float fMaxSlope        = 2.748;                ///< Max slope (tx\ty) in 3D hit position of a triplet
+  float fMaxDZ           = 0.f;                  ///< Correction for accounting overlaping and iff z [cm]
+  float fTargetPosSigmaX = 0;                    ///< Constraint on target position in X direction [cm]
+  float fTargetPosSigmaY = 0;                    ///< Constraint on target position in Y direction [cm]
+  int fFirstStationIndex = 0;                    ///< First station, used for tracking
 
   bool fIsPrimary  = false;  ///< Flag: true - only primary tracks are searched for
   bool fIsElectron = false;  ///< Flag: true - only electrons are searched for
@@ -252,7 +252,7 @@ private:
     ar& fTripletChi2Cut;
     ar& fDoubletChi2Cut;
     ar& fPickGather;
-    ar& fPickNeighbour;
+    ar& fTripletLinkChi2;
     ar& fMaxInvMom;
     ar& fMaxSlopePV;
     ar& fMaxSlope;
diff --git a/reco/L1/L1Algo/L1CATrackFinder.cxx b/reco/L1/L1Algo/L1CATrackFinder.cxx
index 5706968165f255f4708bda888d7fb05734a0b721..6ecdb20e68dd4b4f927c6b7d6dd3f13bc40c72be 100644
--- a/reco/L1/L1Algo/L1CATrackFinder.cxx
+++ b/reco/L1/L1Algo/L1CATrackFinder.cxx
@@ -74,6 +74,54 @@ using std::cout;
 using std::endl;
 
 
+bool L1Algo::checkTripletMatch(const L1Triplet& l, const L1Triplet& r, fscal& dchi2) const
+{
+  dchi2 = 0.;
+
+  if (r.GetMHit() != l.GetRHit()) return false;
+  if (r.GetLHit() != l.GetMHit()) return false;
+
+  if (r.GetMSta() != l.GetRSta()) return false;
+  if (r.GetLSta() != l.GetMSta()) return false;
+
+  fscal dqp = fabs(l.GetQp() - r.GetQp());
+  fscal Cqp = l.GetCqp() + r.GetCqp();
+
+  fscal dtx = fabs(l.GetTx() - r.GetTx());
+  fscal Ctx = l.GetCtx() + r.GetCtx();
+
+  fscal dty = fabs(l.GetTy() - r.GetTy());
+  fscal Cty = l.GetCty() + r.GetCty();
+
+  if (kGlobal != fTrackingMode && kMcbm != fTrackingMode) {
+    if (!std::isfinite(dqp)) return false;
+    if (!std::isfinite(Cqp)) return false;
+    if (dqp * dqp > fTripletLinkChi2 * Cqp) {
+      return false;  // bad neighbour // CHECKME why do we need recheck it?? (it really change result)
+    }
+  }
+  else {
+
+    // it shouldn't happen, but happens sometimes
+
+    if (!std::isfinite(dtx)) return false;
+    if (!std::isfinite(dty)) return false;
+    if (!std::isfinite(Ctx)) return false;
+    if (!std::isfinite(Cty)) return false;
+
+    if (dty * dty > fTripletLinkChi2 * Cty) return false;
+    if (dtx * dtx > fTripletLinkChi2 * Ctx) return false;
+  }
+
+  if (kGlobal == fTrackingMode || kMcbm == fTrackingMode) { dchi2 = dtx * dtx / Ctx + dty * dty / Cty; }
+  else {
+    dchi2 = dqp * dqp / Cqp;
+  }
+  if (!std::isfinite(dchi2)) return false;
+
+  return true;
+}
+
 inline void L1Algo::findSingletsStep0(  // input
   Tindex start_lh, Tindex n1_l, L1HitPoint* Hits_l,
   // output
@@ -1204,7 +1252,8 @@ inline void L1Algo::findTripletsStep3(  // input
 
       L1Triplet& curNeighbour = fTriplets[neighStation][neighThread][neighTriplet];
 
-      if ((curNeighbour.GetMHit() != ihitr)) continue;
+      fscal dchi2 = 0.;
+      if (!checkTripletMatch(tr1, curNeighbour, dchi2)) continue;
 
       if (tr1.GetFNeighbour() == 0) tr1.SetFNeighbour(neighLocation);
 
@@ -1278,9 +1327,8 @@ inline void L1Algo::f5(  // input
               //      if (neigh.GetMSta() != istar) continue; // neighbours should have 2 common hits
               //      if (neigh.GetMHit() != ihitr) continue; //!!!
 
-              if (fabs(trip.GetQp() - neigh.GetQp()) > fPickNeighbour * sqrt(trip.GetCqp() + neigh.GetCqp())) {
-                continue;  // neighbours should have same qp
-              }
+              fscal dchi2 = 0.;
+              if (!checkTripletMatch(trip, neigh, dchi2)) continue;
 
               // calculate level
               unsigned char jlevel = neigh.GetLevel();
@@ -1818,15 +1866,15 @@ void L1Algo::CATrackFinder()
       {
         // --- SET PARAMETERS FOR THE ITERATION ---
 
-        fFirstCAstation = caIteration.GetFirstStationIndex();
-        fTrackChi2Cut   = caIteration.GetTrackChi2Cut();
-        fDoubletChi2Cut = caIteration.GetDoubletChi2Cut();  //11.3449 * 2.f / 3.f;  // prob = 0.1
-        fTripletChi2Cut = caIteration.GetTripletChi2Cut();  //21.1075;  // prob = 0.01%
-        fPickGather     = caIteration.GetPickGather();      //3.0;
-        fPickNeighbour  = caIteration.GetPickNeighbour();   //5.0;
-        fMaxInvMom      = caIteration.GetMaxInvMom();       //1.0 / 0.5;  // max considered q/p
-        fMaxSlopePV     = caIteration.GetMaxSlopePV();      //1.1;
-        fMaxSlope       = caIteration.GetMaxSlope();        //2.748;  // corresponds to 70 grad
+        fFirstCAstation  = caIteration.GetFirstStationIndex();
+        fTrackChi2Cut    = caIteration.GetTrackChi2Cut();
+        fDoubletChi2Cut  = caIteration.GetDoubletChi2Cut();   //11.3449 * 2.f / 3.f;  // prob = 0.1
+        fTripletChi2Cut  = caIteration.GetTripletChi2Cut();   //21.1075;  // prob = 0.01%
+        fPickGather      = caIteration.GetPickGather();       //3.0;
+        fTripletLinkChi2 = caIteration.GetTripletLinkChi2();  //5.0;
+        fMaxInvMom       = caIteration.GetMaxInvMom();        //1.0 / 0.5;  // max considered q/p
+        fMaxSlopePV      = caIteration.GetMaxSlopePV();       //1.1;
+        fMaxSlope        = caIteration.GetMaxSlope();         //2.748;  // corresponds to 70 grad
 
         // define the target
         fTargX = fParameters.GetTargetPositionX();
@@ -2652,42 +2700,9 @@ inline void L1Algo::CAFindTrack(int ista, L1Branch& best_tr, unsigned char& best
       unsigned int Triplet = TripletId2Triplet(ID);
 
       const L1Triplet& new_trip = fTriplets[Station][Thread][Triplet];
-      if ((new_trip.GetMHit() != curr_trip->GetRHit())) continue;
-      if ((new_trip.GetLHit() != curr_trip->GetMHit())) continue;
-
-      fscal dqp = fabs(curr_trip->GetQp() - new_trip.GetQp());
-      fscal Cqp = curr_trip->GetCqp() + new_trip.GetCqp();
-
-      fscal dtx = fabs(curr_trip->GetTx() - new_trip.GetTx());
-      fscal Ctx = curr_trip->GetCtx() + new_trip.GetCtx();
-
-      fscal dty = fabs(curr_trip->GetTy() - new_trip.GetTy());
-      fscal Cty = curr_trip->GetCty() + new_trip.GetCty();
-
-      if (kGlobal != fTrackingMode && kMcbm != fTrackingMode) {
-        if (!std::isfinite(dqp)) continue;
-        if (!std::isfinite(Cqp)) continue;
-        if (dqp > fPickNeighbour * sqrt(Cqp)) {
-          continue;  // bad neighbour // CHECKME why do we need recheck it?? (it really change result)
-        }
-      }
-      else {
-
-        // it shouldn't happen, but happens sometimes
-
-        if (!std::isfinite(dtx)) continue;
-        if (!std::isfinite(dty)) continue;
-        if (!std::isfinite(Ctx)) continue;
-        if (!std::isfinite(Cty)) continue;
 
-        assert(std::isfinite(dtx));
-        assert(std::isfinite(dty));
-        assert(std::isfinite(Ctx));
-        assert(std::isfinite(Cty));
-
-        if (dty > fPickNeighbour * sqrt(Cty)) continue;
-        if (dtx > fPickNeighbour * sqrt(Ctx)) continue;
-      }
+      fscal dchi2 = 0.;
+      if (!checkTripletMatch(*curr_trip, new_trip, dchi2)) continue;
 
       if (fvHitKeyFlags[(*vHitsUnused)[new_trip.GetLHit()].f]
           || fvHitKeyFlags[(*vHitsUnused)[new_trip.GetLHit()].b]) {  //hits are used
@@ -2702,21 +2717,8 @@ inline void L1Algo::CAFindTrack(int ista, L1Branch& best_tr, unsigned char& best
       else {  // hit is not used: add the left hit from the new triplet to the current track
 
         unsigned char new_L = curr_L + 1;
-        fscal new_chi2      = curr_chi2;
+        fscal new_chi2      = curr_chi2 + dchi2;
 
-        if (kGlobal == fTrackingMode || kMcbm == fTrackingMode) {
-          dtx = dtx / sqrt(Ctx);
-          dty = dty / sqrt(Cty);
-
-          assert(std::isfinite(dtx));
-          assert(std::isfinite(dty));
-          new_chi2 += dtx * dtx;
-          new_chi2 += dty * dty;
-        }
-        else {
-          dqp = dqp / sqrt(Cqp);
-          new_chi2 += dqp * dqp;
-        }
 
         if (0) {  //SGtrd2d debug!!
           int mc01 = GetMcTrackIdForUnusedHit(curr_trip->GetLHit());
diff --git a/reco/L1/L1Algo/L1ConfigRW.cxx b/reco/L1/L1Algo/L1ConfigRW.cxx
index 9a57f57063f151f4679f08c90014f169a517ef86..79c5ac68fe8b7615b3965b16d5bfd57884eb1f21 100644
--- a/reco/L1/L1Algo/L1ConfigRW.cxx
+++ b/reco/L1/L1Algo/L1ConfigRW.cxx
@@ -65,7 +65,7 @@ void L1ConfigRW::ReadCAIterations(const YAML::Node& node)
         caIter.SetTripletChi2Cut(input["triplet_chi2_cut"].as<float>(caIter.GetTripletChi2Cut()));
         caIter.SetDoubletChi2Cut(input["doublet_chi2_cut"].as<float>(caIter.GetDoubletChi2Cut()));
         caIter.SetPickGather(input["pick_gather"].as<float>(caIter.GetPickGather()));
-        caIter.SetPickNeighbour(input["pick_neighbour"].as<float>(caIter.GetPickNeighbour()));
+        caIter.SetTripletLinkChi2(input["triplet_link_chi2"].as<float>(caIter.GetTripletLinkChi2()));
         caIter.SetMaxInvMom(1. / input["min_momentum"].as<float>(caIter.GetMaxInvMom()));
         caIter.SetMaxSlopePV(input["max_slope_pv"].as<float>(caIter.GetMaxSlopePV()));
         caIter.SetMaxSlope(input["max_slope"].as<float>(caIter.GetMaxSlope()));
diff --git a/reco/L1/L1Algo/L1Triplet.h b/reco/L1/L1Algo/L1Triplet.h
index 933758eb80f3f0d49ffcfc492f3d1a5d1673801d..1e0102cde333652ea2aeda4861d7f9cb0671bbdd 100644
--- a/reco/L1/L1Algo/L1Triplet.h
+++ b/reco/L1/L1Algo/L1Triplet.h
@@ -92,7 +92,7 @@ private:
   /// level k = k-ths triplet along the track counting upstream, from right to left.
   unsigned char fLevel = 0;
 
-  unsigned char fSta = 0;  ///< packed station numbers: staL (4b), staM-1-staL (2b), staR-2-staL (2b)
+  unsigned short fSta = 0;  ///< packed station numbers: staL (12b), staM-1-staL (2b), staR-2-staL (2b)
 };
 
 #endif