diff --git a/macro/mcbm/mcbm_reco_event.C b/macro/mcbm/mcbm_reco_event.C
index 7913e8e1aa31793116a770f63b5ff2496f82f673..69e233ce10b5477a458de8e39cdda3dee58485c9 100644
--- a/macro/mcbm/mcbm_reco_event.C
+++ b/macro/mcbm/mcbm_reco_event.C
@@ -25,7 +25,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
 
 
   // -----   Environment   --------------------------------------------------
-  TString myName = "mcbm_reco";  // this macro's name for screen output
+  TString myName = "mcbm_reco";                    // this macro's name for screen output
   TString srcDir = gSystem->Getenv("VMCWORKDIR");  // top source directory
   // ------------------------------------------------------------------------
 
@@ -60,20 +60,16 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
 
   // - TRD digitisation parameters
   if (setup->GetGeoTag(ECbmModuleId::kTrd, geoTag)) {
-    TObjString* trdFile =
-      new TObjString(srcDir + "/parameters/trd/trd_" + geoTag + ".digi.par");
+    TObjString* trdFile = new TObjString(srcDir + "/parameters/trd/trd_" + geoTag + ".digi.par");
     parFileList->Add(trdFile);
-    std::cout << "-I- " << myName << ": Using parameter file "
-              << trdFile->GetString() << std::endl;
+    std::cout << "-I- " << myName << ": Using parameter file " << trdFile->GetString() << std::endl;
   }
 
   // - TOF digitisation parameters
   if (setup->GetGeoTag(ECbmModuleId::kTof, geoTag)) {
-    TObjString* tofBdfFile =
-      new TObjString(srcDir + "/parameters/tof/tof_" + geoTag + ".digibdf.par");
+    TObjString* tofBdfFile = new TObjString(srcDir + "/parameters/tof/tof_" + geoTag + ".digibdf.par");
     parFileList->Add(tofBdfFile);
-    std::cout << "-I- " << myName << ": Using parameter file "
-              << tofBdfFile->GetString() << std::endl;
+    std::cout << "-I- " << myName << ": Using parameter file " << tofBdfFile->GetString() << std::endl;
   }
   // ------------------------------------------------------------------------
 
@@ -94,8 +90,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
 
   // -----   Input file   ---------------------------------------------------
   std::cout << std::endl;
-  std::cout << "-I- " << myName << ": Using input file " << rawFile
-            << std::endl;
+  std::cout << "-I- " << myName << ": Using input file " << rawFile << std::endl;
   // ------------------------------------------------------------------------
 
 
@@ -103,6 +98,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
   FairRunAna* run = new FairRunAna();
 
   FairFileSource* inputSource = new FairFileSource(rawFile);
+
   run->SetSource(inputSource);
 
   run->SetOutputFile(recFile);
@@ -111,7 +107,6 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
   if (hasFairMonitor) FairMonitor::GetMonitor()->EnableMonitor(kTRUE);
   // ------------------------------------------------------------------------
 
-
   // -----   Logger settings   ----------------------------------------------
   FairLogger::GetLogger()->SetLogScreenLevel(logLevel.Data());
   FairLogger::GetLogger()->SetLogVerbosityLevel(logVerbosity.Data());
@@ -121,17 +116,14 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
   // -----   Local reconstruction in MVD   ----------------------------------
   if (setup->IsActive(ECbmModuleId::kMvd)) {
 
-    CbmMvdClusterfinder* mvdCluster =
-      new CbmMvdClusterfinder("MVD Cluster Finder", 0, 0);
+    CbmMvdClusterfinder* mvdCluster = new CbmMvdClusterfinder("MVD Cluster Finder", 0, 0);
     run->AddTask(mvdCluster);
-    std::cout << "-I- " << myName << ": Added task " << mvdCluster->GetName()
-              << std::endl;
+    std::cout << "-I- " << myName << ": Added task " << mvdCluster->GetName() << std::endl;
 
     CbmMvdHitfinder* mvdHit = new CbmMvdHitfinder("MVD Hit Finder", 0, 0);
     mvdHit->UseClusterfinder(kTRUE);
     run->AddTask(mvdHit);
-    std::cout << "-I- " << myName << ": Added task " << mvdHit->GetName()
-              << std::endl;
+    std::cout << "-I- " << myName << ": Added task " << mvdHit->GetName() << std::endl;
   }
   // ------------------------------------------------------------------------
 
@@ -159,13 +151,12 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
 
     if (muchFlag) {
       std::cout << geoTag << std::endl;
-      parFile =
-        parFile + "/parameters/much/much_" + geoTag + "_digi_sector.root";
+      parFile = parFile + "/parameters/much/much_" + geoTag + "_digi_sector.root";
       std::cout << "Using parameter file " << parFile << std::endl;
-    } else {
+    }
+    else {
       std::cout << geoTag(0, 4) << std::endl;
-      parFile =
-        parFile + "/parameters/much/much_" + geoTag(0, 4) + "_digi_sector.root";
+      parFile = parFile + "/parameters/much/much_" + geoTag(0, 4) + "_digi_sector.root";
       std::cout << "Using parameter file " << parFile << std::endl;
     }
 
@@ -173,8 +164,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
     // --- Hit finder for GEMs
     FairTask* muchHitGem = new CbmMuchFindHitsGem(parFile.Data(), muchFlag);
     run->AddTask(muchHitGem);
-    std::cout << "-I- " << myName << ": Added task " << muchHitGem->GetName()
-              << FairLogger::endl;
+    std::cout << "-I- " << myName << ": Added task " << muchHitGem->GetName() << FairLogger::endl;
   }
   // ------------------------------------------------------------------------
 
@@ -182,21 +172,19 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
   // -----   Local reconstruction in TRD   ----------------------------------
   if (setup->IsActive(ECbmModuleId::kTrd)) {
 
-    Double_t triggerThreshold = 0.5e-6;  // SIS100
-    Bool_t triangularPads     = false;  // Bucharest triangular pad-plane layout
+    Double_t triggerThreshold       = 0.5e-6;  // SIS100
+    Bool_t triangularPads           = false;   // Bucharest triangular pad-plane layout
     CbmTrdClusterFinder* trdCluster = new CbmTrdClusterFinder();
     trdCluster->SetNeighbourEnable(true);
     trdCluster->SetMinimumChargeTH(triggerThreshold);
     trdCluster->SetNeighbourEnable(false);
     trdCluster->SetRowMerger(true);
     run->AddTask(trdCluster);
-    std::cout << "-I- " << myName << ": Added task " << trdCluster->GetName()
-              << std::endl;
+    std::cout << "-I- " << myName << ": Added task " << trdCluster->GetName() << std::endl;
 
     CbmTrdHitProducer* trdHit = new CbmTrdHitProducer();
     run->AddTask(trdHit);
-    std::cout << "-I- " << myName << ": Added task " << trdHit->GetName()
-              << std::endl;
+    std::cout << "-I- " << myName << ": Added task " << trdHit->GetName() << std::endl;
   }
   // ---------------------------------------------------------------------------
   // TOF defaults
@@ -214,27 +202,21 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
   if (setup->IsActive(ECbmModuleId::kTof)) {
     switch (iTofCluMode) {
       case 1: {
-        CbmTofEventClusterizer* tofCluster =
-          new CbmTofEventClusterizer("TOF Event Clusterizer", 0, 1);
+        CbmTofEventClusterizer* tofCluster = new CbmTofEventClusterizer("TOF Event Clusterizer", 0, 1);
 
         tofCluster->SetCalMode(calMode);
         tofCluster->SetCalSel(calSel);
-        tofCluster->SetCaldXdYMax(3.);  // geometrical matching window in cm
-        tofCluster->SetCalCluMulMax(
-          5.);  // Max Counter Cluster Multiplicity for filling calib histos
-        tofCluster->SetCalRpc(calSm);  // select detector for calibration update
-        tofCluster->SetTRefId(
-          RefSel);                   // reference trigger for offset calculation
-        tofCluster->SetTotMax(20.);  // Tot upper limit for walk corection
-        tofCluster->SetTotMin(
-          0.01);  //(12000.);  // Tot lower limit for walk correction
-        tofCluster->SetTotPreRange(
-          5.);  // effective lower Tot limit  in ns from peak position
-        tofCluster->SetTotMean(5.);       // Tot calibration target value in ns
-        tofCluster->SetMaxTimeDist(1.0);  // default cluster range in ns
-        tofCluster->SetDelTofMax(
-          5.);  // acceptance range for cluster distance in ns (!)
-        tofCluster->SetSel2MulMax(3);  // limit Multiplicity in 2nd selector
+        tofCluster->SetCaldXdYMax(3.);              // geometrical matching window in cm
+        tofCluster->SetCalCluMulMax(5.);            // Max Counter Cluster Multiplicity for filling calib histos
+        tofCluster->SetCalRpc(calSm);               // select detector for calibration update
+        tofCluster->SetTRefId(RefSel);              // reference trigger for offset calculation
+        tofCluster->SetTotMax(20.);                 // Tot upper limit for walk corection
+        tofCluster->SetTotMin(0.01);                //(12000.);  // Tot lower limit for walk correction
+        tofCluster->SetTotPreRange(5.);             // effective lower Tot limit  in ns from peak position
+        tofCluster->SetTotMean(5.);                 // Tot calibration target value in ns
+        tofCluster->SetMaxTimeDist(1.0);            // default cluster range in ns
+        tofCluster->SetDelTofMax(5.);               // acceptance range for cluster distance in ns (!)
+        tofCluster->SetSel2MulMax(3);               // limit Multiplicity in 2nd selector
         tofCluster->SetChannelDeadtime(dDeadtime);  // artificial deadtime in ns
         tofCluster->SetEnableAvWalk(kFALSE);
         //tofCluster->SetEnableMatchPosScaling(kFALSE); // turn off projection to nominal target
@@ -244,17 +226,14 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
         tofCluster->SetTRefDifMax(2.0);  // in ns
         tofCluster->PosYMaxScal(0.75);   //in % of length
         run->AddTask(tofCluster);
-        std::cout << "-I- " << myName << ": Added task "
-                  << tofCluster->GetName() << std::endl;
+        std::cout << "-I- " << myName << ": Added task " << tofCluster->GetName() << std::endl;
       } break;
       default: {
-        CbmTofSimpClusterizer* tofCluster =
-          new CbmTofSimpClusterizer("TOF Simple Clusterizer", 0);
+        CbmTofSimpClusterizer* tofCluster = new CbmTofSimpClusterizer("TOF Simple Clusterizer", 0);
         tofCluster->SetOutputBranchPersistent("TofHit", kTRUE);
         tofCluster->SetOutputBranchPersistent("TofDigiMatch", kTRUE);
         run->AddTask(tofCluster);
-        std::cout << "-I- " << myName << ": Added task "
-                  << tofCluster->GetName() << std::endl;
+        std::cout << "-I- " << myName << ": Added task " << tofCluster->GetName() << std::endl;
       }
     }
   }
@@ -275,35 +254,28 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
       CbmTofTrackFinder* tofTrackFinder = new CbmTofTrackFinderNN();
       tofTrackFinder->SetMaxTofTimeDifference(0.2);  // in ns/cm
       tofTrackFinder->SetTxLIM(0.3);                 // max slope dx/dz
-      tofTrackFinder->SetTyLIM(0.3);  // max dev from mean slope dy/dz
-      tofTrackFinder->SetTyMean(0.);  // mean slope dy/dz
+      tofTrackFinder->SetTyLIM(0.3);                 // max dev from mean slope dy/dz
+      tofTrackFinder->SetTyMean(0.);                 // mean slope dy/dz
       CbmTofTrackFitter* tofTrackFitter = new CbmTofTrackFitterKF(0, 211);
       TFitter* MyFit                    = new TFitter(1);  // initialize Minuit
       tofTrackFinder->SetFitter(tofTrackFitter);
-      CbmTofFindTracks* tofFindTracks =
-        new CbmTofFindTracks("TOF Track Finder");
+      CbmTofFindTracks* tofFindTracks = new CbmTofFindTracks("TOF Track Finder");
       tofFindTracks->UseFinder(tofTrackFinder);
       tofFindTracks->UseFitter(tofTrackFitter);
-      tofFindTracks->SetCorMode(
-        iGenCor);  // valid options: 0,1,2,3,4,5,6, 10 - 19
-      tofFindTracks->SetTtTarg(
-        0.041);  // target value for inverse velocity, > 0.033 ns/cm!
+      tofFindTracks->SetCorMode(iGenCor);  // valid options: 0,1,2,3,4,5,6, 10 - 19
+      tofFindTracks->SetTtTarg(0.041);     // target value for inverse velocity, > 0.033 ns/cm!
       //tofFindTracks->SetTtTarg(0.035);                // target value for inverse velocity, > 0.033 ns/cm!
-      tofFindTracks->SetCalParFileName(
-        cTrkFile);  // Tracker parameter value file name
-      tofFindTracks->SetBeamCounter(5, 0, 0);  // default beam counter
-      tofFindTracks->SetStationMaxHMul(
-        30);  // Max Hit Multiplicity in any used station
-
-      tofFindTracks->SetT0MAX(dScalFac);  // in ns
-      tofFindTracks->SetSIGT(0.08);       // default in ns
-      tofFindTracks->SetSIGX(0.3);        // default in cm
-      tofFindTracks->SetSIGY(0.45);       // default in cm
-      tofFindTracks->SetSIGZ(0.05);       // default in cm
-      tofFindTracks->SetUseSigCalib(
-        kFALSE);  // ignore resolutions in CalPar file
-      tofTrackFinder->SetSIGLIM(dChi2Lim2
-                                * 2.);  // matching window in multiples of chi2
+      tofFindTracks->SetCalParFileName(cTrkFile);  // Tracker parameter value file name
+      tofFindTracks->SetBeamCounter(5, 0, 0);      // default beam counter
+      tofFindTracks->SetStationMaxHMul(30);        // Max Hit Multiplicity in any used station
+
+      tofFindTracks->SetT0MAX(dScalFac);           // in ns
+      tofFindTracks->SetSIGT(0.08);                // default in ns
+      tofFindTracks->SetSIGX(0.3);                 // default in cm
+      tofFindTracks->SetSIGY(0.45);                // default in cm
+      tofFindTracks->SetSIGZ(0.05);                // default in cm
+      tofFindTracks->SetUseSigCalib(kFALSE);       // ignore resolutions in CalPar file
+      tofTrackFinder->SetSIGLIM(dChi2Lim2 * 2.);   // matching window in multiples of chi2
       tofTrackFinder->SetChiMaxAccept(dChi2Lim2);  // max tracklet chi2
 
       Int_t iMinNofHits   = -1;
@@ -316,7 +288,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
           tofFindTracks->SetStation(0, 5, 0, 0);  // Diamond
           break;
         case 1:  // for calibration mode of full setup
-          iMinNofHits   = 3;
+          iMinNofHits = 3;
           //          iNStations    = 39;
           iNStations    = 26;
           iNReqStations = 3;
@@ -369,18 +341,86 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
       tofFindTracks->SetNStations(iNStations);
       tofFindTracks->SetNReqStations(iNReqStations);
       tofFindTracks->PrintSetup();
-      run->AddTask(tofFindTracks);
+      // run->AddTask(tofFindTracks);
     } break;
     default: {
-      CbmBinnedTrackerTask* trackerTask =
-        new CbmBinnedTrackerTask(kTRUE, beamWidthX, beamWidthY);
+      CbmBinnedTrackerTask* trackerTask = new CbmBinnedTrackerTask(kTRUE, beamWidthX, beamWidthY);
       trackerTask->SetUse(ECbmModuleId::kTrd, kFALSE);
-      run->AddTask(trackerTask);
+      // run->AddTask(trackerTask);
     }
   }
   // ------------------------------------------------------------------------
 
 
+  // ------------------------------------------------------------------------
+  // --------   L1 CA Track Finder    ---------------------------------------
+
+  CbmKF* kalman = new CbmKF();
+  run->AddTask(kalman);
+  CbmL1* l1 = new CbmL1();
+
+  l1->SetmCBMmode(1);
+  l1->SetUseHitErrors(1);
+
+  // --- Material budget file names
+  TString mvdGeoTag;
+  if (setup->GetGeoTag(ECbmModuleId::kMvd, mvdGeoTag)) {
+    TString parFile = gSystem->Getenv("VMCWORKDIR");
+    parFile         = parFile + "/parameters/mvd/mvd_matbudget_" + mvdGeoTag + ".root";
+    std::cout << "Using material budget file " << parFile << std::endl;
+    l1->SetMvdMaterialBudgetFileName(parFile.Data());
+  }
+  TString stsGeoTag;
+  if (setup->GetGeoTag(ECbmModuleId::kSts, stsGeoTag)) {
+    TString parFile = gSystem->Getenv("VMCWORKDIR");
+    parFile         = parFile + "/parameters/sts/sts_matbudget_v19a.root";
+    std::cout << "Using material budget file " << parFile << std::endl;
+    l1->SetStsMaterialBudgetFileName(parFile.Data());
+  }
+
+  TString muchGeoTag;
+  if (setup->GetGeoTag(ECbmModuleId::kMuch, muchGeoTag)) {
+
+    // --- Parameter file name
+    TString geoTag;
+    setup->GetGeoTag(ECbmModuleId::kMuch, geoTag);
+    Int_t muchFlag = 0;
+    if (geoTag.Contains("mcbm")) muchFlag = 1;
+
+    TString parFile = gSystem->Getenv("VMCWORKDIR");
+    parFile         = parFile + "/parameters/much/much_" + geoTag(0, 4) + "_digi_sector.root";
+    std::cout << "L1: Using parameter file " << parFile << std::endl;
+    l1->SetMuchPar(parFile);
+
+    TString parFile2 = gSystem->Getenv("VMCWORKDIR");
+    parFile2         = parFile2 + "/parameters/much/much_matbudget_v20a_mcbm.root ";
+    std::cout << "Using material budget file " << parFile2 << std::endl;
+    l1->SetMuchMaterialBudgetFileName(parFile2.Data());
+  }
+
+  TString trdGeoTag;
+  if (setup->GetGeoTag(ECbmModuleId::kTrd, trdGeoTag)) {
+    TString parFile = gSystem->Getenv("VMCWORKDIR");
+    parFile         = parFile + "/parameters/trd/trd_matbudget_v20a_mcbm.root";
+    std::cout << "Using material budget file " << parFile << std::endl;
+    l1->SetTrdMaterialBudgetFileName(parFile.Data());
+  }
+
+  TString tofGeoTag;
+  if (setup->GetGeoTag(ECbmModuleId::kTof, tofGeoTag)) {
+    TString parFile = gSystem->Getenv("VMCWORKDIR");
+    parFile         = parFile + "/parameters/tof/tof_matbudget_v20f_mcbm.root";
+    std::cout << "Using material budget file " << parFile << std::endl;
+    l1->SetTofMaterialBudgetFileName(parFile.Data());
+  }
+
+  run->AddTask(l1);
+
+  CbmStsTrackFinder* stsTrackFinder = new CbmL1StsTrackFinder();
+  FairTask* stsFindTracks           = new CbmStsFindTracksEvents(stsTrackFinder);
+  run->AddTask(stsFindTracks);
+
+
   // -----  Parameter database   --------------------------------------------
   std::cout << std::endl << std::endl;
   std::cout << "-I- " << myName << ": Set runtime DB" << std::endl;
@@ -423,8 +463,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
   std::cout << "Macro finished successfully." << std::endl;
   std::cout << "Output file is " << recFile << std::endl;
   std::cout << "Parameter file is " << parFile << std::endl;
-  std::cout << "Real time " << rtime << " s, CPU time " << ctime << " s"
-            << std::endl;
+  std::cout << "Real time " << rtime << " s, CPU time " << ctime << " s" << std::endl;
   std::cout << std::endl;
   std::cout << " Test passed" << std::endl;
   std::cout << " All ok " << std::endl;
diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx
index e579a0976dfa4c65cd8a29ac375d28e853507c7f..da21d553b2f1d36bda24fedb96efd408f20a82e3 100644
--- a/reco/L1/CbmL1.cxx
+++ b/reco/L1/CbmL1.cxx
@@ -374,14 +374,14 @@ InitStatus CbmL1::Init()
   fUseTOF  = 0;
 
   if (fmCBMmode) {
-    fUseMUCH = 1;
+    fUseMUCH = 0;
     fUseTRD  = 1;
     fUseTOF  = 1;
   }
 
 
   if (fGlobalMode) {
-    fUseMUCH = 1;
+    fUseMUCH = 0;
     fUseTRD  = 1;
     fUseTOF  = 1;
   }
@@ -515,7 +515,7 @@ InitStatus CbmL1::Init()
     }
     else {
       fTofPoints         = mcManager->InitBranch("TofPoint");
-      fTofHitDigiMatches = static_cast<TClonesArray*>(fManger->GetObject("TofHitCalDigiMatch"));
+      fTofHitDigiMatches = static_cast<TClonesArray*>(fManger->GetObject("TofHitMatch"));
     }
   }
   else {
@@ -625,7 +625,7 @@ InitStatus CbmL1::Init()
       }
     }
 
-    if (fUseTOF) NTOFStation = fTofDigiBdfPar->GetNbTrackingStations();
+    if (fUseTOF) NTOFStation = 3;//fTofDigiBdfPar->GetNbTrackingStations();
 
     for (int i = 0; i < (maxTofStation + 1); i++)
       Z_pos[i] = Z_pos[i] / NHits[i];
@@ -835,12 +835,9 @@ InitStatus CbmL1::Init()
 
       geo.push_back(4);
 
-      if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 0)) geo.push_back(245);
-      if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 1)) geo.push_back(249);
-      if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 2)) geo.push_back(261);
-      if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 3)) geo.push_back(266);
-      if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 4)) geo.push_back(278);
-      if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 5)) geo.push_back(283);
+    if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 0)) geo.push_back(247);
+    if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 1)) geo.push_back(264);
+    if (ist == (NMvdStations + NStsStations + NTrdStations + NMuchStations + 2)) geo.push_back(280);
 
       geo.push_back(10);  /// TODO: add Tof width dz
       geo.push_back(0);
diff --git a/reco/L1/CbmL1ReadEvent.cxx b/reco/L1/CbmL1ReadEvent.cxx
index 7277979e65d07282eac19c5d8213cc0564b71b64..8ee4c014f6da20c5d3c5e635ee1ac56b6e6c4e36 100644
--- a/reco/L1/CbmL1ReadEvent.cxx
+++ b/reco/L1/CbmL1ReadEvent.cxx
@@ -259,14 +259,22 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
 
       if (fTofPoints) {
         for (int j = 0; j < fTofHits->GetEntriesFast(); j++) {
+        
+          CbmLink* link   = 0;
 
           CbmTofHit* mh = L1_DYNAMIC_CAST<CbmTofHit*>(fTofHits->At(j));
+          
+          if( 0x00202806 == mh->GetAddress() || 0x00002806 == mh->GetAddress() ) {
+            ToFPointsMatch.push_back(link);
+            continue;
+          }
 
           CbmMatch* matchHitMatch = L1_DYNAMIC_CAST<CbmMatch*>(fTofHitDigiMatches->At(j));
 
           if (matchHitMatch->GetNofLinks() > 0) {
 
-            CbmLink* link   = (CbmLink*) &matchHitMatch->GetLink(0);
+            link   = (CbmLink*) &matchHitMatch->GetLink(0);
+            
             CbmTofPoint* pt = (CbmTofPoint*) fTofPoints->Get(link->GetFile(), link->GetEntry(), link->GetIndex());
 
             for (int iLink = 1; iLink < matchHitMatch->GetNofLinks(); iLink++) {
@@ -298,6 +306,8 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
           CbmL1MCPoint MC;
 
           MC.event = iEvent;
+          
+          if (ToFPointsMatch[iMC]==0) continue;
 
           int eventNr = ToFPointsMatch[iMC]->GetEntry();
 
@@ -463,6 +473,7 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
   if (fVerbose >= 10) cout << "ReadEvent: mvd hits are gotten." << endl;
 
 
+
   Int_t nEntSts = 0;
   if (listStsHits) {
 
@@ -590,6 +601,8 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
 
     }  // for j
   }    // if listStsHits
+  
+
 
   if (fMuchPixelHits) {
 
@@ -605,6 +618,7 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
 
         th.ExtIndex = j;
         th.Det      = 2;
+        th.id = j + nMvdHits + nStsHits;
 
 
         Int_t stationNumber = CbmMuchGeoScheme::GetStationIndex(mh->GetAddress());
@@ -708,6 +722,8 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
       CbmTrdHit* mh = L1_DYNAMIC_CAST<CbmTrdHit*>(listTrdHits->At(j));
       th.ExtIndex   = j;
       th.Det        = 3;
+      
+      th.id = j + nMvdHits + nStsHits + nMuchHits;
 
       th.iStation = NMvdStations + mh->GetPlaneId() + NStsStations + NMuchStations;
 
@@ -797,14 +813,30 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
       TmpHit th;
 
       CbmTofHit* mh = L1_DYNAMIC_CAST<CbmTofHit*>(fTofHits->At(j));
+      
+      
+      
       th.ExtIndex   = j;
       th.Det        = 4;
-
-      th.iStation = fTofDigiBdfPar->GetTrackingStation(mh) + NMvdStations + NStsStations + NMuchStations + NTrdStations;
+      
+      th.id = j + nMvdHits + nStsHits + nMuchHits + nTrdHits;
+      
+      if( 0x00202806 == mh->GetAddress() || 0x00002806 == mh->GetAddress() ) continue;
+      
+      int sttof = -1;
+      
+      if (fTofDigiBdfPar->GetTrackingStation(mh)==0) sttof = 0;
+      if (fTofDigiBdfPar->GetTrackingStation(mh)==1) sttof = 0;
+      if (fTofDigiBdfPar->GetTrackingStation(mh)==2) sttof = 1;
+      if (fTofDigiBdfPar->GetTrackingStation(mh)==3) sttof = 1;
+      if (fTofDigiBdfPar->GetTrackingStation(mh)==4) sttof = 2;
+      if (fTofDigiBdfPar->GetTrackingStation(mh)==5) sttof = 2;
+
+      th.iStation = sttof + NMvdStations + NStsStations + NMuchStations + NTrdStations;
 
       th.time = mh->GetTime();
 
-      th.t_er = 5;  //mh->GetTimeError();
+      th.t_er = mh->GetTimeError();
 
       th.dx  = mh->GetDx();
       th.dy  = mh->GetDy();
@@ -837,7 +869,7 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
 
       if (fPerformance) {
 
-        //   if (ToFPointsMatch[j]!=0)
+        if (ToFPointsMatch[j]==0) continue;
 
         //  th.iMC = j+nMvdPoints+nStsPoints+nTrdPoints+nMuchPoints;
 
@@ -874,10 +906,13 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
   }    // if listTofHits
 
   if (fVerbose >= 10) cout << "ReadEvent: sts hits are gotten." << endl;
+  
+  
 
   // sort hits
   int nHits = nMvdHits + nStsHits + nMuchHits + nTrdHits + nTofHits;
 
+
   sort(tmpHits.begin(), tmpHits.end(), TmpHit::Compare);
 
   // save strips in L1Algo
@@ -1029,12 +1064,12 @@ void CbmL1::ReadEvent(L1AlgoInputData* fData_, float& TsStart, float& TsLength,
     vHitMCRef.push_back(th.iMC);
   }
 
-
   for (int i = 0; i < NStation; i++) {
 
     if (fData_->StsHitsStartIndex[i] == static_cast<THitI>(-1))
       fData_->StsHitsStartIndex[i] = fData_->StsHitsStopIndex[i];
   }
+  
 
   if (fVerbose >= 10) cout << "ReadEvent: mvd and sts are saved." << endl;
 
diff --git a/reco/L1/L1Algo/L1CATrackFinder.cxx b/reco/L1/L1Algo/L1CATrackFinder.cxx
index e31c98fd5f4a75a79cdd5af06113eb2bbabe7069..1c66d74ac59b214b0ff4854bc10d2a03eaf0a605 100644
--- a/reco/L1/L1Algo/L1CATrackFinder.cxx
+++ b/reco/L1/L1Algo/L1CATrackFinder.cxx
@@ -75,7 +75,7 @@ inline void L1Algo::f10(  // input
   // output
   fvec* u_front_l, fvec* u_back_l, fvec* zPos_l, THitI* hitsl, fvec* HitTime_l, fvec* HitTimeEr,
   // comment unused parameters, FU, 18.01.21
-  fvec* /*Event_l*/, fvec* /*d_x*/, fvec* /*d_y*/, fvec* /*d_xy*/, fvec* d_u, fvec* d_v)
+  fvec* Event_l, fvec* /*d_x*/, fvec* /*d_y*/, fvec* /*d_xy*/, fvec* d_u, fvec* d_v)
 {
   const Tindex& end_lh = start_lh + n1_l;
 
@@ -161,10 +161,10 @@ inline void L1Algo::f11(  /// input 1st stage of singlet search
     fvec& u = u_front_l[i1_V];
     fvec& v = u_back_l[i1_V];
     fvec xl, yl;  // left(1-st) hit coor
-    fvec zl          = zPos_l[i1_V];
-    fvec& time       = HitTime_l[i1_V];
-    fvec& timeEr     = HitTimeEr[i1_V];
-    const fvec dzli  = 1. / (zl - targZ);
+    fvec zl         = zPos_l[i1_V];
+    fvec& time      = HitTime_l[i1_V];
+    fvec& timeEr    = HitTimeEr[i1_V];
+    const fvec dzli = 1. / (zl - targZ);
 
     fvec dx1, dy1, dxy1 = 0;
 
@@ -224,6 +224,7 @@ inline void L1Algo::f11(  /// input 1st stage of singlet search
     if ((isec == kAllSecIter) || (isec == kAllSecEIter) || (isec == kAllSecJumpIter)) T.NDF = 0;
     T.tx = tx;
     T.ty = ty;
+    T.t  = time;
 
     T.qp  = 0.;
     T.C20 = T.C21 = 0;
@@ -231,10 +232,10 @@ inline void L1Algo::f11(  /// input 1st stage of singlet search
     T.C40 = T.C41 = T.C42 = T.C43 = 0;
     T.C50 = T.C51 = T.C52 = T.C53 = T.C54 = 0;
     T.C22 = T.C33 = MaxSlope * MaxSlope / 9.;
-    T.C44         = MaxInvMom / 3. * MaxInvMom / 3.;
-    T.C55         = timeEr * timeEr;
+    if (fGlobal || fmCBMmode) T.C22 = T.C33 = 10;
+    T.C44 = MaxInvMom / 3. * MaxInvMom / 3.;
+    T.C55 = timeEr * timeEr;
 
-    T.t = time;
 
     // #define BEGIN_FROM_TARGET
 #ifndef BEGIN_FROM_TARGET  // the best now
@@ -277,6 +278,7 @@ inline void L1Algo::f11(  /// input 1st stage of singlet search
       }
     }
 
+
     else
 
     //add the target
@@ -352,16 +354,17 @@ inline void L1Algo::f11(  /// input 1st stage of singlet search
 
 #endif
 
-    FilterTime(T, time, timeEr);
 
 #ifdef USE_RL_TABLE
-    fit.L1AddMaterial(T, fRadThick[istal].GetRadThick(T.x, T.y), MaxInvMom, 1);
+    if (!fmCBMmode) fit.L1AddMaterial(T, fRadThick[istal].GetRadThick(T.x, T.y), MaxInvMom, 1);
+    if (fGlobal || fmCBMmode)
+      fit.L1AddThickMaterial(T, fRadThick[istal].GetRadThick(T.x, T.y), MaxInvMom, 1, stal.materialInfo.thick, 1);
 #else
     fit.L1AddMaterial(T, stal.materialInfo, MaxInvMom, 1);
 #endif
     if ((istam >= NMvdStations) && (istal <= NMvdStations - 1)) { fit.L1AddPipeMaterial(T, MaxInvMom, 1); }
 
-    fvec dz = zstam - T.z;
+    fvec dz = zstam - zl;
     L1ExtrapolateTime(T, dz);
 
     if (fGlobal || fmCBMmode)
@@ -411,6 +414,7 @@ inline void L1Algo::f20(  // input
     const float& timeError = T1.C55[i1_4];
     const float& time      = T1.t[i1_4];
 
+
     L1HitAreaTime areaTime(vGridTime[&stam - vStations], T1.x[i1_4] * iz, T1.y[i1_4] * iz,
                            (sqrt(Pick_m22 * (T1.C00 + stam.XYInfo.C00)) + MaxDZ * fabs(T1.tx))[i1_4] * iz,
                            (sqrt(Pick_m22 * (T1.C11 + stam.XYInfo.C11)) + MaxDZ * fabs(T1.ty))[i1_4] * iz, time,
@@ -433,17 +437,17 @@ inline void L1Algo::f20(  // input
 
       // check y-boundaries
       if (fabs(time - hitm.time) > sqrt(timeError + hitm.timeEr * hitm.timeEr) * 5) continue;
-      if (fabs(time - hitm.time) > 100) continue;
+      if (fabs(time - hitm.time) > 30) continue;
 
 #ifdef USE_EVENT_NUMBER
       if ((Event[i1_V][i1_4] != hitm.n)) continue;
 #endif
       // - check whether hit belong to the window ( track position +\- errors ) -
-      const fscal zm    = hitm.Z();
-      L1TrackPar T1_new = T1;
-      fvec dz           = fvec(zm) - T1.z;
+      const fscal zm = hitm.Z();
+      //       L1TrackPar T1_new = T1;
+      //       fvec dz           = fvec(zm) - T1.z;
+      // L1ExtrapolateTime(T1, dz);
 
-      L1ExtrapolateTime(T1_new, dz);
 
       //       if (fabs(T1_new.t[i1_4]-hitm.time)>sqrt(T1_new.C55[i1_4]+hitm.timeEr*hitm.timeEr)*4) continue;
       //       if (fabs(T1_new.t[i1_4]-hitm.time)>sqrt(2.9*2.9)*5) continue;
@@ -484,6 +488,7 @@ inline void L1Algo::f20(  // input
       }
 
       const fscal dX = xm[i1_4] - x[i1_4];
+
       if (dX * dX > dx_est2) continue;
 
       // check chi2
@@ -491,6 +496,7 @@ inline void L1Algo::f20(  // input
       L1ExtrapolateC10Line(T1, zm, C10);
       fvec chi2 = T1.chi2;
 
+
       L1UMeasurementInfo info = stam.frontInfo;
 
       if (fUseHitErrors) info.sigma2 = hitm.dU() * hitm.dU();
@@ -500,7 +506,7 @@ inline void L1Algo::f20(  // input
       if (isec != TRACKS_FROM_TRIPLETS_ITERATION)
 #endif
         if (chi2[i1_4] > DOUBLET_CHI2_CUT) continue;
-          //   T1.t[i1_4] = hitm.time;
+      T1.t[i1_4] = hitm.time;
 
 #ifdef USE_EVENT_NUMBER
       T1.n[i1_4] = hitm.n;
@@ -512,7 +518,8 @@ inline void L1Algo::f20(  // input
 
       L1FilterChi2(info, x, y, C00, C10, C11, chi2, hitm.V());
 
-      FilterTime(T1_new, hitm.time, hitm.timeEr);
+      // FilterTime(T1, hitm.time, hitm.timeEr);
+
 
 #ifdef DO_NOT_SELECT_TRIPLETS
       if (isec != TRACKS_FROM_TRIPLETS_ITERATION)
@@ -635,6 +642,7 @@ inline void L1Algo::f30(  // input
       // add middle hit
       L1ExtrapolateLine(T2, zPos_2);
 
+
       L1UMeasurementInfo info = stam.frontInfo;
 
       if (fUseHitErrors) info.sigma2 = du2 * du2;
@@ -647,6 +655,7 @@ inline void L1Algo::f30(  // input
       else
         L1Filter(T2, info, u_front_2);
 
+
       info = stam.backInfo;
       if (fUseHitErrors) info.sigma2 = dv2 * dv2;
 
@@ -658,10 +667,13 @@ inline void L1Algo::f30(  // input
       else
         L1Filter(T2, info, u_back_2);
 
-      FilterTime(T2, timeM, timeMEr);
 
+      FilterTime(T2, timeM, timeMEr);
 #ifdef USE_RL_TABLE
-      fit.L1AddMaterial(T2, fRadThick[istam].GetRadThick(T2.x, T2.y), T2.qp, 1);
+      if (!fmCBMmode) fit.L1AddMaterial(T2, fRadThick[istam].GetRadThick(T2.x, T2.y), T2.qp, 1);
+
+      if (fGlobal || fmCBMmode)
+        fit.L1AddThickMaterial(T2, fRadThick[istam].GetRadThick(T2.x, T2.y), T2.qp, 1, stam.materialInfo.thick, 1);
 #else
       fit.L1AddMaterial(T2, stam.materialInfo, T2.qp, 1);
 #endif
@@ -669,6 +681,7 @@ inline void L1Algo::f30(  // input
 
       fvec dz2 = star.z - T2.z;
       L1ExtrapolateTime(T2, dz2);
+
       // extrapolate to the right hit station
 
       if (fGlobal || fmCBMmode)
@@ -683,10 +696,10 @@ inline void L1Algo::f30(  // input
 
       // ---- Find the triplets(right hit). Reformat data in the portion of triplets. ----
       for (Tindex i2_4 = 0; i2_4 < n2_4; ++i2_4) {
-        if (T2.C00[i2_4] < 0 || T2.C11[i2_4] < 0 || T2.C22[i2_4] < 0 || T2.C33[i2_4] < 0 || T2.C44[i2_4] < 0
-            || T2.C55[i2_4] < 0)
-          continue;
-        if (T2.C00[i2_4] < 0 || T2.C11[i2_4] < 0 || T2.C22[i2_4] < 0 || T2.C33[i2_4] < 0) continue;
+        if (!fGlobal || !fmCBMmode)
+          if (T2.C44[i2_4] < 0) continue;
+        if (T2.C00[i2_4] < 0 || T2.C11[i2_4] < 0 || T2.C22[i2_4] < 0 || T2.C33[i2_4] < 0 || T2.C55[i2_4] < 0) continue;
+
 
         const fvec Pick_r22    = (TRIPLET_CHI2_CUT - T2.chi2);
         const float& timeError = T2.C55[i2_4];
@@ -703,6 +716,7 @@ inline void L1Algo::f30(  // input
                            (sqrt(Pick_r22 * (T2.C11 + stam.XYInfo.C11)) + MaxDZ * fabs(T2.ty))[i2_4] * iz, time,
                            sqrt(timeError) * 5);
 
+
         THitI irh = 0;
         int irh1  = -1;
         while (true) {
@@ -730,14 +744,17 @@ inline void L1Algo::f30(  // input
 
           StripsToCoor(hitr.U(), hitr.V(), xr, yr, star);
 
-          fvec dz3 = zr - T2.z;
-          L1ExtrapolateTime(T2, dz3);
+          L1TrackPar T_cur = T2;
+
+
+          fvec dz3 = zr - T_cur.z;
+          L1ExtrapolateTime(T_cur, dz3);
+
+          L1ExtrapolateLine(T_cur, zr);
 
+          if (fabs(T_cur.t[i2_4] - hitr.time) > sqrt(T_cur.C55[i2_4] + hitr.timeEr) * 5) continue;
+          if (fabs(T_cur.t[i2_4] - hitr.time) > 30) continue;
 
-          if (fabs(T2.t[i2_4] - hitr.time) > sqrt(T2.C55[i2_4] + hitr.timeEr) * 5) continue;
-          if (fabs(T2.t[i2_4] - hitr.time) > 100) continue;
-          //
-          //           if (fabs(T2.t[i2_4]-hitr.time)>sqrt(2.9*2.9)*5) continue;
 
           // - check whether hit belong to the window ( track position +\- errors ) -
           // check lower boundary
@@ -764,8 +781,10 @@ inline void L1Algo::f30(  // input
           if (dY2 > dy_est2) continue;  // if (yr > y_plus_new [i2_4] ) continue;
           // check x-boundaries
           fvec x, C00;
+
           L1ExtrapolateXC00Line(T2, zr, x, C00);
 
+
           fscal dx_est2 = (Pick_r22[i2_4] * (fabs(C00[i2_4] + star.XYInfo.C00[i2_4])));
 
           if (fUseHitErrors) {
@@ -775,6 +794,7 @@ inline void L1Algo::f30(  // input
           }
 
           const fscal dX = xr[i2_4] - x[i2_4];
+
           if (dX * dX > dx_est2) continue;
           // check chi2  // not effective
           fvec C10;
@@ -792,18 +812,15 @@ inline void L1Algo::f30(  // input
 
           L1FilterChi2(info, x, y, C00, C10, C11, chi2, hitr.V());
 
-          L1TrackPar T = T2;
+          FilterTime(T_cur, hitr.time, hitr.timeEr);
+
 
-          FilterTime(T, hitr.time, hitr.timeEr);
 #ifdef DO_NOT_SELECT_TRIPLETS
           if (isec != TRACKS_FROM_TRIPLETS_ITERATION)
 #endif
 
-            if (fGlobal || fmCBMmode)
-              if (chi2[i2_4] > TRIPLET_CHI2_CUT || C00[i2_4] < 0 || C11[i2_4] < 0) continue;
-              else if (chi2[i2_4] > TRIPLET_CHI2_CUT || C00[i2_4] < 0 || C11[i2_4] < 0 || T.C55[i2_4] < 0)
-                continue;  // chi2_triplet < CHI2_CUT
-
+            if (chi2[i2_4] > TRIPLET_CHI2_CUT || C00[i2_4] < 0 || C11[i2_4] < 0 || T_cur.C55[i2_4] < 0)
+              continue;  // chi2_triplet < CHI2_CUT
 
           // pack triplet
           L1TrackPar& T3 = T_3[n3_V];
@@ -825,6 +842,7 @@ inline void L1Algo::f30(  // input
           timeER[n3_V][n3_4]  = hitr.timeEr;
 
           n3++;
+
           n3_V = n3 / fvecLen;
           n3_4 = n3 % fvecLen;
 
@@ -863,12 +881,13 @@ inline void L1Algo::f31(  // input
   nsL1::vector<L1TrackPar>::TSimd& T_3)
 {
   for (Tindex i3_V = 0; i3_V < n3_V; ++i3_V) {
-    fvec dz = z_Pos[i3_V] - T_3[i3_V].z;
 
+    fvec dz = z_Pos[i3_V] - T_3[i3_V].z;
 
     L1ExtrapolateTime(T_3[i3_V], dz);
     L1ExtrapolateLine(T_3[i3_V], z_Pos[i3_V]);
 
+
     L1UMeasurementInfo info = star.frontInfo;
 
     if (fUseHitErrors) info.sigma2 = du_[i3_V] * du_[i3_V];
@@ -895,7 +914,7 @@ inline void L1Algo::f31(  // input
     else
       L1Filter(T_3[i3_V], info, u_back_[i3_V]);
 
-    FilterTime(T_3[i3_V], timeR[i3_V], timeER[i3_V]);
+    //  FilterTime(T_3[i3_V], timeR[i3_V], timeER[i3_V]);
   }
 }
 
@@ -1708,7 +1727,7 @@ void L1Algo::CATrackFinder()
 
   for (int iS = 0; iS < NStations; ++iS) {
 
-    vGridTime[iS].BuildBins(-1, 1, -0.6, 0.6, starttime, lasttime, xStep, yStep, (lasttime - starttime + 1) / 30);
+    vGridTime[iS].BuildBins(-1, 1, -0.6, 0.6, starttime, lasttime, xStep, yStep, (lasttime - starttime + 1));
 
     vGridTime[iS].StoreHits(StsHitsUnusedStopIndex[iS] - StsHitsUnusedStartIndex[iS],
                             &((*vStsHits)[StsHitsUnusedStartIndex[iS]]), iS, *this, StsHitsUnusedStartIndex[iS],
@@ -1730,8 +1749,9 @@ void L1Algo::CATrackFinder()
 #ifdef _OPENMP
 #pragma omp parallel for schedule(dynamic, 5)
 #endif
-    for (THitI ih = StsHitsStartIndex[ista]; ih < StsHitsStopIndex[ista]; ++ih)
+    for (THitI ih = StsHitsStartIndex[ista]; ih < StsHitsStopIndex[ista]; ++ih) {
       CreateHitPoint(vStsDontUsedHits_Buf[ih], ista, vStsDontUsedHitsxy_B[ih]);
+    }
   }
 
 #ifdef COUNTERS
@@ -1750,7 +1770,7 @@ void L1Algo::CATrackFinder()
   for (isec = 0; isec < fNFindIterations; ++isec)  // all finder
   {
     if (fmCBMmode)
-      if (isec != 0) continue;
+      if (isec > 1) continue;
 
     n_g1.assign(n_g1.size(), Portion);
 
@@ -1816,7 +1836,7 @@ void L1Algo::CATrackFinder()
         // if ( (isec == kFastPrimIter) )
         //   PickNeighbour = 0.5; // TODO understand why works with 0.2
 
-        MaxInvMom = 1.0 / 0.5;  // max considered q/p
+        if (fmCBMmode) MaxInvMom = 1.5 / 0.1;  // max considered q/p
         if ((isec == kAllPrimJumpIter) || (isec == kAllSecIter) || (isec == kAllSecJumpIter)) MaxInvMom = 1.0 / 0.1;
         if ((isec == kAllPrimIter) || (isec == kAllPrimEIter) || (isec == kAllSecEIter)) MaxInvMom = 1. / 0.05;
 
@@ -2078,9 +2098,6 @@ void L1Algo::CATrackFinder()
     unsigned char curr_L = 1;
     int ndf              = 1;
 
-    vStripToTrack.assign(vStripToTrack.size(), -1);
-    vStripToTrackB.assign(vStripToTrackB.size(), -1);
-
 
     // collect consequtive: the longest tracks, shorter, more shorter and so on
     for (int ilev = NStations - 3; ilev >= min_level; ilev--) {
@@ -2092,9 +2109,13 @@ void L1Algo::CATrackFinder()
 
       const unsigned char min_best_l = (ilev > min_level) ? ilev + 2 : min_level + 3;  // loose maximum
 
+
       for (int i = 0; i < fNThreads; ++i)
         numberCandidateThread[i] = 0;
 
+      vStripToTrack.assign(vStripToTrack.size(), -1);
+      vStripToTrackB.assign(vStripToTrackB.size(), -1);
+
       for (int istaF = FIRSTCASTATION; istaF <= NStations - 3 - ilev; ++istaF) {
 
 #ifdef _OPENMP
@@ -2116,7 +2137,7 @@ void L1Algo::CATrackFinder()
               continue;
 
 
-              // ghost supression !!!
+//               ghost supression !!!
 #ifndef FIND_GAPED_TRACKS
             if (/*(isec == kFastPrimIter) ||*/ (isec == kAllPrimIter) || (isec == kAllPrimEIter)
                 || (isec == kAllSecIter) || (isec == kAllSecEIter) || (isec == kAllSecJumpIter)) {
@@ -2162,7 +2183,7 @@ void L1Algo::CATrackFinder()
             CAFindTrack(istaF, best_tr, best_L, best_chi2, &first_trip, (curr_tr), curr_L, curr_chi2, min_best_l,
                         new_tr);  /// reqursive func to build a tree of possible track-candidates and choose the best
 
-            //  if ( best_L < min_best_l ) continue;
+            //              if ( best_L < min_best_l ) continue;
             if (best_L < ilev + 2) continue;  // lose maximum one hit
 
             if (best_L < min_level + 3) continue;  // should find all hits for min_level
@@ -2171,15 +2192,15 @@ void L1Algo::CATrackFinder()
             best_chi2 = best_chi2 / ndf;  //normalize
 
 #ifndef TRACKS_FROM_TRIPLETS
-            if (fGhostSuppression) {
-              if (best_L == 3) {
-                // if( isec == kAllSecIter ) continue; // too /*short*/ secondary track
-                if (((isec == kAllSecIter) || (isec == kAllSecEIter) || (isec == kAllSecJumpIter)) && (istaF != 0))
-                  continue;  // too /*short*/ non-MAPS track
-                if ((isec != kAllSecIter) && (isec != kAllSecEIter) && (isec != kAllSecJumpIter) && (best_chi2 > 5.0))
-                  continue;
-              }
-            }
+//             if (fGhostSuppression) {
+//               if (best_L == 3) {
+//                 // if( isec == kAllSecIter ) continue; // too /*short*/ secondary track
+//                 if (((isec == kAllSecIter) || (isec == kAllSecEIter) || (isec == kAllSecJumpIter)) && (istaF != 0))
+//                   continue;  // too /*short*/ non-MAPS track
+//                 if ((isec != kAllSecIter) && (isec != kAllSecEIter) && (isec != kAllSecJumpIter) && (best_chi2 > 5.0))
+//                   continue;
+//               }
+//             }
 #endif
             best_tr.Set(istaF, best_L, best_chi2, first_trip.GetQpOrig());
             L1Branch& tr = CandidatesTrack[thread_num][numberCandidateThread[thread_num]];
@@ -2195,7 +2216,6 @@ void L1Algo::CATrackFinder()
 #ifdef _OPENMP
               omp_set_lock(&hitToBestTrackB[h.b]);
 #endif
-
               int& strip1 = (vStripToTrackB)[h.b];
 
               if (strip1 != -1) {
@@ -2248,9 +2268,7 @@ void L1Algo::CATrackFinder()
 #endif
               }
             }
-
             if (check) numberCandidateThread[thread_num]++;
-
           }  // itrip
         }
       }
@@ -2283,7 +2301,10 @@ void L1Algo::CATrackFinder()
               }
             }
 
-            if (tr.NHits < 3) check = 0;
+            if (fmCBMmode)
+              if (tr.NHits <= 3) check = 0;
+              else if (tr.NHits < 3)
+                check = 0;
 
             if (check) {
 #ifdef EXTEND_TRACKS
@@ -2583,7 +2604,7 @@ inline void L1Algo::CAFindTrack(int ista, L1Branch& best_tr, unsigned char& best
     }
 
     //if( curr_L < min_best_l - 1 ) return; // suppouse that only one hit can be added by extender
-    if (curr_chi2 > TRACK_CHI2_CUT * (curr_L * 2 - 5)) return;
+    if (curr_chi2 > TRACK_CHI2_CUT * (curr_L * 2 - 4.0)) return;
 
     if (fmCBMmode)
       if (curr_chi2 > TRACK_CHI2_CUT * (curr_L * 2 - 5.0)) return;
@@ -2636,10 +2657,10 @@ inline void L1Algo::CAFindTrack(int ista, L1Branch& best_tr, unsigned char& best
       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;
+      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)
@@ -2659,8 +2680,8 @@ inline void L1Algo::CAFindTrack(int ista, L1Branch& best_tr, unsigned char& best
       Cty += new_trip.Cty;
 
       if (fGlobal || fmCBMmode) {
-        if (dty > PickNeighbour * Cty) continue;
-        if (dtx > PickNeighbour * Ctx) continue;
+        if (dty > 6 * Cty) continue;
+        if (dtx > 7 * Ctx) continue;
       }