diff --git a/macro/mcbm/L1_histo.root b/macro/mcbm/L1_histo.root
new file mode 100644
index 0000000000000000000000000000000000000000..474e834bf6bce8a5ce47fb5de84083db57b043fd
Binary files /dev/null and b/macro/mcbm/L1_histo.root differ
diff --git a/macro/mcbm/data/.nfs00000003202cb63f00088db8 b/macro/mcbm/data/.nfs00000003202cb63f00088db8
new file mode 100644
index 0000000000000000000000000000000000000000..9078904f5799fde3dcfc5a9cc7bde3bdb8d545ae
Binary files /dev/null and b/macro/mcbm/data/.nfs00000003202cb63f00088db8 differ
diff --git a/macro/mcbm/data/.nfs00000003202cba1400088de1 b/macro/mcbm/data/.nfs00000003202cba1400088de1
new file mode 100644
index 0000000000000000000000000000000000000000..84a6347e9bd7124f204aefcc93e5018f73e9c281
Binary files /dev/null and b/macro/mcbm/data/.nfs00000003202cba1400088de1 differ
diff --git a/macro/mcbm/mcbm_reco_event.C b/macro/mcbm/mcbm_reco_event.C
index fd9d84ddbb57fbbcd4dfe284ffb0d0e45e1f89ef..bb86becafa7b8c9da81883135737104aa24ba2f4 100644
--- a/macro/mcbm/mcbm_reco_event.C
+++ b/macro/mcbm/mcbm_reco_event.C
@@ -359,7 +359,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
   // ------------------------------------------------------------------------
   // --------   L1 CA Track Finder    ---------------------------------------
 
-  if (setupName == "mcbm_beam_2020_03") {
+  if (strcmp(setupName, "mcbm_beam_2020_03") == 0) {
 
     CbmKF* kalman = new CbmKF();
     run->AddTask(kalman);
@@ -399,7 +399,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
       l1->SetMuchPar(parFile);
 
       TString parFile2 = gSystem->Getenv("VMCWORKDIR");
-      parFile2         = parFile2 + "/parameters/much/much_matbudget_" + geoTag + "_mcbm.root ";
+      parFile2         = parFile2 + "/parameters/much/much_matbudget_" + geoTag + ".root ";
       std::cout << "Using material budget file " << parFile2 << std::endl;
       l1->SetMuchMaterialBudgetFileName(parFile2.Data());
     }
@@ -407,7 +407,7 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
     TString trdGeoTag;
     if (setup->GetGeoTag(ECbmModuleId::kTrd, trdGeoTag)) {
       TString parFile = gSystem->Getenv("VMCWORKDIR");
-      parFile         = parFile + "/parameters/trd/trd_matbudget_" + trdGeoTag + "_mcbm.root";
+      parFile         = parFile + "/parameters/trd/trd_matbudget_" + trdGeoTag + ".root ";
       std::cout << "Using material budget file " << parFile << std::endl;
       l1->SetTrdMaterialBudgetFileName(parFile.Data());
     }
@@ -415,16 +415,16 @@ void mcbm_reco_event(Int_t nEvents = 10, TString dataset = "data/test", const ch
     TString tofGeoTag;
     if (setup->GetGeoTag(ECbmModuleId::kTof, tofGeoTag)) {
       TString parFile = gSystem->Getenv("VMCWORKDIR");
-      parFile         = parFile + "/parameters/tof/tof_matbudget_" + tofGeoTag + "_mcbm.root";
+      parFile         = parFile + "/parameters/tof/tof_matbudget_" + tofGeoTag + ".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);
+    CbmL1GlobalTrackFinder* globalTrackFinder = new CbmL1GlobalTrackFinder();
+    FairTask* globalFindTracks                = new CbmL1GlobalFindTracksEvents(globalTrackFinder);
+    run->AddTask(globalFindTracks);
   }
 
 
diff --git a/reco/L1/CMakeLists.txt b/reco/L1/CMakeLists.txt
index c707cea2e325b5c5013754013d629695f2bd5b50..c183c708432b8c8a68a1e3aae749e95125d87b3f 100644
--- a/reco/L1/CMakeLists.txt
+++ b/reco/L1/CMakeLists.txt
@@ -1,12 +1,12 @@
-# Create a library called "libL1" which includes the source files given in
-# the array .
-# The extension is already found.  Any number of sources could be listed here.
+#Create a library called "libL1" which includes the source files given in
+#the array.
+#The extension is already found.Any number of sources could be listed here.
 
 #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
 
 Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wshadow -Weffc++ -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare -Wno-ignored-qualifiers -Wno-overloaded-virtual")
-# Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything -Wno-padded -Wno-global-constructors")
-# Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast")
+#Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything -Wno-padded -Wno-global-constructors")
+#Set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast")
 
 Set(INCLUDE_DIRECTORIES
 ${CBMROOT_SOURCE_DIR}/reco/base
@@ -53,8 +53,8 @@ Set(SYSTEM_INCLUDE_DIRECTORIES
   ${KFParticle_INCLUDE_DIR}
 )
 
-# For the time being don't use OpenMP on APPLE
-# There are runtime problems with L1 (Redmine #2028)
+#For the time being don't use OpenMP on APPLE
+#There are runtime problems with L1(Redmine #2028)
 if(NOT APPLE)
   if (OPENMP_FOUND)
     set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
@@ -88,13 +88,13 @@ link_directories( ${LINK_DIRECTORIES})
 
 
 set(SRCS
-#L1Algo/L1CATrackFinder.cxx 
-#CbmL1Performance.cxx 
-#CbmL1ReadEvent.cxx 
+#L1Algo / L1CATrackFinder.cxx
+#CbmL1Performance.cxx
+#CbmL1ReadEvent.cxx
 #CbmL1CATrdTrackFinderSA.cxx 
 CbmL1TrdTracklet.cxx 
 CbmL1TrdTracklet4.cxx 
-CbmL1.cxx 
+CbmL1.cxx
 #CbmL1TrdTrackFinderSts.cxx 
 CbmL1TrackMerger.cxx 
 CbmL1TofMerger.cxx
@@ -102,14 +102,16 @@ L1AlgoInputData.cxx
 OffLineInterface/CbmL1RichENNRingFinder.cxx
 OffLineInterface/CbmL1RichENNRingFinderParallel.cxx 
 OffLineInterface/CbmL1StsTrackFinder.cxx 
-#OffLineInterface/CbmL1MuchFinder.cxx 
-#OffLineInterface/CbmL1MuchHit.cxx 
-#OffLineInterface/CbmL1MuchTrack.cxx 
-#OffLineInterface/CbmL1MuchFinderQa.cxx
-OffLineInterface/CbmL1RichRingQa.cxx 
-#OffLineInterface/CbmL1SttHit.cxx 
-#OffLineInterface/CbmL1SttTrackFinder.cxx 
-#OffLineInterface/CbmL1SttTrack.cxx 
+OffLineInterface/CbmL1GlobalTrackFinder.cxx 
+OffLineInterface/CbmL1GlobalFindTracksEvents.cxx
+#OffLineInterface / CbmL1MuchFinder.cxx
+#OffLineInterface / CbmL1MuchHit.cxx
+#OffLineInterface / CbmL1MuchTrack.cxx
+#OffLineInterface / CbmL1MuchFinderQa.cxx
+OffLineInterface/CbmL1RichRingQa.cxx
+#OffLineInterface / CbmL1SttHit.cxx
+#OffLineInterface / CbmL1SttTrackFinder.cxx
+#OffLineInterface / CbmL1SttTrack.cxx 
 
 L1Algo/L1Algo.cxx
 L1Algo/L1CATrackFinder.cxx
@@ -146,25 +148,27 @@ CbmL1TrdHit.h
 CbmL1TrdTracklet4.h
 CbmL1TrdTracklet.h
 CbmL1Vtx.h
-#OffLineInterface/CbmL1MuchFinder.h
-#OffLineInterface/CbmL1MuchFinderQa.h
-#OffLineInterface/CbmL1MuchHit.h
-#OffLineInterface/CbmL1MuchTrack.h
+#OffLineInterface / CbmL1MuchFinder.h
+#OffLineInterface / CbmL1MuchFinderQa.h
+#OffLineInterface / CbmL1MuchHit.h
+#OffLineInterface / CbmL1MuchTrack.h
 OffLineInterface/CbmL1RichENNRingFinder.h
 OffLineInterface/CbmL1RichRingQa.h
 OffLineInterface/CbmL1StsTrackFinder.h
-#OffLineInterface/CbmL1SttHit.h
-#OffLineInterface/CbmL1SttTrackFinder.h
-#OffLineInterface/CbmL1SttTrack.h
-# L1Algo/L1Algo.h
+OffLineInterface/CbmL1GlobalTrackFinder.h
+OffLineInterface/CbmL1GlobalFindTracksEvents.h
+#OffLineInterface / CbmL1SttHit.h
+#OffLineInterface / CbmL1SttTrackFinder.h
+#OffLineInterface / CbmL1SttTrack.h
+#L1Algo / L1Algo.h
 )
 
 
 
 
 If(APPLE)
-  ADD_DEFINITIONS(-Wall -Wsign-promo -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wno-parentheses -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) #   -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root. 
-  #---Check for compiler flags
+  ADD_DEFINITIONS(-Wall -Wsign-promo -Wctor-dtor-privacy -Wreorder -Wno-deprecated -Wno-parentheses -DDO_TPCCATRACKER_EFF_PERFORMANCE -DNonhomogeneousField -DCBM -DUSE_TIMERS) #   -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual -Wold-style-cast : wait for other parts of cbmroot\root.
+#-- - Check for compiler flags
   CHECK_CXX_COMPILER_FLAG("-Wno-pmf-conversions" HAS_PMF)
   If(HAS_PMF)
     ADD_DEFINITIONS(-Wno-pmf-conversions)
@@ -201,8 +205,9 @@ set(LINKDEF L1LinkDef.h)
 Set(LIBRARY_NAME L1)
 if (OPENMP_FOUND AND APPLE)
   Set(DEPENDENCIES
-    KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex ${OpenMP_CXX_LIBRARIES}
-#   KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex omp
+    KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex ${
+  OpenMP_CXX_LIBRARIES}
+#KF CbmMuchBase CbmTrdBase CbmStsBase CbmRecoBase CbmBase CbmData CbmRecoSts Base boost_regex omp
   )
 else()
   Set(DEPENDENCIES
@@ -217,11 +222,11 @@ Install(FILES CbmL1Counters.h
         DESTINATION include
        )
 
-# Test to check if OpenMP is working on APPLE
+#Test to check if OpenMP is working on APPLE
 #set(EXE_NAME test_openmp)
 #set(SRCS test.cxx)
 #set(DEPENDENCIES
-#  ${DEPENDENCIES}
-#  omp
+#${DEPENDENCIES }
+#omp
 #)
 #GENERATE_EXECUTABLE()
diff --git a/reco/L1/L1LinkDef.h b/reco/L1/L1LinkDef.h
index abe909176247ac1f263b2d4fbcd3d922b8f3ef39..6e056b29a76d0bb2d293b21d07f4d6549e4dd958 100644
--- a/reco/L1/L1LinkDef.h
+++ b/reco/L1/L1LinkDef.h
@@ -23,6 +23,8 @@
 #pragma link C++ class CbmL1RichRingQa + ;
 #pragma link C++ class CbmL1TrdTracklet + ;
 #pragma link C++ class CbmL1TrdTracklet4 + ;
+#pragma link C++ class CbmL1GlobalTrackFinder + ;
+#pragma link C++ class CbmL1GlobalFindTracksEvents + ;
 //#pragma link C++ class  CbmL1CATrdTrackFinderSA+;
 //#pragma link C++ class  CbmL1SttHit+;
 //#pragma link C++ class  CbmL1SttTrackFinder+;
diff --git a/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.cxx b/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..fad8be06884c45f57eb5d994d17516114148408a
--- /dev/null
+++ b/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.cxx
@@ -0,0 +1,237 @@
+/** @file CbmGlobalFindTracksEvent.cxx
+ ** @author V. Akishina <v.akishina@gsi.de>
+ ** based on CbmStsFindTracksEvent.cxx by Volker Friese <v.friese@gsi.de>
+ ** @since 07.05.2021
+ ** @date 07.05.2021
+ **/
+
+
+// Includes from STS
+#include "CbmGlobalFindTracksEvents.h"
+
+#include "CbmEvent.h"
+#include "CbmL1GlobalTrackFinder.h"
+#include "CbmStsHit.h"
+#include "CbmStsTrack.h"
+#include "CbmStsTrackFinderIdeal.h"
+
+#include <cassert>
+
+// Includes from base
+#include "FairField.h"
+#include "FairRootManager.h"
+#include "FairRunAna.h"
+#include "FairRuntimeDb.h"
+#include <Logger.h>
+
+// Includes from ROOT
+#include "TClonesArray.h"
+
+// Includes from C++
+#include <iomanip>
+#include <iostream>
+
+using std::cout;
+using std::endl;
+using std::fixed;
+using std::left;
+using std::pair;
+using std::right;
+using std::setprecision;
+using std::setw;
+using std::stringstream;
+
+// -----   Standard constructor   ------------------------------------------
+CbmGlobalFindTracksEvents::CbmGlobalFindTracksEvents(CbmL1GlobalTrackFinder* finder, Bool_t useMvd)
+  : FairTask("GlobalFindTracksEvents")
+  , fUseMvd(useMvd)
+  , fFinder(finder)
+  , fEvents(NULL)
+  , fMvdHits(NULL)
+  , fStsHits(NULL)
+  , fGlobalTracks(NULL)
+  , fStsTrackArray(NULL)
+  , fMuchTrackArray(NULL)
+  , fTrdTrackArray(NULL)
+  , fTofTrackArray(NULL)
+  , fTimer()
+  , fNofEvents(0)
+  , fNofHits(0.)
+  , fNofTracks(0.)
+  , fTime(0.)
+{
+  if (!finder) fFinder = new CbmL1GlobalTrackFinder();
+}
+// -------------------------------------------------------------------------
+
+
+// -----   Destructor   ----------------------------------------------------
+CbmGlobalFindTracksEvents::~CbmGlobalFindTracksEvents()
+{
+  fGlobalTracks->Delete();
+  if (fFinder) delete fFinder;
+}
+// -------------------------------------------------------------------------
+
+
+// -----   Task execution   ------------------------------------------------
+void CbmGlobalFindTracksEvents::Exec(Option_t* /*opt*/)
+{
+
+  // --- Local variables
+  Long64_t nEvents = 0;
+  Long64_t nHits   = 0;
+  Long64_t nTracks = 0;
+  pair<UInt_t, UInt_t> result;
+  TStopwatch timer;
+  timer.Start();
+
+  // --- Clear output array
+  fGlobalTracks->Delete();
+
+  // --- Event loop (from event objects)
+  if (fEvents) {
+    nEvents = fEvents->GetEntriesFast();
+    LOG(debug) << GetName() << ": reading time slice with " << nEvents << " events ";
+    for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
+      CbmEvent* event = static_cast<CbmEvent*>(fEvents->At(iEvent));
+      result          = ProcessEvent(event);
+      nHits += result.first;
+      nTracks += result.second;
+    }  //# events
+  }    //? event branch present
+
+  else {  // Timeslice reconstruction without events
+    ProcessEvent(nullptr);
+    nHits   = result.first;
+    nTracks = result.second;
+  }
+
+  // --- Timeslice log and statistics
+  timer.Stop();
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNofTs;
+  if (fEvents) logOut << ", events " << nEvents;
+  logOut << ", hits " << nHits << ", tracks " << nTracks;
+  LOG(info) << logOut.str();
+  fNofTs++;
+  fNofEvents += nEvents;
+  fNofHits += nHits;
+  fNofTracks += nTracks;
+  fTime += timer.RealTime();
+}
+// -------------------------------------------------------------------------
+
+
+// -----   Initialisation   ------------------------------------------------
+InitStatus CbmGlobalFindTracksEvents::Init()
+{
+
+  LOG(info) << "=====================================";
+  LOG(info) << GetName() << ": initialising";
+
+  // I/O manager
+  FairRootManager* ioman = FairRootManager::Instance();
+  assert(ioman);
+
+  // --- Get input array (Events)
+  fEvents = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent"));
+  if (nullptr == fEvents) { LOG(warn) << GetName() << ": No event array! Will process entire tree."; }
+
+  // --- Get input array (StsHits)
+  fStsHits = (TClonesArray*) ioman->GetObject("StsHit");
+  assert(fStsHits);
+
+  // Array of MvdHits
+  if (fUseMvd) {
+    fMvdHits = (TClonesArray*) ioman->GetObject("MvdHit");
+    if (fMvdHits == nullptr) {
+      LOG(error) << GetName() << ": Use of MVD hits selected, but no hit branch present! "
+                 << "Tracking will be done without MVD hits.";
+    }
+    else
+      LOG(info) << GetName() << ": including MVD hits in tracking";
+  }
+
+  // Create and register output array for StsTracks
+  fGlobalTracks = new TClonesArray("CbmGlobalTrack", 100);
+  ioman->Register("GlobalTrack", "Global", fGlobalTracks, IsOutputBranchPersistent("GlobalTrack"));
+  fStsTrackArray = new TClonesArray("CbmStsTrack", 100);
+  ioman->Register("StsTrack", "STS", fStsTrackArray, IsOutputBranchPersistent("StsTrack"));
+  fMuchTrackArray = new TClonesArray("CbmMuchTrack", 100);
+  ioman->Register("MuchTrack", "MUCH", fMuchTrackArray, IsOutputBranchPersistent("MuchTrack"));
+  fTrdTrackArray = new TClonesArray("CbmTrdTrack", 100);
+  ioman->Register("TrdTrack", "TRD", fTrdTrackArray, IsOutputBranchPersistent("TrdTrack"));
+  fTofTrackArray = new TClonesArray("CbmTofTrack", 100);
+  ioman->Register("TofTrack", "TOF", fTofTrackArray, IsOutputBranchPersistent("TofTrack"));
+
+  // Check for Track finder
+  if (!fFinder) {
+    LOG(fatal) << GetName() << ": no track finding engine selected!";
+    return kERROR;
+  }
+  LOG(info) << GetName() << ": Use track finder " << fFinder->GetName();
+
+  // Set members of track finder and initialise it
+  fFinder->SetMvdHitArray(fMvdHits);
+  fFinder->SetStsHitArray(fStsHits);
+  fFinder->SetGlobalTracksArray(fGlobalTracks);
+  fFinder->SetStsTracksArray(fStsTrackArray);
+  fFinder->SetMuchTracksArray(fMuchTrackArray);
+  fFinder->SetTrdTracksArray(fTrdTrackArray);
+  fFinder->SetTofTracksArray(fTofTrackArray);
+  fFinder->Init();
+
+  // Screen output
+  LOG(info) << GetName() << ": successfully initialised.";
+  LOG(info) << "=====================================\n";
+
+  return kSUCCESS;
+}
+// -------------------------------------------------------------------------
+
+
+// -----   End-of-run action   ---------------------------------------------
+void CbmGlobalFindTracksEvents::Finish()
+{
+  std::cout << std::endl;
+  LOG(info) << "=====================================";
+  LOG(info) << GetName() << ": Run summary";
+  LOG(info) << "Time slices      : " << fNofTs;
+  LOG(info) << "Hits   / TS      : " << fixed << setprecision(2) << Double_t(fNofHits) / Double_t(fNofTs);
+  LOG(info) << "Tracks / TS      : " << fixed << setprecision(2) << Double_t(fNofTracks) / Double_t(fNofTs);
+  LOG(info) << "Hits per track   : " << fNofHits / fNofTracks;
+  LOG(info) << "Time per TS      : " << 1000. * fTime / Double_t(fNofTs) << " ms ";
+  if (fEvents) {
+    LOG(info) << "Events processed : " << fNofEvents;
+    LOG(info) << "Hits / event     : " << fNofHits / Double_t(fNofEvents);
+    LOG(info) << "Tracks / event   : " << fNofTracks / Double_t(fNofEvents);
+  }
+  LOG(info) << "=====================================";
+}
+// -------------------------------------------------------------------------
+
+
+// ------   Process one event   --------------------------------------------
+pair<UInt_t, UInt_t> CbmGlobalFindTracksEvents::ProcessEvent(CbmEvent* event)
+{
+
+  // --- Call track finder
+  fTimer.Start();
+  Int_t nTracks = fFinder->FindTracks(event);
+  fTimer.Stop();
+
+  // --- Event log
+  Int_t eventNumber = (event ? event->GetNumber() : fNofEvents);
+  Int_t nHits       = (event ? event->GetNofData(ECbmDataType::kStsHit) : fStsHits->GetEntriesFast());
+  LOG(debug) << "+ " << setw(20) << GetName() << ": Event " << setw(6) << right << eventNumber << ", real time "
+             << fixed << setprecision(6) << fTimer.RealTime() << " s, hits: " << nHits << ", tracks: " << nTracks;
+
+  return std::make_pair(nHits, nTracks);
+}
+// -------------------------------------------------------------------------
+
+
+ClassImp(CbmGlobalFindTracksEvents)
diff --git a/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.h b/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.h
new file mode 100644
index 0000000000000000000000000000000000000000..399c6138d11f2791a2c55a4106c697397860dcfc
--- /dev/null
+++ b/reco/L1/OffLineInterface/CbmGlobalFindTracksEvents.h
@@ -0,0 +1,118 @@
+/** @file CbmGlobalFindTracksEvent.h
+ ** @author V. Akishina <v.akishina@gsi.de>
+ ** based on CbmStsFindTracksEvent.h by Volker Friese <v.friese@gsi.de>
+ ** @since 07.05.2021
+ ** @date 07.05.2021
+ **/
+
+#ifndef CBMGLOBALFINDTRACKSEVENTS
+#define CBMGLOBALFINDTRACKSEVENTS 1
+
+
+#include "CbmL1GlobalTrackFinder.h"
+
+#include "FairTask.h"
+
+#include "TStopwatch.h"
+
+
+class TClonesArray;
+class CbmEvent;
+class CbmStsTrackFinderIdeal;
+
+
+/** @class CbmGlobalFindTracksEvents
+ ** @brief Task class for finding Global, STS, MUCH, TRD and TOF tracks in an event
+ ** @author V. Akishina <v.akishina@gsi.de>
+ ** based on CbmStsFindTracksEvent.h by Volker Friese <v.friese@gsi.de>
+ ** @since 07.05.2021
+ ** @date 07.05.2021
+ ** @version 1.0
+ **
+ ** This task creates GlobalTrack, StsTrack, MuchTrack, TrdTrack, TofTrack objects 
+ ** from hits.
+ ** It uses as finding engine CbmL1GlobalTrackFinder.
+ **/
+class CbmGlobalFindTracksEvents : public FairTask {
+
+public:
+  /** Constructor
+   ** @param finder  Track finder engine. Default: Ideal track finder.
+   ** @param useMvd  Include MVD hits in track finding. Default kFALSE.
+   **/
+  CbmGlobalFindTracksEvents(CbmL1GlobalTrackFinder* finder = NULL, Bool_t useMvd = kFALSE);
+
+
+  /** Destructor **/
+  virtual ~CbmGlobalFindTracksEvents();
+
+
+  /** Task execution **/
+  virtual void Exec(Option_t* opt);
+
+
+  /** Track finder engine
+   ** @value  Pointer to track finding engine
+   **/
+  CbmL1GlobalTrackFinder* GetFinder() { return fFinder; };
+
+
+  /** Usage of MVD hits
+   ** @value  kTRUE if MVD hits are used for tracking
+   **/
+  Bool_t IsMvdUsed() const { return fUseMvd; }
+
+
+  /** Set track finding engine
+   ** @param finder  Pointer to track finding engine
+   **/
+  void UseFinder(CbmL1GlobalTrackFinder* finder)
+  {
+    if (fFinder) delete fFinder;
+    fFinder = finder;
+  };
+
+
+private:
+  Bool_t fUseMvd;                   //  Inclusion of MVD hits
+  CbmL1GlobalTrackFinder* fFinder;  //  TrackFinder concrete class
+  TClonesArray* fEvents;            //! Array of CbmEvent objects
+  TClonesArray* fMvdHits;           //! Input array of MVD hits
+  TClonesArray* fStsHits;           //! Input array of STS hits
+  TClonesArray* fGlobalTracks;      //! Output array of CbmGlobalTracks
+  TClonesArray* fStsTrackArray;     //! Output array of CbmStsTracks
+  TClonesArray* fMuchTrackArray;    //! Output array of CbmMuchTracks
+  TClonesArray* fTrdTrackArray;     //! Output array of CbmTrdTracks
+  TClonesArray* fTofTrackArray;     //! Output array of CbmTofTracks
+  TStopwatch fTimer;                //! Timer
+  Int_t fNofTs = 0;                 ///< Number of processed timeslices
+  Int_t fNofEvents;                 ///< Number of events with success
+  Double_t fNofHits;                ///< Number of hits
+  Double_t fNofTracks;              ///< Number of tracks created
+  Double_t fTime;                   ///< Total real time used for good events
+
+
+  /** Initialisation at beginning of each event **/
+  virtual InitStatus Init();
+
+
+  /** Finish at the end of each event **/
+  virtual void Finish();
+
+
+  /** @brief Process one event or timeslice
+   ** @param event Pointer to event object. If null, entire timeslice is processed.
+   ** @return Number of input hits and output tracks
+   **/
+  std::pair<UInt_t, UInt_t> ProcessEvent(CbmEvent* event);
+
+
+  /** Prevent usage of copy constructor and assignment operator **/
+  CbmGlobalFindTracksEvents(const CbmGlobalFindTracksEvents&);
+  CbmGlobalFindTracksEvents operator=(const CbmGlobalFindTracksEvents&);
+
+
+  ClassDef(CbmGlobalFindTracksEvents, 1);
+};
+
+#endif
diff --git a/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.cxx b/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..c3c868ccbc5f0c9c9332fa5bdddd9fe596ee5e15
--- /dev/null
+++ b/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.cxx
@@ -0,0 +1,246 @@
+/** @file CbmL1GlobalFindTracksEvent.cxx
+ ** @author V. Akishina <v.akishina@gsi.de>
+ ** based on CbmStsFindTracksEvent.cxx by Volker Friese <v.friese@gsi.de>
+ ** @since 07.05.2021
+ ** @date 07.05.2021
+ **/
+
+
+// Includes from STS
+#include "CbmL1GlobalFindTracksEvents.h"
+
+#include "CbmEvent.h"
+#include "CbmL1GlobalTrackFinder.h"
+#include "CbmStsHit.h"
+#include "CbmStsTrack.h"
+#include "CbmStsTrackFinderIdeal.h"
+
+#include <cassert>
+
+// Includes from base
+#include "FairField.h"
+#include "FairRootManager.h"
+#include "FairRunAna.h"
+#include "FairRuntimeDb.h"
+#include <Logger.h>
+
+// Includes from ROOT
+#include "TClonesArray.h"
+
+// Includes from C++
+#include <iomanip>
+#include <iostream>
+
+using std::cout;
+using std::endl;
+using std::fixed;
+using std::left;
+using std::pair;
+using std::right;
+using std::setprecision;
+using std::setw;
+using std::stringstream;
+
+// -----   Standard constructor   ------------------------------------------
+CbmL1GlobalFindTracksEvents::CbmL1GlobalFindTracksEvents(CbmL1GlobalTrackFinder* finder, Bool_t useMvd)
+  : FairTask("GlobalFindTracksEvents")
+  , fUseMvd(useMvd)
+  , fFinder(finder)
+  , fEvents(NULL)
+  , fMvdHits(NULL)
+  , fStsHits(NULL)
+  , fGlobalTracks(NULL)
+  , fStsTrackArray(NULL)
+  , fMuchTrackArray(NULL)
+  , fTrdTrackArray(NULL)
+  , fTofTrackArray(NULL)
+  , fTimer()
+  , fNofEvents(0)
+  , fNofHits(0.)
+  , fNofTracks(0.)
+  , fTime(0.)
+{
+  if (!finder) fFinder = new CbmL1GlobalTrackFinder();
+}
+// -------------------------------------------------------------------------
+
+
+// -----   Destructor   ----------------------------------------------------
+CbmL1GlobalFindTracksEvents::~CbmL1GlobalFindTracksEvents()
+{
+  fGlobalTracks->Delete();
+  fStsTrackArray->Delete();
+  fMuchTrackArray->Delete();
+  fTrdTrackArray->Delete();
+  fTofTrackArray->Delete();
+  if (fFinder) delete fFinder;
+}
+// -------------------------------------------------------------------------
+
+
+// -----   Task execution   ------------------------------------------------
+void CbmL1GlobalFindTracksEvents::Exec(Option_t* /*opt*/)
+{
+
+  // --- Local variables
+  Long64_t nEvents = 0;
+  Long64_t nHits   = 0;
+  Long64_t nTracks = 0;
+  pair<UInt_t, UInt_t> result;
+  TStopwatch timer;
+  timer.Start();
+
+  // --- Clear output array
+  fGlobalTracks->Delete();
+  fStsTrackArray->Delete();
+  fMuchTrackArray->Delete();
+  fTrdTrackArray->Delete();
+  fTofTrackArray->Delete();
+
+
+  // --- Event loop (from event objects)
+  if (fEvents) {
+    nEvents = fEvents->GetEntriesFast();
+    LOG(debug) << GetName() << ": reading time slice with " << nEvents << " events ";
+    for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
+      CbmEvent* event = static_cast<CbmEvent*>(fEvents->At(iEvent));
+      result          = ProcessEvent(event);
+      nHits += result.first;
+      nTracks += result.second;
+    }  //# events
+  }    //? event branch present
+
+  else {  // Timeslice reconstruction without events
+    ProcessEvent(nullptr);
+    nHits   = result.first;
+    nTracks = result.second;
+  }
+
+  // --- Timeslice log and statistics
+  timer.Stop();
+  stringstream logOut;
+  logOut << setw(20) << left << GetName() << " [";
+  logOut << fixed << setw(8) << setprecision(1) << right << timer.RealTime() * 1000. << " ms] ";
+  logOut << "TS " << fNofTs;
+  if (fEvents) logOut << ", events " << nEvents;
+  logOut << ", hits " << nHits << ", tracks " << nTracks;
+  LOG(info) << logOut.str();
+  fNofTs++;
+  fNofEvents += nEvents;
+  fNofHits += nHits;
+  fNofTracks += nTracks;
+  fTime += timer.RealTime();
+}
+// -------------------------------------------------------------------------
+
+
+// -----   Initialisation   ------------------------------------------------
+InitStatus CbmL1GlobalFindTracksEvents::Init()
+{
+
+  LOG(info) << "=====================================";
+  LOG(info) << GetName() << ": initialising";
+
+  // I/O manager
+  FairRootManager* ioman = FairRootManager::Instance();
+  assert(ioman);
+
+  // --- Get input array (Events)
+  fEvents = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent"));
+  if (nullptr == fEvents) { LOG(warn) << GetName() << ": No event array! Will process entire tree."; }
+
+  // --- Get input array (StsHits)
+  fStsHits = (TClonesArray*) ioman->GetObject("StsHit");
+  assert(fStsHits);
+
+  // Array of MvdHits
+  if (fUseMvd) {
+    fMvdHits = (TClonesArray*) ioman->GetObject("MvdHit");
+    if (fMvdHits == nullptr) {
+      LOG(error) << GetName() << ": Use of MVD hits selected, but no hit branch present! "
+                 << "Tracking will be done without MVD hits.";
+    }
+    else
+      LOG(info) << GetName() << ": including MVD hits in tracking";
+  }
+
+  // Create and register output array for StsTracks
+  fGlobalTracks = new TClonesArray("CbmGlobalTrack", 100);
+  ioman->Register("GlobalTrack", "Global", fGlobalTracks, IsOutputBranchPersistent("GlobalTrack"));
+  fStsTrackArray = new TClonesArray("CbmStsTrack", 100);
+  ioman->Register("StsTrack", "STS", fStsTrackArray, IsOutputBranchPersistent("StsTrack"));
+  fMuchTrackArray = new TClonesArray("CbmMuchTrack", 100);
+  ioman->Register("MuchTrack", "MUCH", fMuchTrackArray, IsOutputBranchPersistent("MuchTrack"));
+  fTrdTrackArray = new TClonesArray("CbmTrdTrack", 100);
+  ioman->Register("TrdTrack", "TRD", fTrdTrackArray, IsOutputBranchPersistent("TrdTrack"));
+  fTofTrackArray = new TClonesArray("CbmTofTrack", 100);
+  ioman->Register("TofTrack", "TOF", fTofTrackArray, IsOutputBranchPersistent("TofTrack"));
+
+  // Check for Track finder
+  if (!fFinder) {
+    LOG(fatal) << GetName() << ": no track finding engine selected!";
+    return kERROR;
+  }
+  LOG(info) << GetName() << ": Use track finder " << fFinder->GetName();
+
+  // Set members of track finder and initialise it
+  fFinder->SetMvdHitArray(fMvdHits);
+  fFinder->SetStsHitArray(fStsHits);
+  fFinder->SetGlobalTracksArray(fGlobalTracks);
+  fFinder->SetStsTracksArray(fStsTrackArray);
+  fFinder->SetMuchTracksArray(fMuchTrackArray);
+  fFinder->SetTrdTracksArray(fTrdTrackArray);
+  fFinder->SetTofTracksArray(fTofTrackArray);
+  fFinder->Init();
+
+  // Screen output
+  LOG(info) << GetName() << ": successfully initialised.";
+  LOG(info) << "=====================================\n";
+
+  return kSUCCESS;
+}
+// -------------------------------------------------------------------------
+
+
+// -----   End-of-run action   ---------------------------------------------
+void CbmL1GlobalFindTracksEvents::Finish()
+{
+  std::cout << std::endl;
+  LOG(info) << "=====================================";
+  LOG(info) << GetName() << ": Run summary";
+  LOG(info) << "Time slices      : " << fNofTs;
+  LOG(info) << "Hits   / TS      : " << fixed << setprecision(2) << Double_t(fNofHits) / Double_t(fNofTs);
+  LOG(info) << "Tracks / TS      : " << fixed << setprecision(2) << Double_t(fNofTracks) / Double_t(fNofTs);
+  LOG(info) << "Hits per track   : " << fNofHits / fNofTracks;
+  LOG(info) << "Time per TS      : " << 1000. * fTime / Double_t(fNofTs) << " ms ";
+  if (fEvents) {
+    LOG(info) << "Events processed : " << fNofEvents;
+    LOG(info) << "Hits / event     : " << fNofHits / Double_t(fNofEvents);
+    LOG(info) << "Tracks / event   : " << fNofTracks / Double_t(fNofEvents);
+  }
+  LOG(info) << "=====================================";
+}
+// -------------------------------------------------------------------------
+
+
+// ------   Process one event   --------------------------------------------
+pair<UInt_t, UInt_t> CbmL1GlobalFindTracksEvents::ProcessEvent(CbmEvent* event)
+{
+
+  // --- Call track finder
+  fTimer.Start();
+  Int_t nTracks = fFinder->FindTracks(event);
+  fTimer.Stop();
+
+  // --- Event log
+  Int_t eventNumber = (event ? event->GetNumber() : fNofEvents);
+  Int_t nHits       = (event ? event->GetNofData(ECbmDataType::kStsHit) : fStsHits->GetEntriesFast());
+  LOG(debug) << "+ " << setw(20) << GetName() << ": Event " << setw(6) << right << eventNumber << ", real time "
+             << fixed << setprecision(6) << fTimer.RealTime() << " s, hits: " << nHits << ", tracks: " << nTracks;
+
+  return std::make_pair(nHits, nTracks);
+}
+// -------------------------------------------------------------------------
+
+
+ClassImp(CbmL1GlobalFindTracksEvents)
diff --git a/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.h b/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.h
new file mode 100644
index 0000000000000000000000000000000000000000..1d2f602529991868fc25175b4ceb694b792a2dc4
--- /dev/null
+++ b/reco/L1/OffLineInterface/CbmL1GlobalFindTracksEvents.h
@@ -0,0 +1,118 @@
+/** @file CbmL1GlobalFindTracksEvent.h
+ ** @author V. Akishina <v.akishina@gsi.de>
+ ** based on CbmStsFindTracksEvent.h by Volker Friese <v.friese@gsi.de>
+ ** @since 07.05.2021
+ ** @date 07.05.2021
+ **/
+
+#ifndef CbmL1GlobalFindTracksEventS
+#define CbmL1GlobalFindTracksEventS 1
+
+
+#include "CbmL1GlobalTrackFinder.h"
+
+#include "FairTask.h"
+
+#include "TStopwatch.h"
+
+
+class TClonesArray;
+class CbmEvent;
+class CbmStsTrackFinderIdeal;
+
+
+/** @class CbmL1GlobalFindTracksEvents
+ ** @brief Task class for finding Global, STS, MUCH, TRD and TOF tracks in an event
+ ** @author V. Akishina <v.akishina@gsi.de>
+ ** based on CbmStsFindTracksEvent.h by Volker Friese <v.friese@gsi.de>
+ ** @since 07.05.2021
+ ** @date 07.05.2021
+ ** @version 1.0
+ **
+ ** This task creates GlobalTrack, StsTrack, MuchTrack, TrdTrack, TofTrack objects 
+ ** from hits.
+ ** It uses as finding engine CbmL1GlobalTrackFinder.
+ **/
+class CbmL1GlobalFindTracksEvents : public FairTask {
+
+public:
+  /** Constructor
+   ** @param finder  Track finder engine. Default: Ideal track finder.
+   ** @param useMvd  Include MVD hits in track finding. Default kFALSE.
+   **/
+  CbmL1GlobalFindTracksEvents(CbmL1GlobalTrackFinder* finder = NULL, Bool_t useMvd = kFALSE);
+
+
+  /** Destructor **/
+  virtual ~CbmL1GlobalFindTracksEvents();
+
+
+  /** Task execution **/
+  virtual void Exec(Option_t* opt);
+
+
+  /** Track finder engine
+   ** @value  Pointer to track finding engine
+   **/
+  CbmL1GlobalTrackFinder* GetFinder() { return fFinder; };
+
+
+  /** Usage of MVD hits
+   ** @value  kTRUE if MVD hits are used for tracking
+   **/
+  Bool_t IsMvdUsed() const { return fUseMvd; }
+
+
+  /** Set track finding engine
+   ** @param finder  Pointer to track finding engine
+   **/
+  void UseFinder(CbmL1GlobalTrackFinder* finder)
+  {
+    if (fFinder) delete fFinder;
+    fFinder = finder;
+  };
+
+
+private:
+  Bool_t fUseMvd;                   //  Inclusion of MVD hits
+  CbmL1GlobalTrackFinder* fFinder;  //  TrackFinder concrete class
+  TClonesArray* fEvents;            //! Array of CbmEvent objects
+  TClonesArray* fMvdHits;           //! Input array of MVD hits
+  TClonesArray* fStsHits;           //! Input array of STS hits
+  TClonesArray* fGlobalTracks;      //! Output array of CbmGlobalTracks
+  TClonesArray* fStsTrackArray;     //! Output array of CbmStsTracks
+  TClonesArray* fMuchTrackArray;    //! Output array of CbmMuchTracks
+  TClonesArray* fTrdTrackArray;     //! Output array of CbmTrdTracks
+  TClonesArray* fTofTrackArray;     //! Output array of CbmTofTracks
+  TStopwatch fTimer;                //! Timer
+  Int_t fNofTs = 0;                 ///< Number of processed timeslices
+  Int_t fNofEvents;                 ///< Number of events with success
+  Double_t fNofHits;                ///< Number of hits
+  Double_t fNofTracks;              ///< Number of tracks created
+  Double_t fTime;                   ///< Total real time used for good events
+
+
+  /** Initialisation at beginning of each event **/
+  virtual InitStatus Init();
+
+
+  /** Finish at the end of each event **/
+  virtual void Finish();
+
+
+  /** @brief Process one event or timeslice
+   ** @param event Pointer to event object. If null, entire timeslice is processed.
+   ** @return Number of input hits and output tracks
+   **/
+  std::pair<UInt_t, UInt_t> ProcessEvent(CbmEvent* event);
+
+
+  /** Prevent usage of copy constructor and assignment operator **/
+  CbmL1GlobalFindTracksEvents(const CbmL1GlobalFindTracksEvents&);
+  CbmL1GlobalFindTracksEvents operator=(const CbmL1GlobalFindTracksEvents&);
+
+
+  ClassDef(CbmL1GlobalFindTracksEvents, 1);
+};
+
+#endif
diff --git a/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx b/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx
index 548f22afe916e20c0846e02c3c5f0063dd335aa5..89b2463c2cc31b9e1e7137b2fe6e3b148ba6f767 100644
--- a/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx
+++ b/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.cxx
@@ -1,3 +1,4 @@
+
 /* Copyright (C) 2019-2020 IKF-UFra, GSI
    SPDX-License-Identifier: GPL-3.0-only
    Authors: Valentina Akishina [committer] */
@@ -5,11 +6,11 @@
 /*
  *====================================================================
  *
- *  CBM Level 1 Reconstruction
- *
+ *  CBM Level 1 Reconstruction 
+ *  
  *  Authors: V. Akishina
  *
- *  e-mail : v.akishina@gsi.de
+ *  e-mail : v.akishina@gsi.de 
  *
  *====================================================================
  *
@@ -20,15 +21,21 @@
 #include "CbmL1GlobalTrackFinder.h"
 
 #include "CbmEvent.h"
+#include "CbmGlobalTrack.h"
 #include "CbmKFMath.h"
+#include "CbmMuchTrack.h"
 #include "CbmStsHit.h"
 #include "CbmStsTrack.h"
+#include "CbmTofTrack.h"
+#include "CbmTrack.h"
+#include "CbmTrdTrack.h"
 
 #include "FairHit.h"
 #include "FairMCPoint.h"
 #include "FairRootManager.h"
 
 #include "TClonesArray.h"
+#include "TDatabasePDG.h"
 
 #include <iostream>
 #include <vector>
@@ -43,8 +50,11 @@ ClassImp(CbmL1GlobalTrackFinder)
 
   // -----   Default constructor   -------------------------------------------
   CbmL1GlobalTrackFinder::CbmL1GlobalTrackFinder()
-  : FairTask("CbmL1GlobalTrackFinder")
-  , fEventNo(0)
+  : fGlobalTracks(nullptr)
+  , fStsTracks(nullptr)
+  , fMuchTracks(nullptr)
+  , fTrdTracks(nullptr)
+  , fTofTracks(nullptr)
 {
   fName = "Global Track Finder L1";
 }
@@ -56,313 +66,238 @@ CbmL1GlobalTrackFinder::~CbmL1GlobalTrackFinder() {}
 // -------------------------------------------------------------------------
 
 // -----   Public method Init   --------------------------------------------
-InitStatus CbmL1GlobalTrackFinder::Init()
-{
-
-  FairRootManager* ioman = FairRootManager::Instance();
+void CbmL1GlobalTrackFinder::Init() {}
+// -------------------------------------------------------------------------
 
-  // Create and register track arrays
-  fGlobalTracks = new TClonesArray("CbmGlobalTrack", 100);
-  ioman->Register("GlobalTrack", "Global", fGlobalTracks, "GlobalTrack");
 
-  {
-    fMuchTracks = new TClonesArray("CbmMuchTrack", 100);
-    ioman->Register("MuchTrack", "Much", fMuchTracks, "MuchTrack");
-  }
+// -----   Copy tracks to output array   -----------------------------------
+Int_t CbmL1GlobalTrackFinder::CopyL1Tracks(CbmEvent* event)
+{
+  CbmL1* L1 = CbmL1::Instance();
+  if (!L1) return 0;
+  Int_t globalTrackIndex = fGlobalTracks->GetEntriesFast();
 
-  {
-    fTrdTracks = new TClonesArray("CbmTrdTrack", 100);
-    ioman->Register("TrdTrack", "Trd", fTrdTracks, "TrdTrack");
-  }
+  Int_t stsTrackIndex  = fStsTracks->GetEntriesFast();
+  Int_t muchTrackIndex = fMuchTracks->GetEntriesFast();
+  Int_t trdTrackIndex  = fTrdTracks->GetEntriesFast();
+  Int_t tofTrackIndex  = fTofTracks->GetEntriesFast();
 
-  {
-    fTofTracks = new TClonesArray("CbmTofTrack", 100);
-    ioman->Register("TofTrack", "Tof", fTofTracks, "TofTrack");
-  }
+  LOG(debug) << "Copy L1 tracks : " << L1->vRTracks.size() << " tracks in L1";
 
-  fEvents = dynamic_cast<TClonesArray*>(ioman->GetObject("CbmEvent"));
+  for (vector<CbmL1Track>::iterator it = L1->vRTracks.begin(); it != L1->vRTracks.end(); ++it) {
+    CbmL1Track& T = *it;
+    //BEGIN add global track
+    new ((*fGlobalTracks)[globalTrackIndex]) CbmGlobalTrack();
+    if (event) event->AddData(ECbmDataType::kGlobalTrack, globalTrackIndex);
+    CbmGlobalTrack* t = L1_DYNAMIC_CAST<CbmGlobalTrack*>(fGlobalTracks->At(globalTrackIndex++));
+    t->SetFlag(0);
+    FairTrackParam fpar(*t->GetParamFirst()), lpar(*t->GetParamLast());
+    CbmKFMath::CopyTC2TrackParam(&fpar, T.T, T.C);
+    CbmKFMath::CopyTC2TrackParam(&lpar, T.TLast, T.CLast);
+    t->SetParamFirst(&fpar);
+    t->SetParamLast(&lpar);
+    //  t->SetChiSq(T.chi2);
+    t->SetNDF(T.NDF);
+    t->SetPidHypo(T.T[4] >= 0 ? 211 : -211);
+    //     t->SetTime(T.Tpv[6]);
+    //     t->SetTimeError(T.Cpv[20]);
+    //END add global track
+    //BEGIN create detector tracks if needed
+    bool hasStsHits  = false;
+    bool hasMuchHits = false;
+    bool hasTrdHits  = false;
+    bool hasTofHits  = false;
+    for (vector<int>::iterator ih = it->StsHits.begin(); ih != it->StsHits.end(); ++ih) {
+      CbmL1HitStore& h = L1->vHitStore[*ih];
 
-  LOG(info) << fEvents << " fEvents ";
+      if (h.Det == 1 && hasStsHits == false) {
+        hasStsHits         = true;
+        CbmStsTrack* track = new ((*fStsTracks)[stsTrackIndex]) CbmStsTrack();
+        t->SetStsTrackIndex(stsTrackIndex);
+        if (event) event->AddData(ECbmDataType::kStsTrack, stsTrackIndex);
+        CbmL1TrackToCbmStsTrack(T, track, h.Det);
+        stsTrackIndex++;
+      }
+      if (h.Det == 2 && hasMuchHits == false) {
+        hasMuchHits = true;
+
+        CbmMuchTrack* track = new ((*fMuchTracks)[muchTrackIndex]) CbmMuchTrack();
+        t->SetMuchTrackIndex(muchTrackIndex);
+        if (event) event->AddData(ECbmDataType::kMuchTrack, muchTrackIndex);
+        CbmL1TrackToCbmMuchTrack(T, track, h.Det);
+        muchTrackIndex++;
+      }
+      if (h.Det == 3 && hasTrdHits == false) {
+        hasTrdHits         = true;
+        CbmTrdTrack* track = new ((*fTrdTracks)[trdTrackIndex]) CbmTrdTrack();
+        t->SetTrdTrackIndex(trdTrackIndex);
+        if (event) event->AddData(ECbmDataType::kTrdTrack, trdTrackIndex);
+        CbmL1TrackToCbmTrdTrack(T, track, h.Det);
+        trdTrackIndex++;
+      }
+      if (h.Det == 4 && hasTofHits == false) {
+        hasTofHits         = true;
+        CbmTofTrack* track = new ((*fTofTracks)[tofTrackIndex]) CbmTofTrack();
 
-  if (!fEvents) { LOG(warn) << GetName() << ": No event array! Will process entire tree."; }
-  // --- Get input array (StsHits)
-  fStsHits = (TClonesArray*) ioman->GetObject("StsHit");
+        //         t->SetTofHitIndex(tofTrackIndex);
 
-  // Array of MvdHits
-  fMvdHits = (TClonesArray*) ioman->GetObject("MvdHit");
+        if (event) event->AddData(ECbmDataType::kTofTrack, tofTrackIndex);
+        CbmL1TrackToCbmTofTrack(T, track, h.Det);
+        tofTrackIndex++;
 
-  // Screen output
-  LOG(info) << GetName() << ": successfully initialised.";
-  LOG(info) << "=====================================";
-  return kSUCCESS;
+        if (event) event->AddData(ECbmDataType::kTofHit, h.ExtIndex);
+      }
+    }
+    //END create detector tracks if needed
+  }
+  return globalTrackIndex;
 }
+// -------------------------------------------------------------------------
 
-void CbmL1GlobalTrackFinder::Exec(Option_t* /*opt*/)
+
+// -----   Public method CbmL1TrackToCbmTrack   ------------------------------------------
+void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTrack(CbmL1Track l1track, CbmTrack* track, int systemIdT)
 {
+  Int_t ndf = 0;
 
-  // --- Clear output array
-  fTracks->Delete();
-
-  // --- Event loop (from event objects)
-  if (fEvents) {
-    Int_t nEvents = fEvents->GetEntriesFast();
-    LOG(debug) << GetName() << ": reading time slice with " << nEvents << " events ";
-    for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
-
-      LOG(debug) << fEvents << " fEvents " << iEvent << " iEvent ";
-      CbmEvent* event = static_cast<CbmEvent*>(fEvents->At(iEvent));
-      ProcessEvent(event);
-    }  //# events
-  }    //? event branch present
-
-  else  // Old event-by-event simulation without event branch
-  {
-    ProcessEvent(NULL);
-    LOG(info) << "CbmL1GlobalTrackFinder::Exec event: " << fEventNo++;
-  }
-}
+  CbmL1Track* T = &l1track;
 
-// ------   Process one event   --------------------------------------------
-void CbmL1GlobalTrackFinder::ProcessEvent(CbmEvent* event)
-{
+  CbmL1* L1 = CbmL1::Instance();
 
-  // --- Call track finder
-  fTimer.Start();
-  Int_t nTracks = FindTracks(event);
-  fTimer.Stop();
-
-  // --- Event log
-  if (fEvents) {
-    Int_t eventNumber = (event ? event->GetNumber() : fNofEvents);
-    Int_t nHits       = (event ? event->GetNofData(kStsHit) : fStsHits->GetEntriesFast());
-    LOG(info) << "+ " << setw(20) << GetName() << ": Event " << setw(6) << right << eventNumber << ", real time "
-              << fixed << setprecision(6) << fTimer.RealTime() << " s, hits: " << nHits << ", tracks: " << nTracks << ;
-
-    // --- Counters
-    fNofEvents++;
-    fNofHits += Double_t(nHits);
-    fNofTracks += Double_t(nTracks);
-    fTime += fTimer.RealTime();
+  for (vector<int>::iterator ih = T->StsHits.begin(); ih != T->StsHits.end(); ++ih) {
+    CbmL1HitStore& h = L1->vHitStore[*ih];
+    if (h.Det != systemIdT) continue;
   }
+  ndf -= 5;
+  if (ndf <= 0) ndf = 1;
+  track->SetChiSq(T->chi2);
+  track->SetNDF(ndf);
+  //track->SetPreviousTrackId(T->GetPreviousTrackId());//???
+  //track->SetFlag(T->GetQuality());//???
+
+  FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast());
+  CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C);
+  CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast);
 }
-
-
 // -------------------------------------------------------------------------
 
-Int_t CbmL1GlobalTrackFinder::CreateGlobalTrackArray(CbmEvent* event, TClonesArray* globalTracks,
-                                                     TClonesArray* stsTracks, TClonesArray* trdTracks,
-                                                     TClonesArray* muchTracks, TClonesArray* tofTracks)
+// -----   Public method CbmL1TrackToCbmStsTrack   ------------------------------------------
+void CbmL1GlobalTrackFinder::CbmL1TrackToCbmStsTrack(CbmL1Track l1track, CbmStsTrack* track, int systemIdT)
 {
+  Int_t ndf = 0;
 
-  CbmL1* L1 = CbmL1::Instance();
-  if (!L1) return 0;
+  CbmL1Track* T = &l1track;
 
-  Int_t nTracks = 0;
+  CbmL1* L1 = CbmL1::Instance();
 
-  // Loop over STS tracks and create GlobalTrack for each StsTrack
+  for (vector<int>::iterator ih = T->StsHits.begin(); ih != T->StsHits.end(); ++ih) {
+    CbmL1HitStore& h = L1->vHitStore[*ih];
+    if (h.Det != systemIdT) continue;
+    track->AddHit(h.ExtIndex, kSTSHIT);
+  }
 
-  Int_t globalTrackNo = globalTracks->GetEntriesFast();
+  ndf -= 5;
+  if (ndf <= 0) ndf = 1;
 
-  Int_t stsTrackNo  = (stsTracks != NULL) ? stsTracks->GetEntriesFast() : 0;
-  Int_t trdTrackNo  = (trdTracks != NULL) ? trdTracks->GetEntriesFast() : 0;
-  Int_t muchTrackNo = (muchTracks != NULL) ? muchTracks->GetEntriesFast() : 0;
-  Int_t tofTrackNo  = (tofTracks != NULL) ? tofTracks->GetEntriesFast() : 0;
 
-  for (vector<CbmL1Track>::iterator it = L1->vRTracks.begin(); it != L1->vRTracks.end(); ++it) {
+  track->SetFlag(0);
+  track->SetChiSq(T->chi2);
+  track->SetNDF(T->NDF);
+  track->SetPidHypo(T->T[4] >= 0 ? 211 : -211);
+  track->SetTime(T->Tpv[6]);
+  track->SetTimeError(T->Cpv[20]);
 
-    CbmL1Track& T = *it;
-
-    CbmGlobalTrack* globalTrack = new ((*globalTracks)[globalTrackNo]) CbmGlobalTrack();
+  FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast());
+  CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C);
+  CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast);
+}
+// -------------------------------------------------------------------------
 
-    globalTrack->SetStsTrackIndex(globalTrackNo);
+// -----   Public method CbmL1TrackToCbmMuchTrack   ------------------------------------------
+void CbmL1GlobalTrackFinder::CbmL1TrackToCbmMuchTrack(CbmL1Track l1track, CbmMuchTrack* track, int systemIdT)
+{
+  Int_t ndf = 0;
 
-    Int_t iTrack = event ? event->GetIndex(kStsTrack, globalTrackNo) : globalTrackNo;
+  CbmL1Track* T = &l1track;
 
-    globalTrackNo++;
-    nTracks++;
+  CbmL1* L1 = CbmL1::Instance();
 
-    if (event) event->AddData(kGlobalTrack, iTrack);
+  for (vector<int>::iterator ih = T->StsHits.begin(); ih != T->StsHits.end(); ++ih) {
+    CbmL1HitStore& h = L1->vHitStore[*ih];
+    if (h.Det != systemIdT) continue;
+    track->AddHit(h.ExtIndex, kMUCHPIXELHIT);
+  }
+  ndf -= 5;
+  if (ndf <= 0) ndf = 1;
 
-    CbmStsTrack* trackSts   = new CbmStsTrack();
-    CbmMuchTrack* trackMuch = new CbmMuchTrack();
-    CbmTrdTrack* trackTrd   = new CbmTrdTrack();
-    CbmTofTrack* trackTof   = new CbmTofTrack();
+  track->SetChiSq(T->chi2);
+  track->SetNDF(ndf);
+  //track->SetPreviousTrackId(T->GetPreviousTrackId());//???
+  //track->SetFlag(T->GetQuality());//???
 
-    // Set last parameter of the CbmGlobal track to be last parameter of CbmLitTrack
-    FairTrackParam fpar(*globalTrack->GetParamFirst()), lpar(*globalTrack->GetParamLast());
-    CbmKFMath::CopyTC2TrackParam(&fpar, T.T, T.C);
-    CbmKFMath::CopyTC2TrackParam(&lpar, T.TLast, T.CLast);
-    globalTrack->SetParamLast(&lpar);
-    globalTrack->SetParamFirst(&fpar);
+  FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast());
+  CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C);
+  CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast);
+}
+// -------------------------------------------------------------------------
 
-    trackSts->SetParamLast(&lpar);
-    trackSts->SetParamFirst(&fpar);
+// -----   Public method CbmL1TrackToCbmTrdTrack   ------------------------------------------
+void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTrdTrack(CbmL1Track l1track, CbmTrdTrack* track, int systemIdT)
+{
+  Int_t ndf = 0;
 
-    trackMuch->SetParamLast(&lpar);
-    trackMuch->SetParamFirst(&fpar);
+  CbmL1Track* T = &l1track;
 
-    trackTrd->SetParamLast(&lpar);
-    trackTrd->SetParamFirst(&fpar);
+  CbmL1* L1 = CbmL1::Instance();
 
-    for (vector<int>::iterator ih = it->StsHits.begin(); ih != it->StsHits.end(); ++ih) {
-      CbmL1HitStore& h = L1->vHitStore[*ih];
+  for (vector<int>::iterator ih = T->StsHits.begin(); ih != T->StsHits.end(); ++ih) {
+    CbmL1HitStore& h = L1->vHitStore[*ih];
+    if (h.Det != systemIdT) continue;
+    track->AddHit(h.ExtIndex, kTRDHIT);
+  }
+  ndf -= 5;
+  if (ndf <= 0) ndf = 1;
 
-      if (h.Det == 2) {
-        //CbmLitTrackToCbmTrack(litTrack, trackMuch, kLITMUCH);
-        trackMuch->AddHit(h.ExtIndex, kMUCHPIXELHIT);
-      }
-      if (h.Det == 3) {
-        //CbmLitTrackToCbmTrack(litTrack, trackMuch, kLITMUCH);
-        trackTrd->AddHit(h.ExtIndex, kTRDHIT);
-      }
-      if (h.Det == 1) {
-        //CbmLitTrackToCbmTrack(litTrack, trackMuch, kLITMUCH);
-        trackSts->AddHit(h.ExtIndex, kSTSHIT);
-      }
-      if (h.Det == 4) {
-
-        CbmTofTrack* track  = new ((*tofTracks)[tofTrackNo++]) CbmTofTrack();
-        Int_t globalTrackId = stsTrackNo - 1;
-        Int_t tofHitId      = h.ExtIndex;
-        track->SetTofHitIndex(tofHitId);
-        track->SetTrackIndex(globalTrackId);
-        // track->SetDistance(litTofTrack->GetDistance());!!!
-        FairTrackParam par;
-        //                 CbmLitConverterFairTrackParam::CbmLitTrackParamToFairTrackParam(litTofTrack->GetTrackParam(), &par);
-        //                 track->SetTrackParameter(&par);
-
-        CbmGlobalTrack* gTrack = static_cast<CbmGlobalTrack*>(globalTracks->At(globalTrackId));
-        gTrack->SetTofHitIndex(tofHitId);
-
-        if (event) event->AddData(kTofHit, tofHitId);
-      }
-    }  //StsHits loop
-
-    if (trackMuch->GetNofHits() > 0) {
-      CbmMuchTrack* track = new ((*muchTracks)[muchTrackNo]) CbmMuchTrack();
-      int ndf             = 0;
-      double chiSq        = 0.;
-      //TODO calculate chiSq (sum of chiSq for each hit)
-      for (int i = 0; i < trackMuch->GetNofHits(); i++) {
-        track->AddHit(trackMuch->GetHitIndex(i), kMUCHPIXELHIT);
-        ndf += 2;
-      }
-      ndf -= 5;
-      if (ndf <= 0) ndf = 1;
-      track->SetChiSq(chiSq);
-      track->SetNDF(ndf);
-      //TODO fill prev. track id and flag if required
-      //track->SetPreviousTrackId(litTrack->GetPreviousTrackId());
-      //track->SetFlag(litTrack->GetQuality());
-      track->SetParamLast(trackMuch->GetParamLast());
-      track->SetParamFirst(trackMuch->GetParamFirst());
-
-      if (event) event->AddData(kMuchTrack, muchTrackNo);
-      globalTrack->SetMuchTrackIndex(muchTrackNo);
-      ++muchTrackNo;
-    }
-    if (trackTrd->GetNofHits() > 0) {
-      CbmTrdTrack* track = new ((*trdTracks)[trdTrackNo]) CbmTrdTrack();
-      int ndf            = 0;
-      double chiSq       = 0.;
-      //TODO calculate chiSq (sum of chiSq for each hit)
-      for (int i = 0; i < trackTrd->GetNofHits(); i++) {
-        track->AddHit(trackTrd->GetHitIndex(i), kTRDHIT);
-        ndf += 2;
-      }
-      ndf -= 5;
-      if (ndf <= 0) ndf = 1;
-      track->SetChiSq(chiSq);
-      track->SetNDF(ndf);
-      //TODO fill prev. track id and flag if required
-      //track->SetPreviousTrackId(litTrack->GetPreviousTrackId());
-      //track->SetFlag(litTrack->GetQuality());
-      track->SetParamLast(trackTrd->GetParamLast());
-      track->SetParamFirst(trackTrd->GetParamFirst());
-
-      if (event) event->AddData(kTrdTrack, trdTrackNo);
-      globalTrack->SetTrdTrackIndex(trdTrackNo);
-      ++trdTrackNo;
-    }
-    if (trackSts->GetNofHits() > 0) {
-      CbmStsTrack* track = new ((*stsTracks)[stsTrackNo]) CbmStsTrack();
-      int ndf            = 0;
-      double chiSq       = 0.;
-      //TODO calculate chiSq (sum of chiSq for each hit)
-      for (int i = 0; i < trackSts->GetNofHits(); i++) {
-        track->AddHit(trackSts->GetHitIndex(i), kSTSHIT);
-        ndf += 2;
-      }
-      ndf -= 5;
-      if (ndf <= 0) ndf = 1;
-      track->SetChiSq(chiSq);
-      track->SetNDF(ndf);
-      //TODO fill prev. track id and flag if required
-      //track->SetPreviousTrackId(litTrack->GetPreviousTrackId());
-      //track->SetFlag(litTrack->GetQuality());
-      track->SetParamLast(trackSts->GetParamLast());
-      track->SetParamFirst(trackSts->GetParamFirst());
-
-      if (event) event->AddData(kStsTrack, stsTrackNo);
-      globalTrack->SetStsTrackIndex(stsTrackNo);
-      ++stsTrackNo;
-    }
 
-  }  //vRTracks loop
+  track->SetChiSq(T->chi2);
+  track->SetNDF(ndf);
+  //track->SetPreviousTrackId(T->GetPreviousTrackId());//???
+  //track->SetFlag(T->GetQuality());//???
 
-  return nTracks;
+  FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast());
+  CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C);
+  CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast);
 }
+// -------------------------------------------------------------------------
 
-
-// -----   Copy tracks to output array   -----------------------------------
-Int_t CbmL1GlobalTrackFinder::CopyL1Tracks(CbmEvent* event)
+// -----   Public method CbmL1TrackToCbmTofTrack   ------------------------------------------
+void CbmL1GlobalTrackFinder::CbmL1TrackToCbmTofTrack(CbmL1Track l1track, CbmTofTrack* track, int systemIdT)
 {
+  Int_t ndf = 0;
 
-  CbmL1* L1 = CbmL1::Instance();
-  if (!L1) return 0;
+  CbmL1Track* T = &l1track;
 
-  Int_t trackIndex = fTracks->GetEntriesFast();
-  Int_t nTracks    = 0;
-  LOG(debug) << "Copy L1 tracks : " << L1->vRTracks.size() << " tracks in L1";
-  for (vector<CbmL1Track>::iterator it = L1->vRTracks.begin(); it != L1->vRTracks.end(); ++it) {
-    CbmL1Track& T = *it;
-    new ((*fTracks)[trackIndex]) CbmStsTrack();
-    nTracks++;
-    if (event) event->AddData(kStsTrack, trackIndex);
-    CbmStsTrack* t = L1_DYNAMIC_CAST<CbmStsTrack*>(fTracks->At(trackIndex++));
-    t->SetFlag(0);
-    FairTrackParam fpar(*t->GetParamFirst()), lpar(*t->GetParamLast());
-    CbmKFMath::CopyTC2TrackParam(&fpar, T.T, T.C);
-    CbmKFMath::CopyTC2TrackParam(&lpar, T.TLast, T.CLast);
-    t->SetParamFirst(&fpar);
-    t->SetParamLast(&lpar);
-    t->SetChiSq(T.chi2);
-    t->SetNDF(T.NDF);
-    t->SetPidHypo(T.T[4] >= 0 ? 211 : -211);
-    t->SetTime(T.Tpv[6]);
-    t->SetTimeError(T.Cpv[20]);
+  CbmL1* L1 = CbmL1::Instance();
 
-    for (vector<int>::iterator ih = it->StsHits.begin(); ih != it->StsHits.end(); ++ih) {
-      CbmL1HitStore& h = L1->vHitStore[*ih];
-      //    double zref = L1->algo->vStations[h.iStation].z[0];
-      if (h.ExtIndex < 0) {
-        // CbmMvdHit tmp;
-        // tmp.SetZ(zref);
-        t->AddMvdHit(-h.ExtIndex - 1);  //, &tmp );
-      }
-      else {
-        //CbmStsHit tmp;
-        //tmp.SetZ(zref);
-        t->AddHit(h.ExtIndex, kSTSHIT);  //, &tmp );
-      }
-    }
+  for (vector<int>::iterator ih = T->StsHits.begin(); ih != T->StsHits.end(); ++ih) {
+    CbmL1HitStore& h = L1->vHitStore[*ih];
+    if (h.Det != systemIdT) continue;
+    // track->AddHit(h.ExtIndex, kTOFHIT);
   }
+  ndf -= 5;
+  if (ndf <= 0) ndf = 1;
 
-  return nTracks;
+  //track->SetChiSq(T->chi2);
+  //track->SetNDF(ndf);
+  //track->SetPreviousTrackId(T->GetPreviousTrackId());//???
+  //track->SetFlag(T->GetQuality());//???
+
+  //FairTrackParam fpar(*track->GetParamFirst()), lpar(*track->GetParamLast());
+  //CbmKFMath::CopyTC2TrackParam(&fpar, T->T, T->C);
+  //CbmKFMath::CopyTC2TrackParam(&lpar, T->TLast, T->CLast);
 }
 // -------------------------------------------------------------------------
 
-
 // -----   Public method DoFind   ------------------------------------------
 Int_t CbmL1GlobalTrackFinder::DoFind()
 {
@@ -387,35 +322,32 @@ Int_t CbmL1GlobalTrackFinder::DoFind()
 // -----   Track finding in one event   ------------------------------------
 Int_t CbmL1GlobalTrackFinder::FindTracks(CbmEvent* event)
 {
-  /*
-  CbmL1 *l1 = CbmL1::Instance();
-  if( ! l1 ) return 0;
 
-  l1->Reconstruct(event);
-  */
-  if (fTrdTracks != NULL) fTrdTracks->Delete();
-  if (fMuchTracks != NULL) fMuchTracks->Delete();
-  if (fTofTracks != NULL) fTofTracks->Delete();
-  fGlobalTracks->Clear();
+  CbmL1* l1 = CbmL1::Instance();
+  if (!l1) return 0;
 
-  int nTracks = CreateGlobalTrackArray(event, fGlobalTracks, fTracks, fTrdTracks, fMuchTracks, fTofTracks);
+  l1->Reconstruct(event);
+  int nTracks = CopyL1Tracks(event);
 
   return nTracks;
 }
 // -------------------------------------------------------------------------
 
 
-// -----   End-of-run action   ---------------------------------------------
-void CbmL1GlobalTrackFinder::Finish()
+// -------------------------------------------------------------------------
+void CbmL1GlobalTrackFinder::SetDefaultParticlePDG(int pdg)
 {
-  std::cout << std::endl;
-  LOG(info) << "=====================================";
-  LOG(info) << GetName() << ": Run summary";
-  LOG(info) << "Events processed   : " << fNofEvents;
-  LOG(info) << "Hits / event       : " << fNofHits / Double_t(fNofEvents);
-  LOG(info) << "Tracks / event     : " << fNofTracks / Double_t(fNofEvents);
-  LOG(info) << "Hits per track     : " << fNofHits / fNofTracks;
-  LOG(info) << "Time per event     : " << fTime / Double_t(fNofEvents) << " s ";
-  LOG(info) << "=====================================";
+  /// set a default particle mass for the track fit
+  /// it is used during reconstruction for the multiple scattering estimation
+  CbmL1* l1 = CbmL1::Instance();
+  if (!l1 || !l1->algo) {
+    LOG(fatal) << "L1 instance doesn't exist or is not initialised";
+    return;
+  }
+  auto* p = TDatabasePDG::Instance()->GetParticle(pdg);
+  if (!p) {
+    LOG(fatal) << "Particle with pdg " << pdg << " doesn't exist";
+    return;
+  }
+  l1->algo->SetDefaultParticleMass(p->Mass());
 }
-//
diff --git a/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.h b/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.h
index 2ba1a50d497de28b0cc0a5354d73c5684e92422e..018bc02563923400c6a5c8d73a89468451e54f49 100644
--- a/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.h
+++ b/reco/L1/OffLineInterface/CbmL1GlobalTrackFinder.h
@@ -5,11 +5,11 @@
 /*
  *====================================================================
  *
- *  CBM Level 1 Global Reconstruction 
+ *  CBM Level 1 Reconstruction 
  *  
- *  Authors: V.Akishina
+ *  Authors: V. Akishina
  *
- *  e-mail : v.akishina@gsi.de
+ *  e-mail : v.akishina@gsi.de 
  *
  *====================================================================
  *
@@ -23,25 +23,19 @@
 
 
 #include "CbmL1.h"
-
-//#include "CbmStsTrackFinder.h"
-#include "CbmGlobalTrack.h"
 #include "CbmMuchTrack.h"
-#include "CbmStsTrack.h"
+#include "CbmStsTrackFinder.h"
 #include "CbmTofTrack.h"
+#include "CbmTrack.h"
 #include "CbmTrdTrack.h"
 
-#include "FairTask.h"
-
-#include "TStopwatch.h"
-
 class TClonesArray;
 class CbmEvent;
+class CbmTrack;
+class CbmGlobalTrack;
 
 
-class CbmL1GlobalTrackFinder :
-  public FairTask  //, CbmStsTrackFinder
-{
+class CbmL1GlobalTrackFinder : public CbmStsTrackFinder {
 
 public:
   /** Default constructor **/
@@ -53,11 +47,7 @@ public:
 
 
   /** Initialisation **/
-  //virtual InitStatus Init();
-  virtual InitStatus Init();
-  virtual void Exec(Option_t* opt);
-  virtual void Finish();
-  void ProcessEvent(CbmEvent* event);
+  virtual void Init();
 
 
   /** Track finding algorithm
@@ -70,35 +60,40 @@ public:
    **/
   virtual Int_t FindTracks(CbmEvent* event);
 
+  /// set a default particle mass for the track fit
+  /// it is used during reconstruction
+  /// for the multiple scattering and energy loss estimation
+  void SetDefaultParticlePDG(int pdg = 13);  // muon
+  void SetGlobalTracksArray(TClonesArray* tracks) { fGlobalTracks = tracks; }
+  void SetStsTracksArray(TClonesArray* tracks) { fStsTracks = tracks; }
+  void SetMuchTracksArray(TClonesArray* tracks) { fMuchTracks = tracks; }
+  void SetTrdTracksArray(TClonesArray* tracks) { fTrdTracks = tracks; }
+  void SetTofTracksArray(TClonesArray* tracks) { fTofTracks = tracks; }
+
+protected:
+  TClonesArray* fGlobalTracks;  // GlobalTrack array
+  TClonesArray* fStsTracks;     // StsTrack array
+  TClonesArray* fMuchTracks;    // MuchTrack array
+  TClonesArray* fTrdTracks;     // TrdTrack array
+  TClonesArray* fTofTracks;     // TofTrack array
 
 private:
-  TClonesArray* fMuchTracks;    // output CbmMuchTrack array
-  TClonesArray* fTrdTracks;     // output CbmTrdTrack array
-  TClonesArray* fTofTracks;     // output CbmTofTrack array
-  TClonesArray* fGlobalTracks;  //output CbmGlobalTrack array
-
-  TClonesArray* fMvdHits;  // MvdHit array
-  TClonesArray* fStsHits;  // StsHit array
-  TClonesArray* fTracks;   // StsTrack array
-
-  TClonesArray* fEvents;  //! Array of CbmEvent objects
-
-  TStopwatch fTimer;    //! Timer
-  Int_t fNofEvents;     ///< Number of events with success
-  Double_t fNofHits;    ///< Number of hits
-  Double_t fNofTracks;  ///< Number of tracks created
-  Double_t fTime;       ///< Total real time used for good events
-  Int_t fEventNo;       // event counter
-
   /** Copy the tracks from the L1-internal format and array
    ** to the output TClonesArray.
    ** @value  Number of created tracks
    **/
   Int_t CopyL1Tracks(CbmEvent* event = NULL);
 
-  Int_t CreateGlobalTrackArray(CbmEvent* event, TClonesArray* globalTracks, TClonesArray* stsTracks,
-                               TClonesArray* trdTracks, TClonesArray* muchTracks, TClonesArray* tofTracks);
-
+  /** Convert detector specific track info to a detector track
+   **/
+  void CbmL1TrackToCbmTrack(CbmL1Track T, CbmTrack* track, int systemIdT);
+  void CbmL1TrackToCbmStsTrack(CbmL1Track T, CbmStsTrack* track, int systemIdT);
+  void CbmL1TrackToCbmMuchTrack(CbmL1Track T, CbmMuchTrack* track, int systemIdT);
+  void CbmL1TrackToCbmTrdTrack(CbmL1Track T, CbmTrdTrack* track, int systemIdT);
+  void CbmL1TrackToCbmTofTrack(CbmL1Track T, CbmTofTrack* track, int systemIdT);
+
+  CbmL1GlobalTrackFinder(const CbmL1GlobalTrackFinder&);
+  CbmL1GlobalTrackFinder& operator=(const CbmL1GlobalTrackFinder&);
 
   ClassDef(CbmL1GlobalTrackFinder, 1);
 };