diff --git a/macro/run/run_reco_tb_track.C b/macro/run/run_reco_tb_track.C
index 67cd67d0632a8e9d91d24d1d4e4c81a97e5f8d2c..518cf39ce92a0d48357298ada55807b74a538127 100644
--- a/macro/run/run_reco_tb_track.C
+++ b/macro/run/run_reco_tb_track.C
@@ -170,14 +170,14 @@ void run_reco_tb_track(TString dataSet = "test",
   //    run->AddTask(ECbmModuleId::psdHit);
   //    std::cout << "-I- : Added task CbmPsdHitProducer" << std::endl;
 
-  //  // --- STS track finder
-  //  run->AddTask(new CbmKF());
-  //  CbmL1* l1 = new CbmL1();
-  //  l1->SetDataMode(1);
-  //  run->AddTask(l1);
-  //  CbmStsTrackFinder* stsTrackFinder = new CbmL1StsTrackFinder();
-  //  FairTask* stsFindTracks = new CbmStsFindTracks(0, stsTrackFinder);
-  //  run->AddTask(stsFindTracks);
+  // --- STS track finder
+  run->AddTask(new CbmKF());
+  CbmL1* l1 = new CbmL1();
+  l1->SetDataMode(1);
+  run->AddTask(l1);
+  CbmStsTrackFinder* stsTrackFinder = new CbmL1StsTrackFinder();
+  FairTask* stsFindTracks           = new CbmStsFindTracks(0, stsTrackFinder);
+  run->AddTask(stsFindTracks);
   //
   //  // --- Event builder (track-based)
   //  run->AddTask(new CbmBuildEventsFromTracksReal());
diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx
index a7cd67c9f52a4a98f93bf49bb41dc45656caa3b7..9052a7ec4132d8b5557487f2362a8aa001e1011a 100644
--- a/reco/L1/CbmL1.cxx
+++ b/reco/L1/CbmL1.cxx
@@ -387,6 +387,8 @@ InitStatus CbmL1::Init() {
     if (FindTask) fUseMVD = FindTask->MvdUsage();
   }
 
+  fUseMVD = 0;
+
   histodir = gROOT->mkdir("L1");
 
 
@@ -1309,7 +1311,7 @@ void CbmL1::Reconstruct(CbmEvent* event) {
   static int nevent = 0;
   vFileEvent.clear();
 
-  if (fTimesliceMode) {
+  if (fTimesliceMode && fPerformance) {
 
     int nofEvents = fEventList->GetNofEvents();
     for (int iE = 0; iE < nofEvents; iE++) {
@@ -1325,6 +1327,7 @@ void CbmL1::Reconstruct(CbmEvent* event) {
     vFileEvent.insert(DFSET::value_type(iFile, iEvent));
   }
 
+
   if (fVerbose > 1)
     cout << endl << "CbmL1::Exec event " << ++nevent << " ..." << endl << endl;
 #ifdef _OPENMP
diff --git a/reco/L1/CbmL1Performance.cxx b/reco/L1/CbmL1Performance.cxx
index 4edce3d4798589bc96a115a56d97b5dc017053d5..26ffa1d53a894fb11d20d15f6485e34afadc1b78 100644
--- a/reco/L1/CbmL1Performance.cxx
+++ b/reco/L1/CbmL1Performance.cxx
@@ -2757,6 +2757,7 @@ void CbmL1::InputPerformance() {
           link       = hm->GetLink(iLink);
         }
       }
+
       // if (bestWeight / totalWeight < 0.7 || iMCPoint < 0) continue;
 
       if (iMCPoint < 0) continue;
diff --git a/reco/L1/CbmL1ReadEvent.cxx b/reco/L1/CbmL1ReadEvent.cxx
index f32c3cf00912598a940eab739cd46d90e21a3ee3..b9d4a5e92846c62e948c30071c978ae18713eeee 100644
--- a/reco/L1/CbmL1ReadEvent.cxx
+++ b/reco/L1/CbmL1ReadEvent.cxx
@@ -1075,14 +1075,14 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, CbmEvent* event) {
     h.t_reco = th.time;
     h.t_er   = th.t_er;
     //  h.track = th.track;
-    h.dx  = th.dx;
-    h.dy  = th.dy;
-    h.du  = th.du;
-    h.dv  = th.dv;
-    h.dxy = th.dxy;
+    //    h.dx  = th.dx;
+    //    h.dy  = th.dy;
+    h.du = th.du;
+    h.dv = th.dv;
+    //    h.dxy = th.dxy;
     //     h.p = th.p;
     //     h.q = th.q;
-    h.ista = th.iStation;
+    // h.ista = th.iStation;
 
     // find and save z positions
     float z_tmp = -111.;
@@ -1575,6 +1575,7 @@ void CbmL1::HitMatch() {
             iEvent = vFileEvent.begin()->second;
           }
           int nMvdPoints_ = 0;
+
           if (!fTimesliceMode)
             if (listMvdPts) nMvdPoints_ = listMvdPts->GetEntriesFast();
 
diff --git a/reco/L1/L1Algo/L1Algo.cxx b/reco/L1/L1Algo/L1Algo.cxx
index 886e16b9f808e620b3c7be7308bb80a14e96b6a0..0c5fff580ae9fc5328b5cc9941077d49918e2c33 100644
--- a/reco/L1/L1Algo/L1Algo.cxx
+++ b/reco/L1/L1Algo/L1Algo.cxx
@@ -276,6 +276,30 @@ void L1Algo::StripsToCoor(const fscal& u,
   _y = sta.yInfo.cos_phi * u + sta.yInfo.sin_phi * v;
 }
 
+void L1Algo::dUdV_to_dY(const fvec& u,
+                        const fvec& v,
+                        fvec& _y,
+                        const L1Station& sta) {
+  _y = sqrt((sta.yInfo.cos_phi * u) * (sta.yInfo.cos_phi * u)
+            + (sta.yInfo.sin_phi * v) * (sta.yInfo.sin_phi * v));
+}
+
+void L1Algo::dUdV_to_dX(const fvec& u,
+                        const fvec& v,
+                        fvec& _x,
+                        const L1Station& sta) {
+  _x = sqrt((sta.xInfo.sin_phi * u) * (sta.xInfo.sin_phi * u)
+            + (sta.xInfo.cos_phi * v) * (sta.xInfo.cos_phi * v));
+}
+
+void L1Algo::dUdV_to_dXdY(const fvec& u,
+                          const fvec& v,
+                          fvec& _xy,
+                          const L1Station& sta) {
+  _xy = ((sta.xInfo.sin_phi * u) * (sta.yInfo.cos_phi * u)
+         + (sta.xInfo.cos_phi * v) * (sta.yInfo.sin_phi * v));
+}
+
 void L1Algo::StripsToCoor(const fvec& u,
                           const fvec& v,
                           fvec& x,
@@ -294,34 +318,26 @@ void L1Algo::StripsToCoor(const fvec& u,
 L1HitPoint L1Algo::CreateHitPoint(const L1StsHit& hit, char ista)
 /// hit and station number
 {
-  L1Station& sta   = vStations[int(ista)];
-  const L1Strip& u = (*vStsStrips)[hit.f];
-  const L1Strip& v = (*vStsStripsB)[hit.b];
-  fscal x, y;
-  StripsToCoor(u, v, x, y, sta);
+  // L1Station& sta   = vStations[int(ista)];
+  const L1Strip& u  = (*vStsStrips)[hit.f];
+  const L1Strip& v  = (*vStsStripsB)[hit.b];
   const float& z    = (*vStsZPos)[hit.iz];
   const float& time = hit.t_reco;
-  return L1HitPoint(
-    x, y, hit.dx, hit.dy, hit.dxy, z, u, v, hit.du, hit.dv, time, hit.t_er);
+  return L1HitPoint(z, u, v, hit.du, hit.dv, time, hit.t_er);
 }
 
 void L1Algo::CreateHitPoint(const L1StsHit& hit, char ista, L1HitPoint& point)
 /// hit and station number
 {
-  L1Station& sta   = vStations[int(ista)];
-  const L1Strip& u = (*vStsStrips)[hit.f];
-  const L1Strip& v = (*vStsStripsB)[hit.b];
-  fscal x, y;
-  StripsToCoor(u, v, x, y, sta);
+  // L1Station& sta   = vStations[int(ista)];
+  const L1Strip& u  = (*vStsStrips)[hit.f];
+  const L1Strip& v  = (*vStsStripsB)[hit.b];
   const float& z    = (*vStsZPos)[hit.iz];
   const float& time = hit.t_reco;
-  const float& dx_  = hit.dx;
-  const float& dy_  = hit.dy;
   const float& du_  = hit.du;
   const float& dv_  = hit.dv;
-  const float& dxy_ = hit.dxy;
 
-  point.Set(x, y, dx_, dy_, dxy_, z, u.f, v.f, du_, dv_, time, hit.t_er);
+  point.Set(z, u.f, v.f, du_, dv_, time, hit.t_er);
   //   point.Set(x,y,z,v.f,u.f, time, n1, hit.time1, 2.9 ); // TODO put correct time error from the hit
 }
 
diff --git a/reco/L1/L1Algo/L1Algo.h b/reco/L1/L1Algo/L1Algo.h
index 3d82474ac15f35135acc1b99d7480cd7214587bd..774d276f9532b41bb301b4e92be220b104f0bdd2 100644
--- a/reco/L1/L1Algo/L1Algo.h
+++ b/reco/L1/L1Algo/L1Algo.h
@@ -30,7 +30,7 @@ class L1AlgoDraw;
 #endif
 //#define USE_EVENT_NUMBER
 //#endif
-#define MERGE_CLONES
+//#define MERGE_CLONES
 
 
 #include "L1Branch.h"
@@ -459,6 +459,14 @@ public:
                   fscal& _y,
                   fscal& _z,
                   const L1Station& sta);
+
+  void dUdV_to_dY(const fvec& u, const fvec& v, fvec& _y, const L1Station& sta);
+
+  void dUdV_to_dX(const fvec& u, const fvec& v, fvec& _x, const L1Station& sta);
+
+  void
+  dUdV_to_dXdY(const fvec& u, const fvec& v, fvec& _xy, const L1Station& sta);
+
   void GetHitCoor(const L1StsHit& _h, fscal& _x, fscal& _y, char iS);
   void StripsToCoor(
     const fscal& u,
@@ -683,8 +691,8 @@ private:
     nsL1::vector<fvec>::TSimd& u_front_3,
     nsL1::vector<fvec>::TSimd& u_back_3,
     nsL1::vector<fvec>::TSimd& z_Pos_3,
-    nsL1::vector<fvec>::TSimd& dx_,
-    nsL1::vector<fvec>::TSimd& dy_,
+    //    nsL1::vector<fvec>::TSimd& dx_,
+    //    nsL1::vector<fvec>::TSimd& dy_,
     nsL1::vector<fvec>::TSimd& du_,
     nsL1::vector<fvec>::TSimd& dv_,
     nsL1::vector<fvec>::TSimd& timeR,
@@ -697,8 +705,8 @@ private:
     nsL1::vector<fvec>::TSimd& u_front_3,
     nsL1::vector<fvec>::TSimd& u_back_3,
     nsL1::vector<fvec>::TSimd& z_Pos_3,
-    nsL1::vector<fvec>::TSimd& dx_,
-    nsL1::vector<fvec>::TSimd& dy_,
+    //    nsL1::vector<fvec>::TSimd& dx_,
+    //    nsL1::vector<fvec>::TSimd& dy_,
     nsL1::vector<fvec>::TSimd& du_,
     nsL1::vector<fvec>::TSimd& dv_,
     nsL1::vector<fvec>::TSimd& timeR,
diff --git a/reco/L1/L1Algo/L1Branch.h b/reco/L1/L1Algo/L1Branch.h
index a9fdc8779757f34a024f30375d465dcd0188021f..00d6a40b4de779748003829d303174f010e40bce 100644
--- a/reco/L1/L1Algo/L1Branch.h
+++ b/reco/L1/L1Algo/L1Branch.h
@@ -26,43 +26,26 @@ class L1Triplet;
 
 struct L1Branch {
   L1Branch()
-    : n(0)
-    , Quality(0)
-    , CandIndex(0)
+    :  //Quality(0),
+    ista(0)
     , Momentum(0)
-    , chi2(0)
     , NHits(0)
-    , Lengtha(0)
-    , ista(0)
-    , location(0)
+    , chi2(0)
+    , CandIndex(0)
     , StsHits() {
     //  L1Branch():Momentum(0),chi2(0),NHits(0),Lengtha(0),ista(0) , StsHits(){
     StsHits.resize(12);
-    // CandToCand.resize(200);
-    //   CandToCand2.resize(200);
-    //  StsHits.reserve(8);
   }
 
-
-  int n;
-  unsigned short int Quality;
+  // unsigned short int Quality;
+  unsigned char ista;
   //   fscal Quality;
+  // unsigned char      iN; // iStation(3b) + nHits(5b)
+  char Momentum, NHits;
+  // char Lengtha;
+  fscal chi2;
   int CandIndex;
 
-  //   bool SecondBest;
-  //   bool ThirdBest;
-  fscal Momentum, chi2;
-  char NHits;
-  char Lengtha;
-  unsigned char ista;
-  int location;
-  // int check;
-
-  //  float time_dif;
-
-
-  //   L1Branch* BestCandidateP;
-  //   L1Branch* SecondBestCandidateP;
 
   L1Vector<THitI> StsHits;
 
@@ -103,7 +86,7 @@ struct L1Branch {
 
   inline static bool compareCand(const L1Branch& a, const L1Branch& b) {
 
-    if (a.Lengtha != b.Lengtha) return (a.Lengtha > b.Lengtha);
+    if (a.NHits != b.NHits) return (a.NHits > b.NHits);
 
     if (a.ista != b.ista)
       return (a.ista < b.ista);
@@ -113,9 +96,9 @@ struct L1Branch {
   }
 
 
-  static bool compareChi2(const L1Branch& a, const L1Branch& b) {
-    return (a.Quality > b.Quality);
-  }
+  //    static bool compareChi2(const L1Branch &a, const L1Branch &b){
+  //    return (a.Quality > b.Quality );
+  //  }
 
   //      static bool compareChi2(const L1Branch &a, const L1Branch &b){
   //          if (a.Lengtha != b.Lengtha) return (a.Lengtha > b.Lengtha);
@@ -132,14 +115,15 @@ struct L1Branch {
   //}
 
   void Set(unsigned char iStation, unsigned char Length, float Chi2, float Qp) {
-    Lengtha                   = Length;
-    ista                      = iStation;
-    unsigned short int ista_l = 16 - iStation;
-    float tmp                 = sqrt(Chi2) / 3.5 * 255;
+    NHits = Length;
+    ista  = iStation;
+    //  iN = ( (static_cast<unsigned char>( Chi2 ))<<3 ) + (Level%8);
+    //unsigned short int ista_l = 16-iStation;
+    float tmp = sqrt(Chi2) / 3.5 * 255;
     if (tmp > 255) tmp = 255;
-    unsigned short int chi_2 = 255 - static_cast<unsigned char>(tmp);
-    Quality                  = (Length << 12) + (ista_l << 8) + chi_2;
-    Momentum                 = 1.0 / fabs(Qp);
+    // unsigned short int chi_2 = 255 - static_cast<unsigned char>( tmp );
+    // Quality = (Length<<12) + (ista_l<<8) + chi_2;
+    Momentum = 1.0 / fabs(Qp);
     //    chi2 = chi_2;
     chi2 = Chi2;
   }
@@ -148,18 +132,18 @@ struct L1Branch {
   //     Quality += - (Quality*(4096)) + (Length/(4096));
   //   }
 
-  static bool compareChi2Q(const L1Branch& a, const L1Branch& b) {
-    //      return (a.Quality > b.Quality);
-    //
-    if (a.Lengtha != b.Lengtha) return (a.Lengtha > b.Lengtha);
-
-    if (a.ista != b.ista) return (a.ista < b.ista);
-
-    return (a.chi2 < b.chi2);
-  }
-  static bool comparePChi2(const L1Branch* a, const L1Branch* b) {
-    return compareChi2(*a, *b);
-  }
+  //  static bool compareChi2Q(const L1Branch &a, const L1Branch &b){
+  ////      return (a.Quality > b.Quality);
+  ////
+  //     if (a.Lengtha != b.Lengtha) return (a.Lengtha > b.Lengtha);
+  //
+  //    if (a.ista != b.ista ) return (a.ista  < b.ista );
+  //
+  //    return (a.chi2 < b.chi2 );
+  //  }
+  //  static bool comparePChi2(const L1Branch *a, const L1Branch *b){
+  //    return compareChi2(*a,*b);
+  //  }
   static bool compareMomentum(const L1Branch& a, const L1Branch& b) {
     return (a.Momentum > b.Momentum);
   }
diff --git a/reco/L1/L1Algo/L1CATrackFinder.cxx b/reco/L1/L1Algo/L1CATrackFinder.cxx
index ed551ec05655e3a596291e1432d6fc5354862ae4..34f74f9ea80308c14516ee8378960f3fec36895d 100644
--- a/reco/L1/L1Algo/L1CATrackFinder.cxx
+++ b/reco/L1/L1Algo/L1CATrackFinder.cxx
@@ -108,11 +108,11 @@ inline void L1Algo::f10(  // input
     u_back_l[i1_V][i1_4]  = hitl.V();
 
     if (fUseHitErrors) {
-      d_x[i1_V][i1_4]  = hitl.dX();
-      d_y[i1_V][i1_4]  = hitl.dY();
-      d_xy[i1_V][i1_4] = hitl.dXY();
-      d_u[i1_V][i1_4]  = hitl.dU();
-      d_v[i1_V][i1_4]  = hitl.dV();
+      //      d_x[i1_V][i1_4]  = hitl.dX();
+      //      d_y[i1_V][i1_4]  = hitl.dY();
+      //      d_xy[i1_V][i1_4] = hitl.dXY();
+      d_u[i1_V][i1_4] = hitl.dU();
+      d_v[i1_V][i1_4] = hitl.dV();
     }
 
     zPos_l[i1_V][i1_4] = hitl.Z();
@@ -174,12 +174,11 @@ inline void L1Algo::f11(  /// input 1st stage of singlet search
     fvec& timeEr     = HitTimeEr[i1_V];
     const fvec& dzli = 1. / (zl - targZ);
 
+    fvec dx1, dy1, dxy1 = 0;
 
-    //    fvec& du1  = d_u[i1_V];
-    //    fvec& dv1  = d_v[i1_V];
-    fvec& dx1  = d_x[i1_V];
-    fvec& dy1  = d_y[i1_V];
-    fvec& dxy1 = d_xy[i1_V];
+    dUdV_to_dX(d_u[i1_V], d_v[i1_V], dx1, stal);
+    dUdV_to_dY(d_u[i1_V], d_v[i1_V], dy1, stal);
+    dUdV_to_dXdY(d_u[i1_V], d_v[i1_V], dxy1, stal);
 
     StripsToCoor(u, v, xl, yl, stal);
 
@@ -261,7 +260,7 @@ inline void L1Algo::f11(  /// input 1st stage of singlet search
 
     T.t = time;
 
-// #define BEGIN_FROM_TARGET
+    // #define BEGIN_FROM_TARGET
 #ifndef BEGIN_FROM_TARGET  // the best now
 
     T.x   = xl;
@@ -478,7 +477,8 @@ inline void L1Algo::f20(  // input
       (sqrt(Pick_m22 * (T1.C11 + stam.XYInfo.C11)) + MaxDZ * fabs(T1.ty))[i1_4]
         * iz,
       time,
-      sqrt(timeError));
+      sqrt(timeError) * 5);
+
 
     THitI imh = 0;
 
@@ -517,10 +517,17 @@ inline void L1Algo::f20(  // input
 
       fscal dy_est2 = Pick_m22[i1_4] * fabs(C11[i1_4] + stam.XYInfo.C11[i1_4]);
 
-      if (fUseHitErrors)
-        dy_est2 = Pick_m22[i1_4] * fabs(C11[i1_4] + hitm.dY() * hitm.dY());
+      if (fUseHitErrors) {
+        fvec dym = 0;
+        dUdV_to_dY(hitm.dU(), hitm.dV(), dym, stam);
+        dy_est2 = Pick_m22[i1_4] * fabs(C11[i1_4] + dym[0] * dym[0]);
+      }
+
+      fvec xm, ym = 0;
 
-      const fscal& dY = hitm.Y() - y[i1_4];
+      StripsToCoor(hitm.U(), hitm.V(), xm, ym, stam);
+
+      const fscal& dY = ym[i1_4] - y[i1_4];
 
       if (dY * dY > dy_est2 && dY < 0) continue;
 
@@ -530,10 +537,13 @@ inline void L1Algo::f20(  // input
 
       fscal dx_est2 = Pick_m22[i1_4] * fabs(C00[i1_4] + stam.XYInfo.C00[i1_4]);
 
-      if (fUseHitErrors)
-        dx_est2 = Pick_m22[i1_4] * fabs(C00[i1_4] + hitm.dX() * hitm.dX());
+      if (fUseHitErrors) {
+        fvec dxm = 0;
+        dUdV_to_dX(hitm.dU(), hitm.dV(), dxm, stam);
+        dx_est2 = Pick_m22[i1_4] * fabs(C00[i1_4] + dxm[0] * dxm[0]);
+      }
 
-      const fscal& dX = hitm.X() - x[i1_4];
+      const fscal& dX = xm[i1_4] - x[i1_4];
       if (dX * dX > dx_est2) continue;
 
       // check chi2
@@ -619,8 +629,8 @@ inline void L1Algo::f30(  // input
   nsL1::vector<fvec>::TSimd& u_front_3,
   nsL1::vector<fvec>::TSimd& u_back_3,
   nsL1::vector<fvec>::TSimd& z_Pos_3,
-  nsL1::vector<fvec>::TSimd& dx_,
-  nsL1::vector<fvec>::TSimd& dy_,
+  //  nsL1::vector<fvec>::TSimd& dx_,
+  //  nsL1::vector<fvec>::TSimd& dy_,
   nsL1::vector<fvec>::TSimd& dv_,
   nsL1::vector<fvec>::TSimd& du_,
   nsL1::vector<fvec>::TSimd& timeR,
@@ -636,8 +646,8 @@ inline void L1Algo::f30(  // input
   u_front_3.push_back(fvec_0);
   u_back_3.push_back(fvec_0);
   z_Pos_3.push_back(fvec_0);
-  dx_.push_back(fvec_0);
-  dy_.push_back(fvec_0);
+  //  dx_.push_back(fvec_0);
+  //  dy_.push_back(fvec_0);
   du_.push_back(fvec_0);
   dv_.push_back(fvec_0);
   timeR.push_back(fvec_0);
@@ -686,8 +696,6 @@ inline void L1Algo::f30(  // input
         timeM[n2_4]            = hitm.time;
         timeMEr[n2_4]          = hitm.timeEr;
         //  num[n2_4] = hitm.track;
-        dx2[n2_4] = hitm.dX();
-        dy2[n2_4] = hitm.dY();
         du2[n2_4] = hitm.dU();
         dv2[n2_4] = hitm.dV();
 
@@ -695,6 +703,9 @@ inline void L1Algo::f30(  // input
         hitsm_2_tmp[n2_4] = hitsm_2[i2];
       }  // n2_4
 
+      dUdV_to_dX(du2, dv2, dx2, stam);
+      dUdV_to_dY(du2, dv2, dy2, stam);
+
       fvec dz = zPos_2 - T2.z;
 
       L1ExtrapolateTime(T2, dz);
@@ -791,7 +802,7 @@ inline void L1Algo::f30(  // input
                             + MaxDZ * fabs(T2.ty))[i2_4]
                              * iz,
                            time,
-                           sqrt(timeError));
+                           sqrt(timeError) * 5);
 
         THitI irh = 0;
 
@@ -802,7 +813,11 @@ inline void L1Algo::f30(  // input
           if ((T2.n[i2_4] != hitr.n)) continue;
 #endif
           const fscal& zr = hitr.Z();
-          const fscal& yr = hitr.Y();
+          //  const fscal& yr = hitr.Y();
+
+          fvec xr, yr = 0;
+
+          StripsToCoor(hitr.U(), hitr.V(), xr, yr, star);
 
           fvec dz3 = zr - T2.z;
           L1ExtrapolateTime(T2, dz3);
@@ -827,11 +842,13 @@ inline void L1Algo::f30(  // input
                + star.XYInfo.C11
                    [i2_4])));  // TODO for FastPrim dx < dy - other sort is optimal. But not for doublets
 
-          if (fUseHitErrors)
-            dy_est2 =
-              (Pick_r22[i2_4] * (fabs(C11[i2_4] + hitr.dY() * hitr.dY())));
+          if (fUseHitErrors) {
+            fvec dyr = 0;
+            dUdV_to_dY(hitr.dU(), hitr.dV(), dyr, star);
+            dy_est2 = (Pick_r22[i2_4] * (fabs(C11[i2_4] + dyr[0] * dyr[0])));
+          }
 
-          const fscal& dY  = yr - y[i2_4];
+          const fscal& dY  = yr[i2_4] - y[i2_4];
           const fscal& dY2 = dY * dY;
           if (dY2 > dy_est2 && dY2 < 0)
             continue;  // if (yr < y_minus_new[i2_4]) continue;
@@ -846,11 +863,13 @@ inline void L1Algo::f30(  // input
           fscal dx_est2 =
             (Pick_r22[i2_4] * (fabs(C00[i2_4] + star.XYInfo.C00[i2_4])));
 
-          if (fUseHitErrors)
-            dx_est2 =
-              (Pick_r22[i2_4] * (fabs(C00[i2_4] + hitr.dX() * hitr.dX())));
+          if (fUseHitErrors) {
+            fvec dxr = 0;
+            dUdV_to_dX(hitr.dU(), hitr.dV(), dxr, star);
+            dx_est2 = (Pick_r22[i2_4] * (fabs(C00[i2_4] + dxr[0] * dxr[0])));
+          }
 
-          const fscal& dX = hitr.X() - x[i2_4];
+          const fscal& dX = xr[i2_4] - x[i2_4];
           if (dX * dX > dx_est2) continue;
           // check chi2  // not effective
           fvec C10;
@@ -895,13 +914,13 @@ inline void L1Algo::f30(  // input
           T3.SetOneEntry(n3_4, T2, i2_4);
           u_front_3[n3_V][n3_4] = hitr.U();
           u_back_3[n3_V][n3_4]  = hitr.V();
-          dx_[n3_V][n3_4]       = hitr.dX();
-          dy_[n3_V][n3_4]       = hitr.dY();
-          du_[n3_V][n3_4]       = hitr.dU();
-          dv_[n3_V][n3_4]       = hitr.dV();
-          z_Pos_3[n3_V][n3_4]   = zr;
-          timeR[n3_V][n3_4]     = hitr.time;
-          timeER[n3_V][n3_4]    = hitr.timeEr;
+          //dx_[n3_V][n3_4]       = hitr.dX();
+          // dy_[n3_V][n3_4]       = hitr.dY();
+          du_[n3_V][n3_4]     = hitr.dU();
+          dv_[n3_V][n3_4]     = hitr.dV();
+          z_Pos_3[n3_V][n3_4] = zr;
+          timeR[n3_V][n3_4]   = hitr.time;
+          timeER[n3_V][n3_4]  = hitr.timeEr;
 
           n3++;
           n3_V = n3 / fvecLen;
@@ -912,8 +931,8 @@ inline void L1Algo::f30(  // input
             u_front_3.push_back(fvec_0);
             u_back_3.push_back(fvec_0);
             z_Pos_3.push_back(fvec_0);
-            dx_.push_back(fvec_0);
-            dy_.push_back(fvec_0);
+            //            dx_.push_back(fvec_0);
+            //            dy_.push_back(fvec_0);
             du_.push_back(fvec_0);
             dv_.push_back(fvec_0);
             timeR.push_back(fvec_0);
@@ -934,8 +953,8 @@ inline void L1Algo::f31(  // input
   nsL1::vector<fvec>::TSimd& u_front_,
   nsL1::vector<fvec>::TSimd& u_back_,
   nsL1::vector<fvec>::TSimd& z_Pos,
-  nsL1::vector<fvec>::TSimd& dx_,
-  nsL1::vector<fvec>::TSimd& dy_,
+  //  nsL1::vector<fvec>::TSimd& dx_,
+  //  nsL1::vector<fvec>::TSimd& dy_,
   nsL1::vector<fvec>::TSimd& dv_,
   nsL1::vector<fvec>::TSimd& du_,
   nsL1::vector<fvec>::TSimd& timeR,
@@ -1199,9 +1218,9 @@ inline void L1Algo::f4(  // input
     TripletsLocal1[Station][Thread][nTripletsThread[istal][Thread]].SetLevel(0);
 
     TripletsLocal1[Station][Thread][nTripletsThread[istal][Thread]]
-      .first_neighbour = 0;
+      .SetFNeighbour(0);
     TripletsLocal1[Station][Thread][nTripletsThread[istal][Thread]]
-      .last_neighbour = 0;
+      .SetNNeighbours(0);
 
     Triplet = nTripletsThread[istal][Thread];
 
@@ -1251,7 +1270,7 @@ inline void L1Algo::f4(  // input
     L1_ASSERT(ihitr < StsHitsUnusedStopIndex[istar],
               ihitr << " < " << StsHitsUnusedStopIndex[istar]);
 
-    fscal& time = T3.time[i3_4];
+    fscal& time = T3.t[i3_4];
     // int n = T3.n[i3_4];
 
 
@@ -1303,9 +1322,9 @@ inline void L1Algo::f4(  // input
 
       if ((curNeighbour.GetMHit() != ihitr)) continue;
 
-      if (tr1.first_neighbour == 0) tr1.first_neighbour = Location;
+      if (tr1.GetFNeighbour() == 0) tr1.SetFNeighbour(Location);
 
-      tr1.last_neighbour = Location + 1;
+      tr1.SetNNeighbours(Location - tr1.GetFNeighbour() + 1);
 
       const unsigned char& jlevel = curNeighbour.GetLevel();
 
@@ -1608,10 +1627,10 @@ L1Algo::TripletsStaPort(  /// creates triplets: input: @istal - start station nu
     nsL1::vector<fvec>::TSimd& z_pos3    = fz_pos3[Thread];
     nsL1::vector<fvec>::TSimd& timeR     = fTimeR[Thread];
     nsL1::vector<fvec>::TSimd& timeER    = fTimeER[Thread];
-    nsL1::vector<fvec>::TSimd& dx3       = dx[Thread];
-    nsL1::vector<fvec>::TSimd& dy3       = dy[Thread];
-    nsL1::vector<fvec>::TSimd& du3       = du[Thread];
-    nsL1::vector<fvec>::TSimd& dv3       = dv[Thread];
+    //    nsL1::vector<fvec>::TSimd& dx3       = dx[Thread];
+    //    nsL1::vector<fvec>::TSimd& dy3       = dy[Thread];
+    nsL1::vector<fvec>::TSimd& du3 = du[Thread];
+    nsL1::vector<fvec>::TSimd& dv3 = dv[Thread];
 
     T_3.clear();
     hitsl_3.clear();
@@ -1620,8 +1639,8 @@ L1Algo::TripletsStaPort(  /// creates triplets: input: @istal - start station nu
     u_front3.clear();
     u_back3.clear();
     z_pos3.clear();
-    dx3.clear();
-    dy3.clear();
+    //    dx3.clear();
+    //    dy3.clear();
     du3.clear();
     dv3.clear();
     timeR.clear();
@@ -1655,8 +1674,8 @@ L1Algo::TripletsStaPort(  /// creates triplets: input: @istal - start station nu
       u_front3,
       u_back3,
       z_pos3,
-      dx3,
-      dy3,
+      //      dx3,
+      //      dy3,
       du3,
       dv3,
       timeR,
@@ -1684,8 +1703,8 @@ L1Algo::TripletsStaPort(  /// creates triplets: input: @istal - start station nu
       u_front3,
       u_back3,
       z_pos3,
-      dx3,
-      dy3,
+      //      dx3,
+      //      dy3,
       du3,
       dv3,
       timeR,
@@ -1891,10 +1910,15 @@ void L1Algo::CATrackFinder() {
 
 #endif
 
+  float yStep = 1.5 / sqrt(nDontUsedHits);  // empirics. 0.01*sqrt(2374) ~= 0.5
+
 
-  float yStep = 0.5 / sqrt(nDontUsedHits);  // empirics. 0.01*sqrt(2374) ~= 0.5
+  //  float yStep = 0.5 / sqrt(nDontUsedHits);  // empirics. 0.01*sqrt(2374) ~= 0.5
   if (yStep > 0.3) yStep = 0.3;
   float xStep = yStep * 3;
+  // float xStep = yStep * 3;
+
+  //  yStep = 0.0078;
   //  const float hitDensity = sqrt( nDontUsedHits );
 
   //     float yStep = 0.7*4/hitDensity; // empirics. 0.01*sqrt(2374) ~= 0.5
@@ -1907,7 +1931,7 @@ void L1Algo::CATrackFinder() {
 
   for (int iS = 0; iS < NStations; ++iS) {
     vGridTime[iS].BuildBins(
-      -1, 1, -0.6, 0.6, 0, lasttime, xStep, yStep, (lasttime + 1));
+      -1, 1, -0.6, 0.6, 0, lasttime, xStep, yStep, (lasttime + 1) / 35);
     vGridTime[iS].StoreHits(
       StsHitsUnusedStopIndex[iS] - StsHitsUnusedStartIndex[iS],
       &((*vStsHits)[StsHitsUnusedStartIndex[iS]]),
@@ -2127,35 +2151,34 @@ void L1Algo::CATrackFinder() {
     }
 
     /*    {
-      /// possible left hits of triplets are splited in portions of 16 (4 SIMDs) to use memory faster
-      portionStopIndex[NStations-1] = 0;
-      unsigned int ip = 0;  //index of curent portion
-
-      for (int istal = NStations-2; istal >= FIRSTCASTATION; istal--)  //start downstream chambers
-      {
-        int nHits = StsHitsUnusedStopIndex[istal] - StsHitsUnusedStartIndex[istal];
-
-        int NHits_P = nHits/Portion;
-
-        for( int ipp = 0; ipp < NHits_P; ipp++ )
-        {
-          n_g1[ip] = Portion;
-          ip++;
-        } // start_lh - portion of left hits
-
-        n_g1[ip] = nHits - NHits_P*Portion;
-
-        ip++;
-        portionStopIndex[istal] = ip;
-      }// lstations
-//       nPortions = ip;
-    } */
+         /// possible left hits of triplets are splited in portions of 16 (4 SIMDs) to use memory faster
+         portionStopIndex[NStations-1] = 0;
+         unsigned int ip = 0;  //index of curent portion
+         
+         for (int istal = NStations-2; istal >= FIRSTCASTATION; istal--)  //start downstream chambers
+         {
+         int nHits = StsHitsUnusedStopIndex[istal] - StsHitsUnusedStartIndex[istal];
+         
+         int NHits_P = nHits/Portion;
+         
+         for( int ipp = 0; ipp < NHits_P; ipp++ )
+         {
+         n_g1[ip] = Portion;
+         ip++;
+         } // start_lh - portion of left hits
+         
+         n_g1[ip] = nHits - NHits_P*Portion;
+         
+         ip++;
+         portionStopIndex[istal] = ip;
+         }// lstations
+         //       nPortions = ip;
+         } */
 
     ///   stage for triplets creation
 
 #ifdef XXX
     TStopwatch c_timer;
-    TStopwatch c_time;
     c_timer.Start();
 #endif
 
@@ -2403,8 +2426,13 @@ void L1Algo::CATrackFinder() {
 #endif
             L1Triplet& first_trip = (TripletsLocal1[istaF][ip][itrip]);
 
+            if (GetFUsed(
+                  (*vSFlag)[(*vStsHitsUnused)[first_trip.GetLHit()].f]
+                  | (*vSFlagB)[(*vStsHitsUnused)[first_trip.GetLHit()].b]))
+              continue;
+
 
-            // ghost supression !!!
+              // ghost supression !!!
 #ifndef FIND_GAPED_TRACKS
             if (/*(isec == kFastPrimIter) ||*/ (isec == kAllPrimIter)
                 || (isec == kAllPrimEIter) || (isec == kAllSecIter)
@@ -2436,15 +2464,11 @@ void L1Algo::CATrackFinder() {
                 continue;  // try only triplets, which can start track with ilev+3 length. w\o it have more ghosts, but efficiency either
             }
 
-            if (GetFUsed(
-                  (*vSFlag)[(*vStsHitsUnused)[first_trip.GetLHit()].f]
-                  | (*vSFlagB)[(*vStsHitsUnused)[first_trip.GetLHit()].b]))
-              continue;
 
-            curr_tr.Momentum = 0.f;
-            curr_tr.chi2     = 0.f;
-            curr_tr.Lengtha  = 0;
-            curr_tr.ista     = 0;
+            //  curr_tr.Momentum = 0.f;
+            curr_tr.chi2 = 0.f;
+            //   curr_tr.Lengtha  = 0;
+            curr_tr.ista = 0;
 
             (curr_tr).StsHits[0] = ((*RealIHitP)[first_trip.GetLHit()]);
 
@@ -2458,8 +2482,6 @@ void L1Algo::CATrackFinder() {
             best_chi2 = curr_chi2;
             best_L    = curr_L;
 
-            //     cout<<istaF<<" istaF"<<endl;
-
             CAFindTrack(
               istaF,
               best_tr,
@@ -2640,17 +2662,19 @@ void L1Algo::CATrackFinder() {
                 L1HitPoint tempPoint = CreateHitPoint(
                   hit, 0);  //TODO take number of station from hit
 
-                float xcoor = tempPoint.X();
-                float ycoor = tempPoint.Y();
+                float xcoor, ycoor = 0;
+                L1Station stah = vStations[0];
+                StripsToCoor(tempPoint.U(), tempPoint.V(), xcoor, ycoor, stah);
                 float zcoor = tempPoint.Z();
+
                 float timeFlight =
                   sqrt(xcoor * xcoor + ycoor * ycoor + zcoor * zcoor)
                   / 30.f;  // c = 30[cm/ns]
                 sumTime += (hit.t_reco - timeFlight);
               }
 
-              t.NHits      = tr.NHits;
-              t.Momentum   = tr.Momentum;
+              t.NHits = tr.NHits;
+              // t.Momentum   = tr.Momentum;
               t.fTrackTime = sumTime / t.NHits;
 
               vTracks_local[num_thread][SavedCand[num_thread]] = (t);
@@ -2749,7 +2773,7 @@ void L1Algo::CATrackFinder() {
       //       fL1Pulls->Build(1);
       // #endif
 #ifdef COUNTERS
-      stat_nHits[isec] += vStsHitsUnused->Size();
+      //  stat_nHits[isec] += (vStsHitsUnused*)->Size();
 
       cout << "iter = " << isec << endl;
       cout << " NSinglets = " << stat_nSinglets[isec] / stat_N << endl;
@@ -2804,40 +2828,39 @@ void L1Algo::CATrackFinder() {
 
 
 #if 0
-  static long int NTimes =0, NHits=0, HitSize =0, NStrips=0, StripSize =0, NStripsB=0, StripSizeB =0,
-  NDup=0, DupSize=0, NTrip=0, TripSize=0, NBranches=0, BranchSize=0, NTracks=0, TrackSize=0 ;
-  
-  NTimes++;
-  NHits += vStsHitsUnused->size();
-  HitSize += vStsHitsUnused->size()*sizeof(L1StsHit);
-  NStrips+= vStsStrips.size();
-  StripSize += vStsStrips.size()*sizeof(fscal) + (*vSFlag).size()*sizeof(unsigned char);
-  NStripsB+= (*vSFlagB).size();
-  StripSizeB += vStsStripsB.size()*sizeof(fscal) + (*vSFlagB).size()*sizeof(unsigned char);
-  NDup += stat_max_n_dup;
-  DupSize += stat_max_n_dup*sizeof(/*short*/ int);
-  NTrip += stat_max_n_trip;
-  TripSize += stat_max_trip_size;
-  
-  NBranches += stat_max_n_branches;
-  BranchSize += stat_max_BranchSize;
-  NTracks += vTracks.size();
-  TrackSize += sizeof(L1Track)*vTracks.size() + sizeof(THitI)*vRecoHits.size();
-  int k = 1024*NTimes;
-  
-  cout<<"L1 Event size: \n"
-  <<HitSize/k<<"kB for "<<NHits/NTimes<<" hits, \n"
-  <<StripSize/k<<"kB for "<<NStrips/NTimes<<" strips, \n"
-  <<StripSizeB/k<<"kB for "<<NStripsB/NTimes<<" stripsB, \n"
-  <<DupSize/k<<"kB for "<<NDup/NTimes<<" doublets, \n"
-  <<TripSize/k<<"kB for "<<NTrip/NTimes<<" triplets\n"
-  <<BranchSize/k<<"kB for "<<NBranches/NTimes<<" branches, \n"
-  <<TrackSize/k<<"kB for "<<NTracks/NTimes<<" tracks. "<<endl;
-  cout<<" L1 total event size = "
-  <<( HitSize + StripSize +  StripSizeB + DupSize + TripSize + BranchSize + TrackSize )/k
-  <<" Kb"<<endl;
+        static long int NTimes =0, NHits=0, HitSize =0, NStrips=0, StripSize =0, NStripsB=0, StripSizeB =0,
+        NDup=0, DupSize=0, NTrip=0, TripSize=0, NBranches=0, BranchSize=0, NTracks=0, TrackSize=0 ;
+        
+        NTimes++;
+        NHits += vStsHitsUnused->size();
+        HitSize += vStsHitsUnused->size()*sizeof(L1StsHit);
+        NStrips+= vStsStrips.size();
+        StripSize += vStsStrips.size()*sizeof(fscal) + (*vSFlag).size()*sizeof(unsigned char);
+        NStripsB+= (*vSFlagB).size();
+        StripSizeB += vStsStripsB.size()*sizeof(fscal) + (*vSFlagB).size()*sizeof(unsigned char);
+        NDup += stat_max_n_dup;
+        DupSize += stat_max_n_dup*sizeof(/*short*/ int);
+        NTrip += stat_max_n_trip;
+        TripSize += stat_max_trip_size;
+        
+        NBranches += stat_max_n_branches;
+        BranchSize += stat_max_BranchSize;
+        NTracks += vTracks.size();
+        TrackSize += sizeof(L1Track)*vTracks.size() + sizeof(THitI)*vRecoHits.size();
+        int k = 1024*NTimes;
+        
+        cout<<"L1 Event size: \n"
+        <<HitSize/k<<"kB for "<<NHits/NTimes<<" hits, \n"
+        <<StripSize/k<<"kB for "<<NStrips/NTimes<<" strips, \n"
+        <<StripSizeB/k<<"kB for "<<NStripsB/NTimes<<" stripsB, \n"
+        <<DupSize/k<<"kB for "<<NDup/NTimes<<" doublets, \n"
+        <<TripSize/k<<"kB for "<<NTrip/NTimes<<" triplets\n"
+        <<BranchSize/k<<"kB for "<<NBranches/NTimes<<" branches, \n"
+        <<TrackSize/k<<"kB for "<<NTracks/NTimes<<" tracks. "<<endl;
+        cout<<" L1 total event size = "
+        <<( HitSize + StripSize +  StripSizeB + DupSize + TripSize + BranchSize + TrackSize )/k
+        <<" Kb"<<endl;
 #endif  // 0
-  //cout << "===> ... CA Track Finder    " << endl << endl;
 #endif
 
 #ifdef DRAW
@@ -2868,13 +2891,13 @@ void L1Algo::CATrackFinder() {
 
 
 /** *************************************************************
-  *                                                              *
-  *     The routine performs recursive search for tracks         *
-  *                                                              *
-  *     I. Kisel                                    06.03.05     *
-  *     I.Kulakov                                    2012        *
-  *                                                              *
-  ****************************************************************/
+     *                                                              *
+     *     The routine performs recursive search for tracks         *
+     *                                                              *
+     *     I. Kisel                                    06.03.05     *
+     *     I.Kulakov                                    2012        *
+     *                                                              *
+     ****************************************************************/
 
 inline void L1Algo::CAFindTrack(int ista,
                                 L1Branch& best_tr,
@@ -2955,11 +2978,11 @@ inline void L1Algo::CAFindTrack(int ista,
     unsigned int Thread   = 0;
     unsigned int Triplet  = 0;
     unsigned int Location = 0;
-    int N_neighbour = (curr_trip->last_neighbour - curr_trip->first_neighbour);
+    int N_neighbour       = (curr_trip->GetNNeighbours());
 
 
     for (Tindex in = 0; in < N_neighbour; in++) {
-      Location = curr_trip->first_neighbour + in;
+      Location = curr_trip->GetFNeighbour() + in;
 
       //    Location = curr_trip->neighbours[in];
       //    const fscal &qp2 = curr_trip->GetQp();
@@ -2973,12 +2996,19 @@ inline void L1Algo::CAFindTrack(int ista,
 
       const L1Triplet& new_trip = TripletsLocal1[Station][Thread][Triplet];
 
+      if ((new_trip.GetMHit() != curr_trip->GetRHit())) continue;
+      if ((new_trip.GetLHit() != curr_trip->GetMHit())) continue;
+
       const fscal& qp1 = curr_trip->GetQp();
       const fscal& qp2 = new_trip.GetQp();
       fscal dqp        = fabs(qp1 - qp2);
       fscal Cqp        = curr_trip->Cqp;
       Cqp += new_trip.Cqp;
 
+      if (!fmCBMmode)
+        if (dqp > PickNeighbour * Cqp)
+          continue;  // bad neighbour // CHECKME why do we need recheck it?? (it really change result)
+
       const fscal& tx1 = curr_trip->tx;
       const fscal& tx2 = new_trip.tx;
       fscal dtx        = fabs(tx1 - tx2);
@@ -2996,12 +3026,6 @@ inline void L1Algo::CAFindTrack(int ista,
         if (dtx > PickNeighbour * Ctx) continue;
       }
 
-      if ((new_trip.GetMHit() != curr_trip->GetRHit())) continue;
-      if ((new_trip.GetLHit() != curr_trip->GetMHit())) continue;
-
-      if (!fmCBMmode)
-        if (dqp > PickNeighbour * Cqp)
-          continue;  // bad neighbour // CHECKME why do we need recheck it?? (it really change result)
 
       if (GetFUsed((*vSFlag)[(*vStsHitsUnused)[new_trip.GetLHit()].f]
                    | (*vSFlagB)[(*vStsHitsUnused)[new_trip.GetLHit()]
diff --git a/reco/L1/L1Algo/L1HitArea.h b/reco/L1/L1Algo/L1HitArea.h
index c5cd48c44612db349014df9cf450254e18c3d8ef..53802871834b1e5e2a8a46a9ed20dcf601cc5883 100644
--- a/reco/L1/L1Algo/L1HitArea.h
+++ b/reco/L1/L1Algo/L1HitArea.h
@@ -180,7 +180,7 @@ inline L1HitAreaTime::L1HitAreaTime(const L1Grid& grid,
 
   fIndYmin = (bTmin * fNy * fNz + bZmin * fNy + bYmin);
 
-  fGrid.GetBinBounds(fIndYmin, y, dy, z, dz, t, dt);
+  //fGrid.GetBinBounds(fIndYmin, y, dy, z, dz, t, dt);
 
   fIz = bZmin;
 
@@ -249,4 +249,4 @@ inline bool L1HitAreaTime::GetNext(THitI& i) {
   return !yIndexOutOfRange;
 }
 
-#endif
\ No newline at end of file
+#endif
diff --git a/reco/L1/L1Algo/L1HitPoint.h b/reco/L1/L1Algo/L1HitPoint.h
index 3cdb69516d6184806ff3b60bb4e4b3418a84d32f..6f58da2c028090b3fcdb6406f66473e516319edf 100644
--- a/reco/L1/L1Algo/L1HitPoint.h
+++ b/reco/L1/L1Algo/L1HitPoint.h
@@ -5,37 +5,36 @@
 #if 1
 struct L1HitPoint {
   L1HitPoint()
-    : x(0.f)
-    , y(0.f)
-    , dx(0.f)
-    , dy(0.f)
-    , dxy(0.f)
-    , u(0.f)
+    :  //    x(0.f)
+       //    , y(0.f)
+       //    , dx(0.f)
+       //    , dy(0.f)
+       //    , dxy(0.f)
+    u(0.f)
     , v(0.f)
     , du(0.f)
     , dv(0.f)
     , z(0.f)
     , time(0.f)
     , timeEr(2.9f) {};
-  L1HitPoint(fscal x_,
-             fscal y_,
-             fscal dx_,
-             fscal dy_,
-             fscal dxy_,
-             fscal du_,
-             fscal dv_,
-             fscal z_,
-             fscal v_,
-             fscal u_,
-             float time_,
-             float /*timeEv1_*/ = 0,
-             float timeEr_      = 2.9f)
-    : x(x_)
-    , y(y_)
-    , dx(dx_)
-    , dy(dy_)
-    , dxy(dxy_)
-    , u(u_)
+  L1HitPoint(
+    //             fscal dx_,
+    //             fscal dy_,
+    //             fscal dxy_,
+    fscal du_,
+    fscal dv_,
+    fscal z_,
+    fscal v_,
+    fscal u_,
+    float time_,
+    float /*timeEv1_*/ = 0,
+    float timeEr_      = 2.9f)
+    :  //    : x(x_)
+       //    , y(y_)
+       //    , dx(dx_)
+       //    , dy(dy_)
+       //    , dxy(dxy_)
+    u(u_)
     , v(v_)
     , du(du_)
     , dv(dv_)
@@ -46,14 +45,14 @@ struct L1HitPoint {
   //  L1HitPoint(fscal x_, fscal y_, fscal z_, fscal v_, fscal u_, fscal time_, unsigned short int n_ = 0):
   //  x(x_), y(y_), z(z_), u(u_), v(v_), time(time_){};
 
-  fscal Xs() const { return X() / Z(); }
-  fscal Ys() const { return Y() / Z(); }  // value to sort hits by
+  //  fscal Xs() const { return X() / Z(); }
+  //  fscal Ys() const { return Y() / Z(); }  // value to sort hits by
 
-  fscal X() const { return x; }
-  fscal Y() const { return y; }
-  fscal dX() const { return dx; }
-  fscal dY() const { return dy; }
-  fscal dXY() const { return dxy; }
+  //  fscal X() const { return x; }
+  //  fscal Y() const { return y; }
+  //  fscal dX() const { return dx; }
+  //  fscal dY() const { return dy; }
+  //  fscal dXY() const { return dxy; }
   fscal dU() const { return du; }
   fscal dV() const { return dv; }
   fscal Z() const { return z; }
@@ -61,30 +60,29 @@ struct L1HitPoint {
   fscal V() const { return v; }
   // unsigned short int N() const { return n; }
   // int GetSortIndex() const { return SortIndex; }
-  void SetX(fscal X1) { x = X1; }
-  void SetY(fscal Y1) { y = Y1; }
+  //  void SetX(fscal X1) { x = X1; }
+  //  void SetY(fscal Y1) { y = Y1; }
   void SetZ(fscal Z1) { z = Z1; }
   void SetU(fscal U1) { u = U1; }
   void SetV(fscal V1) { v = V1; }
 
-  void Set(fscal& x1,
-           const float& y1,
-           const float& dx1,
-           const float& dy1,
-           const float& xy1,
-           const float& z1,
-           const fscal& u1,
-           const fscal& v1,
-           const fscal& du1,
-           const fscal& dv1,
-           const float& time1,
-           float timeEr1) {
-    x      = x1;
-    y      = y1;
-    dx     = dx1;
-    dy     = dy1;
-    du     = du1;
-    dxy    = xy1;
+  void Set(
+    //           const float& dx1,
+    //           const float& dy1,
+    //           const float& xy1,
+    const float& z1,
+    const fscal& u1,
+    const fscal& v1,
+    const fscal& du1,
+    const fscal& dv1,
+    const float& time1,
+    float timeEr1) {
+    //    x      = x1;
+    //    y      = y1;
+    //    dx     = dx1;
+    //    dy     = dy1;
+    du = du1;
+    //    dxy    = xy1;
     dv     = dv1;
     z      = z1;
     u      = u1;
@@ -94,7 +92,8 @@ struct L1HitPoint {
   }
 
 private:
-  float x, y, dx, dy, dxy, u, v, du, dv;
+  //    x, y,
+  float u, v, du, dv;
   float z;  // TODO: may be we should use iz
   // x\u, v - front and back strips; x, y, z - coordinates of hits
 
@@ -149,8 +148,6 @@ private:
   unsigned short int z;  // TODO: may be we should use iz
   unsigned short int u,
     v;  // x\u, v - front and back strips; x, y, z - coordinates of hits
-
-  unsigned short int n;  // number of event
 };
 
 #endif
diff --git a/reco/L1/L1Algo/L1HitsSortHelper.cxx b/reco/L1/L1Algo/L1HitsSortHelper.cxx
index 3472355de341ef8480ef712748f9869fa7540e61..7229e945b5428d6827c72e2aa1f1edc2e0fc8e6a 100644
--- a/reco/L1/L1Algo/L1HitsSortHelper.cxx
+++ b/reco/L1/L1Algo/L1HitsSortHelper.cxx
@@ -29,14 +29,16 @@ L1HitsSortHelper::L1HitsSortHelper(vector<L1StsHit>& hits,
   L1_ASSERT(hits.size() == points.size(), hits.size() << " " << points.size());
   const int NHits = fnDontUsedHits;
   fD.resize(NHits);
+  //float x,y=0;
   for (int iS = 0; iS < fNStations; ++iS)
     for (THitI i = fStsHitsUnusedStartIndex[iS];
          i < fStsHitsUnusedStopIndex[iS];
          i++) {
-      fD[i].h   = &(hits[i]);
-      fD[i].p   = &(points[i]);
-      fD[i].i   = indices[i];
-      fD[i].bin = fGrid[iS].GetBinBounded(fD[i].p->Xs(), fD[i].p->Ys());
+      fD[i].h = &(hits[i]);
+      fD[i].p = &(points[i]);
+      fD[i].i = indices[i];
+      //      StripsToCoor(fD[i].p->U(),fD[i].p->V(), x, y, vStations[iS]);
+      //      fD[i].bin = fGrid[iS].GetBinBounded(x[0], y[0]);
     }
 }
 
diff --git a/reco/L1/L1Algo/L1HitsSortHelper.h b/reco/L1/L1Algo/L1HitsSortHelper.h
index bc5c2af85c4d2c3d598ae2845abb4644d960e9da..d53c0d198e1188ef01d87e17586c1c9184d4ad79 100644
--- a/reco/L1/L1Algo/L1HitsSortHelper.h
+++ b/reco/L1/L1Algo/L1HitsSortHelper.h
@@ -17,7 +17,7 @@ struct L1HitsSortHelperData {
 
   static bool compare(const L1HitsSortHelperData& a,
                       const L1HitsSortHelperData& b) {
-    return a.bin < b.bin || (a.bin == b.bin && a.p->Ys() < b.p->Ys());
+    return a.bin < b.bin || (a.bin == b.bin && a.p->V() < b.p->V());
   }
 };
 
diff --git a/reco/L1/L1Algo/L1Strip.h b/reco/L1/L1Algo/L1Strip.h
index f6a57ac1a3b8e21e280c10dd387c4c8a43d6b8d3..0ae97574f04d3e9666b4b41322b12ec2a9cdb6b0 100644
--- a/reco/L1/L1Algo/L1Strip.h
+++ b/reco/L1/L1Algo/L1Strip.h
@@ -25,36 +25,6 @@ struct L1Strip {
   // unsigned short int n; // number of event
 };
 
-struct L1StripSelectTracks {
-
-  L1StripSelectTracks()
-    : Cand(-1)
-#ifdef _OPENMP
-    , Occupied()
-#endif
-  {
-#ifdef _OPENMP
-    omp_init_lock(&Occupied);
-#endif
-    //  Candidates.resize(70);
-    // Candidates2.resize(70);
-    //  Cand = -1;
-  }
-
-  ~L1StripSelectTracks() {
-#ifdef _OPENMP
-    omp_destroy_lock(&Occupied);
-#endif
-  }
-
-  //  L1Vector <L1Branch*> Candidates;
-  //  L1Vector <int> Candidates2;
-  int Cand;
-#ifdef _OPENMP
-  omp_lock_t Occupied;
-#endif
-};
-
 typedef unsigned /*short*/ int TStripI;  // strip index type
 
 #endif
diff --git a/reco/L1/L1Algo/L1StsHit.h b/reco/L1/L1Algo/L1StsHit.h
index db32f1908153bd023c773c8c21d123817dadf548..54b6061b7ab2c28a5c0e854de118724af0717c78 100644
--- a/reco/L1/L1Algo/L1StsHit.h
+++ b/reco/L1/L1Algo/L1StsHit.h
@@ -11,49 +11,22 @@ typedef unsigned short int TZPosI;     // strip z-coor index type
 
 class L1StsHit {
 public:
+  //  float dx, dy, dxy;
   TStripI f, b;  // front and back strip indices
-  TZPosI iz;     // index of z coor. in L1Algo::vStsZPos
-
-  float dx, dy, dxy;
   float du, dv;
-  bool used;
   float t_reco;
   float t_er;
-  int ista;
-  //   int track, n;
-  float x, y;
-
-
-  L1StsHit()
-    : f(0)
-    , b(0)
-    , iz(0)
-    , dx(0.)
-    , dy(0.)
-    , dxy(0.)
-    , du(0.)
-    , dv(0.)
-    , used(false)
-    , t_reco(0.f)
-    , t_er(0.)
-    , ista(-1)
-    , x(0.)
-    , y(0.) {}
+  // int ista;
+  //int track, n;
+  // float x, y;
+
+
+  TZPosI iz;  // index of z coor. in L1Algo::vStsZPos
+
+
+  L1StsHit() : f(0), b(0), du(0.), dv(0.), t_reco(0.f), t_er(0.), iz(0) {}
   L1StsHit(L1StsHit& h, /*short*/ int sh, /*short*/ int shB)
-    : f(h.f + sh)
-    , b(h.b + shB)
-    , iz(0)
-    , dx(0.)
-    , dy(0.)
-    , dxy(0.)
-    , du(0.)
-    , dv(0.)
-    , used(false)
-    , t_reco(0.f)
-    , t_er(0.)
-    , ista(-1)
-    , x(0.)
-    , y(0.) {}
+    : f(h.f + sh), b(h.b + shB), du(0.), dv(0.), t_reco(0.f), t_er(0.), iz(0) {}
 };
 
 #endif
diff --git a/reco/L1/L1Algo/L1TrackFitter.cxx b/reco/L1/L1Algo/L1TrackFitter.cxx
index d80a76db92482e1771b2a3bbe3fbfc9925d9d0e0..1799c598569c53b5c704384d0ff5670df5f2deae 100644
--- a/reco/L1/L1Algo/L1TrackFitter.cxx
+++ b/reco/L1/L1Algo/L1TrackFitter.cxx
@@ -400,13 +400,10 @@ void L1Algo::L1KFTrackFitter() {
         w[ista][iVec]       = 1.;
         if (ista > NMvdStations) w_time[ista][iVec] = 1.;
 
-        u[ista][iVec]    = (*vStsStrips)[hit.f];
-        v[ista][iVec]    = (*vStsStripsB)[hit.b];
-        d_x[ista][iVec]  = hit.dx;
-        d_y[ista][iVec]  = hit.dy;
-        d_u[ista][iVec]  = hit.du;
-        d_v[ista][iVec]  = hit.dv;
-        d_xy[ista][iVec] = hit.dxy;
+        u[ista][iVec]   = (*vStsStrips)[hit.f];
+        v[ista][iVec]   = (*vStsStripsB)[hit.b];
+        d_u[ista][iVec] = hit.du;
+        d_v[ista][iVec] = hit.dv;
         StripsToCoor(u[ista], v[ista], x_temp, y_temp, sta[ista]);
         x[ista][iVec]      = x_temp[iVec];
         y[ista][iVec]      = y_temp[iVec];
@@ -414,6 +411,9 @@ void L1Algo::L1KFTrackFitter() {
         timeEr[ista][iVec] = hit.t_er;
         z[ista][iVec]      = (*vStsZPos)[hit.iz];
         sta[ista].fieldSlice.GetFieldValue(x[ista], y[ista], fB_temp);
+        dUdV_to_dX(d_u[ista], d_v[ista], d_x[ista], sta[ista]);
+        dUdV_to_dY(d_u[ista], d_v[ista], d_y[ista], sta[ista]);
+        dUdV_to_dXdY(d_u[ista], d_v[ista], d_xy[ista], sta[ista]);
         fB[ista].x[iVec] = fB_temp.x[iVec];
         fB[ista].y[iVec] = fB_temp.y[iVec];
         fB[ista].z[iVec] = fB_temp.z[iVec];
@@ -857,11 +857,11 @@ void L1Algo::L1KFTrackFitterMuch() {
         y[ista][iVec]      = y_temp[iVec];
         time[ista][iVec]   = hit.t_reco;
         timeEr[ista][iVec] = hit.t_er;
-        d_x[ista][iVec]    = hit.dx;
-        d_y[ista][iVec]    = hit.dy;
         d_u[ista][iVec]    = hit.du;
         d_v[ista][iVec]    = hit.dv;
-        d_xy[ista][iVec]   = hit.dxy;
+        dUdV_to_dX(d_u[ista], d_v[ista], d_x[ista], sta[ista]);
+        dUdV_to_dY(d_u[ista], d_v[ista], d_y[ista], sta[ista]);
+        dUdV_to_dXdY(d_u[ista], d_v[ista], d_xy[ista], sta[ista]);
         //  mom[ista][iVec] = hit.p;
         z[ista][iVec] = (*vStsZPos)[hit.iz];
         sta[ista].fieldSlice.GetFieldValue(x[ista], y[ista], fB_temp);
diff --git a/reco/L1/L1Algo/L1TrackPar.h b/reco/L1/L1Algo/L1TrackPar.h
index d32a643483698d5d6b3e750f4919f4014f69fcdf..6ce2baebdb5247c821f3e4b5c872ec6893a9b5a7 100644
--- a/reco/L1/L1Algo/L1TrackPar.h
+++ b/reco/L1/L1Algo/L1TrackPar.h
@@ -7,9 +7,7 @@ class L1TrackPar {
 
 public:
   fvec x, y, tx, ty, qp, z, t, C00, C10, C11, C20, C21, C22, C30, C31, C32, C33,
-    C40, C41, C42, C43, C44, C50, C51, C52, C53, C54, C55, chi2, NDF, time,
-    time1, t_er;
-  fvec n;
+    C40, C41, C42, C43, C44, C50, C51, C52, C53, C54, C55, chi2, NDF;
 
 
   L1TrackPar()
@@ -42,11 +40,7 @@ public:
     , C54(0)
     , C55(0)
     , chi2(0)
-    , NDF(0)
-    , time(0)
-    , time1(0)
-    , t_er(0)
-    , n(0) {};
+    , NDF(0) {};
   L1TrackPar(double* T, double* C)
     : x(T[0])
     , y(T[1])
@@ -79,11 +73,7 @@ public:
     , C54(C[19])
     , C55(C[20])
     , chi2(0)
-    , NDF(0)
-    , time(0)
-    , time1(0)
-    , t_er(0)
-    , n(0) {};
+    , NDF(0) {};
 
   void SetOneEntry(const int i0, const L1TrackPar& T1, const int i1);
 
@@ -159,12 +149,8 @@ L1TrackPar::SetOneEntry(const int i0, const L1TrackPar& T1, const int i1) {
   C54[i0] = T1.C54[i1];
   C55[i0] = T1.C55[i1];
 
-  chi2[i0]  = T1.chi2[i1];
-  NDF[i0]   = T1.NDF[i1];
-  time[i0]  = T1.time[i1];
-  n[i0]     = T1.n[i1];
-  time1[i0] = T1.time1[i1];
-  t_er[i0]  = T1.t_er[i1];
+  chi2[i0] = T1.chi2[i1];
+  NDF[i0]  = T1.NDF[i1];
 }  // SetOneEntry
 
 #endif
diff --git a/reco/L1/L1Algo/L1Triplet.h b/reco/L1/L1Algo/L1Triplet.h
index 633da1081a00caace34b235e3528b845c3bcda27..df3f4d6b53570700e85192ed3dc4a8924ba901a5 100644
--- a/reco/L1/L1Algo/L1Triplet.h
+++ b/reco/L1/L1Algo/L1Triplet.h
@@ -12,15 +12,19 @@ public:
   //  int loc;
 
 private:
-  THitI w0;          // left hit (16b)  index in vStsHits array
-  THitI w1;          // middle hit(16b)
-  THitI w2;          // right hit(16b)
-                     // unsigned char      b0; // chi2(5b) + level(3b)
+  unsigned int first_neighbour;
+  char last_neighbour;
   unsigned char bl;  // level
-  fscal b1;          // qp (8b)
+
   unsigned char st;  // staL (4b), staM-1-staL (2b), staR-2-staL (2b)
+  fscal b1;          // qp (8b)
   fscal chi2double;
 
+  THitI w0;  // left hit (16b)  index in vStsHits array
+  THitI w1;  // middle hit(16b)
+  THitI w2;  // right hit(16b)
+             // unsigned char      b0; // chi2(5b) + level(3b)
+
 
 public:
   //  std::vector<unsigned int> neighbours;
@@ -61,27 +65,24 @@ public:
 
   fscal Cqp;
   fscal tx, ty, Ctx, Cty;
-  //   fscal time;
-  //   fscal n;
-  unsigned int first_neighbour;
-  unsigned int last_neighbour;
 
 
   L1Triplet()
-    : w0()
-    , w1()
-    , w2()
+    : first_neighbour(0)
+    , last_neighbour(0)
     , bl()
-    , b1(0)
     , st()
+    , b1(0)
     , chi2double(0)
+    , w0()
+    , w1()
+    , w2()
+
     , Cqp(0)
     , tx(0)
     , ty(0)
     , Ctx(0)
-    , Cty(0)
-    , first_neighbour(0)
-    , last_neighbour(0) {};
+    , Cty(0) {};
 
   void Set(unsigned int iHitL,
            unsigned int iHitM,
@@ -114,9 +115,14 @@ public:
 
   void SetLevel(unsigned char Level) { bl = Level; }
 
+
   THitI GetLHit() const { return w0; }
   THitI GetMHit() const { return w1; }
   THitI GetRHit() const { return w2; }
+  char GetNNeighbours() const { return last_neighbour; }
+  void SetNNeighbours(unsigned char n) { last_neighbour = n; }
+  unsigned int GetFNeighbour() const { return first_neighbour; }
+  void SetFNeighbour(unsigned int n) { first_neighbour = n; }
 
   // unsigned int GetFirstNeighbour() const {
   //   return w1;