diff --git a/analysis/common/analysis_tree_converter/app/Application.h b/analysis/common/analysis_tree_converter/app/Application.h
index bd762dd7faa601b4234f106496a7c5468ce2b0a3..d125f22428fd682617bea96052f053aac254e66f 100644
--- a/analysis/common/analysis_tree_converter/app/Application.h
+++ b/analysis/common/analysis_tree_converter/app/Application.h
@@ -40,9 +40,9 @@ namespace cbm::atconverter
   private:
     const std::string& OutputFile() const;
     const std::string& TraFile() const;
-    const std::string& rawFile() const;
-    const std::string& ParamFile() const;
-    const std::string& recoFile() const;
+    const std::string& RawFile() const;
+    const std::string& ParFile() const;
+    const std::string& RecoFile() const;
     const std::string& SetupTag() const;
     const std::string& ConfigFile() const;
 
diff --git a/analysis/common/analysis_tree_converter/config/ATConfig_event_ideal.yaml b/analysis/common/analysis_tree_converter/config/ATConfig_event_ideal.yaml
index e1a0779f72c6b70d5f86eea82e063b8fa065e7d4..81c7c95250378cd06775da57b0e9f13ae41aea94 100644
--- a/analysis/common/analysis_tree_converter/config/ATConfig_event_ideal.yaml
+++ b/analysis/common/analysis_tree_converter/config/ATConfig_event_ideal.yaml
@@ -1,12 +1,14 @@
 global:
   log_level: INFO
   log_verbose: LOW
+  log_color: true
   mode: event
   nTimeslices: -1
   firstTimeslice: 0
   timeslicelength: 1.e5
   collisionSystem: "Au+Au"
   beamMomentum: 12.
+  trackMatching: true
 fsdhits:
   gtrackmatch_minChi2: -1
   gtrackmatch_maxChi2: 10000
diff --git a/analysis/common/analysis_tree_converter/config/ATConfig_timeslice.yaml b/analysis/common/analysis_tree_converter/config/ATConfig_timeslice.yaml
index a447f5817a4bbbd13b7e74a88b72d3595e75f272..5a659f91b53ed5fd51d68d2dcfed1af40674f570 100644
--- a/analysis/common/analysis_tree_converter/config/ATConfig_timeslice.yaml
+++ b/analysis/common/analysis_tree_converter/config/ATConfig_timeslice.yaml
@@ -1,12 +1,14 @@
 global:
   log_level: INFO
   log_verbose: LOW
+  log_color: true
   mode: timeslice
   nTimeslices: -1
   firstTimeslice: 0
   timeslicelength: 1.e5
   collisionSystem: "Au+Au"
   beamMomentum: 12.
+  trackMatching: true
 fsdhits:
   gtrackmatch_minChi2: -1
   gtrackmatch_maxChi2: 10000
diff --git a/analysis/common/analysis_tree_converter/steer/Config.cxx b/analysis/common/analysis_tree_converter/steer/Config.cxx
index 6105e466007cfdd093a9a56ad3cdf20695bfc283..bbe6be1b9a48f2d6b484906dfc3fc7094930ef40 100644
--- a/analysis/common/analysis_tree_converter/steer/Config.cxx
+++ b/analysis/common/analysis_tree_converter/steer/Config.cxx
@@ -30,14 +30,16 @@ namespace cbm::atconverter
     YAML::Node settings = YAML::LoadFile(fileName);
 
     // --- Global settings
-    f_glb_logLevel   = settings["global"]["log_level"].as<string>();
-    f_glb_logVerbose = settings["global"]["log_verbose"].as<string>();
-    f_glb_mode       = ToCbmRecoMode(settings["global"]["mode"].as<string>());
-    f_glb_numTs      = settings["global"]["nTimeslices"].as<int>();
-    f_glb_firstTs    = settings["global"]["firstTimeslice"].as<int>();
-    f_glb_tslength   = settings["global"]["timeslicelength"].as<float>();
-    f_glb_system     = settings["global"]["collisionSystem"].as<string>();
-    f_glb_beamMom    = settings["global"]["beamMomentum"].as<float>();
+    f_glb_logLevel      = settings["global"]["log_level"].as<string>();
+    f_glb_logVerbose    = settings["global"]["log_verbose"].as<string>();
+    f_glb_logColor      = settings["global"]["log_color"].as<string>();
+    f_glb_mode          = ToCbmRecoMode(settings["global"]["mode"].as<string>());
+    f_glb_numTs         = settings["global"]["nTimeslices"].as<int>();
+    f_glb_firstTs       = settings["global"]["firstTimeslice"].as<int>();
+    f_glb_tslength      = settings["global"]["timeslicelength"].as<float>();
+    f_glb_system        = settings["global"]["collisionSystem"].as<string>();
+    f_glb_beamMom       = settings["global"]["beamMomentum"].as<float>();
+    f_glb_trackMatching = settings["global"]["trackMatching"].as<bool>();
 
     // --- Fsd hits converter settings
     f_fsd_minChi2match = settings["fsdhits"]["gtrackmatch_minChi2"].as<double>();
@@ -80,12 +82,14 @@ namespace cbm::atconverter
     // --- Global settings
     settings["global"]["log_level"]       = f_glb_logLevel;
     settings["global"]["log_verbose"]     = f_glb_logVerbose;
+    settings["global"]["log_color"]       = f_glb_logColor;
     settings["global"]["mode"]            = ToString(f_glb_mode);
     settings["global"]["nTimeslices"]     = f_glb_numTs;
     settings["global"]["firstTimeslice"]  = f_glb_firstTs;
     settings["global"]["timeslicelength"] = f_glb_tslength;
     settings["global"]["collisionSystem"] = f_glb_system;
     settings["global"]["beamMomentum"]    = f_glb_beamMom;
+    settings["global"]["trackMatching"]   = f_glb_trackMatching;
 
     // --- Fsd hits converter settings
     settings["fsdhits"]["gtrackmatch_minChi2"] = f_fsd_minChi2match;
diff --git a/analysis/common/analysis_tree_converter/steer/Config.h b/analysis/common/analysis_tree_converter/steer/Config.h
index ad9d32c7cd2b7f755370b7b23f8bd1b25b6a4b38..1a2c0814db6f6c4b493968548e54d37631e64c2e 100644
--- a/analysis/common/analysis_tree_converter/steer/Config.h
+++ b/analysis/common/analysis_tree_converter/steer/Config.h
@@ -84,6 +84,7 @@ namespace cbm::atconverter
     // --- Global settings
     std::string f_glb_logLevel   = "INFO";
     std::string f_glb_logVerbose = "LOW";
+    std::string f_glb_logColor   = "true";
     ECbmRecoMode f_glb_mode      = ECbmRecoMode::Undefined;
     int f_glb_numTs              = -1;
     int f_glb_firstTs            = 0;
@@ -92,6 +93,8 @@ namespace cbm::atconverter
     std::string f_glb_system = "";
     float f_glb_beamMom      = 12.;
 
+    bool f_glb_trackMatching = true;
+
     // --- Event builder
     ECbmEvbuildType f_evbuild_type = ECbmEvbuildType::Undefined;
 
diff --git a/analysis/common/analysis_tree_converter/steer/Run.cxx b/analysis/common/analysis_tree_converter/steer/Run.cxx
index 70a5aeac6b42d9c046a198f5d67d73a95d9fedd8..9da68a6f0cbda5d73ea261733854c85e09b343cd 100644
--- a/analysis/common/analysis_tree_converter/steer/Run.cxx
+++ b/analysis/common/analysis_tree_converter/steer/Run.cxx
@@ -83,7 +83,7 @@ namespace cbm::atconverter
   {
     TFile* inFile = source->GetInFile();
     if (!inFile) throw std::runtime_error("No input file");
-    TTree* inTree = dynamic_cast<TTree*>(inFile->Get("cbmsim"));
+    auto* inTree = inFile->Get<TTree>("cbmsim");
     if (!inTree) throw std::runtime_error("No input tree");
 
     for (ECbmModuleId detector = ECbmModuleId::kMvd; detector != ECbmModuleId::kNofSystems; ++detector)
@@ -99,6 +99,7 @@ namespace cbm::atconverter
     TaskFactory fact(this);
 
     fact.RegisterMCDataManager(fTra);
+    if (fConfig.f_glb_trackMatching) fact.RegisterTrackMatching();
     fact.RegisterCaTracking();
     fact.RegisterTrdPid();
     fact.RegisterConverterManager(fOutput);
@@ -126,6 +127,11 @@ namespace cbm::atconverter
     // --- Run info
     fRun.SetGenerateRunInfo(true);
 
+    // --- Logger settings
+    FairLogger::GetLogger()->SetLogScreenLevel(fConfig.f_glb_logLevel.data());
+    FairLogger::GetLogger()->SetLogVerbosityLevel(fConfig.f_glb_logVerbose.data());
+    FairLogger::GetLogger()->SetColoredLog(fConfig.f_glb_logColor.data());
+
     // --- Check input, output and parameter files
     if (CheckFile(fOutput.Data()) && !fOverwrite) throw std::runtime_error("Output file already exists");
     if (!CheckFile(fTra.Data())) throw std::runtime_error("Transport file does not exist");
@@ -182,13 +188,12 @@ namespace cbm::atconverter
     FairMonitor::GetMonitor()->Print();
     std::cout << std::endl << std::endl;
     LOG(info) << GetName() << ": Execution successful";
-    LOG(info) << GetName() << ": Reconstruction file was   " << fReco;
-    LOG(info) << GetName() << ": Transport file file is    " << fTra;
-    ;
-    LOG(info) << GetName() << ": Parameter file is         " << fPar;
-    LOG(info) << GetName() << ": Digitization file file is " << fRaw;
-    LOG(info) << GetName() << ": Output file is            " << fOutput;
-    LOG(info) << GetName() << ": Execution time: Init      " << timeInit << " s, Exec " << timeExec << "s";
+    LOG(info) << GetName() << ": Transport file was      " << fTra;
+    LOG(info) << GetName() << ": Digitization file was   " << fRaw;
+    LOG(info) << GetName() << ": Parameter file was      " << fPar;
+    LOG(info) << GetName() << ": Reconstruction file was " << fReco;
+    LOG(info) << GetName() << ": Output file is          " << fOutput;
+    LOG(info) << GetName() << ": Execution time: Init    " << timeInit << " s, Exec " << timeExec << "s";
   }
   // --------------------------------------------------------------------------
 
diff --git a/analysis/common/analysis_tree_converter/steer/Run.h b/analysis/common/analysis_tree_converter/steer/Run.h
index 2c5b10b9df6748a96e3a8be4691c582af8a7e0b7..08ec6f0faa0580f93673f9419e13e85586d743ef 100644
--- a/analysis/common/analysis_tree_converter/steer/Run.h
+++ b/analysis/common/analysis_tree_converter/steer/Run.h
@@ -17,12 +17,13 @@
 
 #include <TNamed.h>
 #include <TString.h>
-#include <TTree.h>
 
 #include <string>
 
 class CbmSetup;
 class FairTask;
+class FairFileSource;
+class TTree;
 
 namespace cbm::atconverter
 {
diff --git a/analysis/common/analysis_tree_converter/steer/TaskFactory.cxx b/analysis/common/analysis_tree_converter/steer/TaskFactory.cxx
index 519a8f933be4ee07a4613015cc10127af3dd00c1..373e99b45f7f5ad74e31e779991ddd37d9f33c94 100644
--- a/analysis/common/analysis_tree_converter/steer/TaskFactory.cxx
+++ b/analysis/common/analysis_tree_converter/steer/TaskFactory.cxx
@@ -16,6 +16,7 @@
 #include "CbmL1.h"
 #include "CbmMCDataManager.h"
 #include "CbmMatchEvents.h"
+#include "CbmMatchRecoToMC.h"
 #include "CbmPsdModulesConverter.h"
 #include "CbmRecEventHeaderConverter.h"
 #include "CbmRichRingsConverter.h"
@@ -115,6 +116,16 @@ namespace cbm::atconverter
   // --------------------------------------------------------------------------
 
 
+  // -----   STS track matching   ---------------------------------------------
+  void TaskFactory::RegisterTrackMatching()
+  {
+    assert(fRun);
+
+    auto* matchTask = new CbmMatchRecoToMC();
+    fRun->AddTask(matchTask);
+  }
+  // --------------------------------------------------------------------------
+
   // -----   TID PID   --------------------------------------------------------
   void TaskFactory::RegisterTrdPid()
   {
diff --git a/analysis/common/analysis_tree_converter/steer/TaskFactory.h b/analysis/common/analysis_tree_converter/steer/TaskFactory.h
index bdc2ec31819ddcd4140d6bf7176044aa59ed685e..876637cbcd377041a03dde2b2ffc3970d360e455 100644
--- a/analysis/common/analysis_tree_converter/steer/TaskFactory.h
+++ b/analysis/common/analysis_tree_converter/steer/TaskFactory.h
@@ -38,12 +38,12 @@ namespace cbm::atconverter
      **/
     void RegisterConverterManager(const TString& outputFile);
 
-    void RegisterCaTracking();  /// CA track finding
-    void RegisterTrdPid();      /// PID with TRD
+    void RegisterCaTracking();     /// CA track finding
+    void RegisterTrackMatching();  /// STS track matching
+    void RegisterTrdPid();         /// PID with TRD
 
    private:  //members
     Run* fRun        = nullptr;
-    //bool hitMatching = false;
   };
 
 }  // namespace cbm::atconverter
diff --git a/macro/run/CMakeLists.txt b/macro/run/CMakeLists.txt
index e80f3b9dbed39358be6e0e9ffb13f08f8a702baa..12bc7acfa170c6daf8cfc1cdd78274801791a206 100644
--- a/macro/run/CMakeLists.txt
+++ b/macro/run/CMakeLists.txt
@@ -180,11 +180,11 @@ foreach(setup IN LISTS cbm_setup)
   # --- Ideal raw event builder
   set(testname run_${sname}_reco_offline_ev_ideal)
   set(binary ${CBMROOT_BINARY_DIR}/bin/cbmreco_offline.sh)
-  set(inputname data/${sname}_ev.raw.root)
+  set(rawfilename data/${sname}_ev.raw.root)
   set(parfilename data/${sname}_coll.par.root)
   set(outputname data/${sname}_offline_ev_ideal.reco.root)
   set(configname ${CBMROOT_SOURCE_DIR}/reco/offline/config/RecoConfig_event_ideal.yaml)
-  set(cl_options -i ${inputname} -o ${outputname} -p ${parfilename} -c ${configname} -s ${setup} -w)
+  set(cl_options -d ${rawfilename} -o ${outputname} -p ${parfilename} -c ${configname} -s ${setup} -w)
   add_test(NAME ${testname} COMMAND ${binary} ${cl_options})
   set_tests_properties(${testname} PROPERTIES
     TIMEOUT ${timeOutTime}
@@ -214,11 +214,11 @@ foreach(setup IN LISTS cbm_setup)
   # --- Real raw event builder
   set(testname run_${sname}_reco_offline_ev_real)
   set(binary ${CBMROOT_BINARY_DIR}/bin/cbmreco_offline.sh)
-  set(inputname data/${sname}_ev.raw.root)
+  set(rawfilename data/${sname}_ev.raw.root)
   set(parfilename data/${sname}_coll.par.root)
   set(outputname data/${sname}_offline_ev_real.reco.root)
   set(configname ${CBMROOT_SOURCE_DIR}/reco/offline/config/RecoConfig_event_real.yaml)
-  set(cl_options -i ${inputname} -o ${outputname} -p ${parfilename} -c ${configname} -s ${setup} -w)
+  set(cl_options -d ${rawfilename} -o ${outputname} -p ${parfilename} -c ${configname} -s ${setup} -w)
   add_test(NAME ${testname} COMMAND ${binary} ${cl_options})
   set_tests_properties(${testname} PROPERTIES
     TIMEOUT ${timeOutTime}
@@ -248,11 +248,11 @@ foreach(setup IN LISTS cbm_setup)
   # --- Real raw event builder
   set(testname run_${sname}_reco_offline_ts_eb_ideal)
   set(binary ${CBMROOT_BINARY_DIR}/bin/cbmreco_offline.sh)
-  set(inputname data/${sname}_ts.raw.root)
+  set(rawfilename data/${sname}_ts.raw.root)
   set(parfilename data/${sname}_coll.par.root)
   set(outputname data/${sname}_offline_ts_eb_ideal.reco.root)
   set(configname ${CBMROOT_SOURCE_DIR}/reco/offline/config/RecoConfig_event_ideal.yaml)
-  set(cl_options -i ${inputname} -o ${outputname} -p ${parfilename} -c ${configname} -s ${setup} -w)
+  set(cl_options -d ${rawfilename} -o ${outputname} -p ${parfilename} -c ${configname} -s ${setup} -w)
   add_test(NAME ${testname} COMMAND ${binary} ${cl_options})
   set_tests_properties(${testname} PROPERTIES
     TIMEOUT ${timeOutTime}
@@ -282,11 +282,11 @@ foreach(setup IN LISTS cbm_setup)
   # --- Real raw event builder
   set(testname run_${sname}_reco_offline_ts_eb_real)
   set(binary ${CBMROOT_BINARY_DIR}/bin/cbmreco_offline.sh)
-  set(inputname data/${sname}_ts.raw.root)
+  set(rawfilename data/${sname}_ts.raw.root)
   set(parfilename data/${sname}_coll.par.root)
   set(outputname data/${sname}_offline_ts_eb_real.reco.root)
   set(configname ${CBMROOT_SOURCE_DIR}/reco/offline/config/RecoConfig_event_real.yaml)
-  set(cl_options -i ${inputname} -o ${outputname} -p ${parfilename} -c ${configname} -s ${setup} -w)
+  set(cl_options -d ${rawfilename} -o ${outputname} -p ${parfilename} -c ${configname} -s ${setup} -w)
   add_test(NAME ${testname} COMMAND ${binary} ${cl_options})
   set_tests_properties(${testname} PROPERTIES
     TIMEOUT ${timeOutTime}
@@ -331,11 +331,11 @@ foreach(setup IN LISTS cbm_setup)
   # --- Time-based reconstruction from time-based simulation, with binary cbmreco_offline
   set(testname run_${sname}_reco_offline_ts_tb)
   set(binary ${CBMROOT_BINARY_DIR}/bin/cbmreco_offline.sh)
-  set(inputname data/${sname}_ts.raw.root)
+  set(rawfilename data/${sname}_ts.raw.root)
   set(parfilename data/${sname}_coll.par.root)
   set(outputname data/${sname}_offline_ts_tb.reco.root)
   set(configname ${CBMROOT_SOURCE_DIR}/reco/offline/config/RecoConfig_timeslice.yaml)
-  set(cl_options -i ${inputname} -o ${outputname} -p ${parfilename} -c ${configname} -s ${setup} -w)
+  set(cl_options -d ${rawfilename} -o ${outputname} -p ${parfilename} -c ${configname} -s ${setup} -w)
   add_test(NAME ${testname} COMMAND ${binary} ${cl_options})
   set_tests_properties(${testname} PROPERTIES
     TIMEOUT ${timeOutTime}
diff --git a/reco/offline/app/Application.cxx b/reco/offline/app/Application.cxx
index cc31543a139ccc28b4412c69d62582852c389d72..2cccaf6e581b28b966f2c05ff536c9cf2ba6da84 100644
--- a/reco/offline/app/Application.cxx
+++ b/reco/offline/app/Application.cxx
@@ -26,11 +26,10 @@ namespace cbm::reco::offline
   {
 
     // --- Use program options
-    fRun.SetInput(fOpt.InputFile().c_str());
     fRun.SetOutput(fOpt.OutputFile().c_str());
-    fRun.SetParams(fOpt.ParamFile().c_str());
+    fRun.SetRawFile(fOpt.RawFile().c_str());
+    fRun.SetParFile(fOpt.ParFile().c_str());
     fRun.SetGeoSetupTag(fOpt.SetupTag().c_str());
-    fRun.SetNumTs(fOpt.MaxNumTs());
     if (fOpt.Overwrite()) fRun.AllowOverwrite();
 
     // --- Read configuration from YAML file
diff --git a/reco/offline/app/Application.h b/reco/offline/app/Application.h
index 650a74327df7a0b37fe206869d8ad89c005c2fd3..44ee4b630bdc644a5681698700a04c8623fa4821 100644
--- a/reco/offline/app/Application.h
+++ b/reco/offline/app/Application.h
@@ -39,7 +39,8 @@ namespace cbm::reco::offline
 
   private:
     const std::string& OutputFile() const;
-    const std::string& ParamFile() const;
+    const std::string& RawFile() const;
+    const std::string& ParFile() const;
     const std::string& SetupTag() const;
     const std::string& ConfigFile() const;
 
diff --git a/reco/offline/app/ProgramOptions.cxx b/reco/offline/app/ProgramOptions.cxx
index 1b9740bd8ddc56220b5b52eba7dd4d69166bda7b..2e8fd5b4bbc203720d0f08f06f9167c01af39c40 100644
--- a/reco/offline/app/ProgramOptions.cxx
+++ b/reco/offline/app/ProgramOptions.cxx
@@ -39,18 +39,16 @@ namespace cbm::reco::offline
     defconfig.append(DEFAULT_CONFIG);
     po::options_description config("Configuration");
     auto config_add = config.add_options();
-    config_add("input,i", po::value<string>(&fInput)->value_name("<file name>"),
-               "name of the input ROOT file containing digi data");
     config_add("output,o", po::value<string>(&fOutput)->value_name("<file name>"),
                "name of the output ROOT file with reconstructed data");
-    config_add("params,p", po::value<string>(&fParam)->value_name("<file name>"),
+    config_add("digitization,d", po::value<string>(&fRaw)->value_name("<file name>"),
+               "name of the raw ROOT file containing digi data");
+    config_add("parameter,p", po::value<string>(&fPar)->value_name("<file name>"),
                "name of a parameter ROOT file (FairRuntimeDb format)");
     config_add("config,c", po::value<string>(&fConfig)->value_name("<file name>")->default_value(defconfig),
                "name of a YAML file describing the configuration of reconstruction");
     config_add("setup,s", po::value<string>(&fSetup)->value_name("<tag>")->default_value(DEFAULT_SETUP),
                "geometry setup tag");
-    config_add("max-timeslice-number,n", po::value<int32_t>(&fMaxNumTs)->value_name("<n>")->default_value(INT32_MAX),
-               "maximum number of timeslices to process (default: all in input file)");
     config_add("overwrite,w", po::bool_switch(&fOverwrite)->default_value(false),
                "allow to overwite an existing output file");
 
@@ -70,9 +68,13 @@ namespace cbm::reco::offline
     }
 
     // --- Catch mandatory parameters not being specified
-    if (vars.count("input") == 0u) { throw std::runtime_error("no input file name specified"); }
     if (vars.count("output") == 0u) { throw std::runtime_error("no output file name specified"); }
-    if (vars.count("params") == 0u) { throw std::runtime_error("no parameter file name specified"); }
+    if (vars.count("digitization") == 0u) {
+      throw std::runtime_error("no digitization (raw) file name specified");
+    }
+    if (vars.count("parameter") == 0u) {
+      throw std::runtime_error("no parameter file name specified");
+    }
   }
   // --------------------------------------------------------------------------
 
diff --git a/reco/offline/app/ProgramOptions.h b/reco/offline/app/ProgramOptions.h
index cb5bdbda5d5d5146800a203b49959c6bc5889f64..814112dbc36cec55fb8d1e1a4aec59e089485259 100644
--- a/reco/offline/app/ProgramOptions.h
+++ b/reco/offline/app/ProgramOptions.h
@@ -41,8 +41,8 @@ namespace cbm::reco::offline
     /** @brief Destructor **/
     ~ProgramOptions() = default;
 
-    /** @brief Get input file name **/
-    [[nodiscard]] const std::string& InputFile() const { return fInput; }
+    /** @brief Get digitization (raw) file name **/
+    [[nodiscard]] const std::string& RawFile() const { return fRaw; }
 
     /** @brief Get output file name (.root format) **/
     [[nodiscard]] const std::string& OutputFile() const { return fOutput; }
@@ -54,14 +54,11 @@ namespace cbm::reco::offline
     [[nodiscard]] bool Overwrite() const { return fOverwrite; }
 
     /** @brief Get parameter file name **/
-    [[nodiscard]] const std::string& ParamFile() const { return fParam; }
+    [[nodiscard]] const std::string& ParFile() const { return fPar; }
 
     /** @brief Get geometry setup tag **/
     [[nodiscard]] const std::string& SetupTag() const { return fSetup; }
 
-    /** @brief Get maximum number of timeslices to process **/
-    [[nodiscard]] int32_t MaxNumTs() const { return fMaxNumTs; }
-
 
   private:
     /** @brief Parse command line arguments using boost program_options **/
@@ -69,13 +66,12 @@ namespace cbm::reco::offline
 
 
   private:                            // members
-    std::string fInput  = "";         ///< Input file name (ROOT format)
-    std::string fOutput = "";         ///< Output file name (ROOT format)
-    std::string fParam  = "";         ///< Parameter file name (ROOT format)
-    std::string fConfig = "";         ///< Configuration file name (YAML format)
-    std::string fSetup  = "";         ///< Geometry setup tag
-    int32_t fMaxNumTs   = INT32_MAX;  ///< Maximum number of timeslices to process
-    bool fOverwrite     = false;      ///< Enable overwriting of existing output file
+   std::string fRaw    = "";          ///< Input raw (digi) file name (ROOT format)
+   std::string fOutput = "";          ///< Output file name (ROOT format)
+   std::string fPar    = "";          ///< Parameter file name (ROOT format)
+   std::string fConfig = "";          ///< Configuration file name (YAML format)
+   std::string fSetup  = "";          ///< Geometry setup tag
+   bool fOverwrite     = false;       ///< Enable overwriting of existing output file
   };
 
 }  // namespace cbm::reco::offline
diff --git a/reco/offline/config/RecoConfig_event_ideal.yaml b/reco/offline/config/RecoConfig_event_ideal.yaml
index 28c0cd9378c4dec38a9a9d7fbd80b61fae49404b..1857bd9b9b26bf8daab13c11a0b2022538bda15d 100644
--- a/reco/offline/config/RecoConfig_event_ideal.yaml
+++ b/reco/offline/config/RecoConfig_event_ideal.yaml
@@ -1,7 +1,10 @@
 global:
   log_level: INFO
   log_verbose: LOW
+  log_color: true
   mode: event
+  nTimeslices: -1
+  firstTimeslice: 0
 evbuild:
   type: ideal
   overlap: allow
diff --git a/reco/offline/config/RecoConfig_event_real.yaml b/reco/offline/config/RecoConfig_event_real.yaml
index b98ef71727ded07ce2f7cf2b4d18ddc227cad30f..044320dedf8692a0c7b78332bfd28ef5196fd7c0 100644
--- a/reco/offline/config/RecoConfig_event_real.yaml
+++ b/reco/offline/config/RecoConfig_event_real.yaml
@@ -1,7 +1,10 @@
 global:
   log_level: INFO
   log_verbose: LOW
+  log_color: true
   mode: event
+  nTimeslices: -1
+  firstTimeslice: 0
 evbuild:
   type: real
   overlap: allow
diff --git a/reco/offline/config/RecoConfig_timeslice.yaml b/reco/offline/config/RecoConfig_timeslice.yaml
index 890a9751f5c18ad41d70ab8e666103f0a6602b3f..210511b77487e93ea1d117b39289a8e740bd6fa6 100644
--- a/reco/offline/config/RecoConfig_timeslice.yaml
+++ b/reco/offline/config/RecoConfig_timeslice.yaml
@@ -1,7 +1,10 @@
 global:
   log_level: INFO
   log_verbose: LOW
+  log_color: true
   mode: timeslice
+  nTimeslices: -1
+  firstTimeslice: 0
 evbuild:
   type: ideal
   overlap: allow
diff --git a/reco/offline/steer/Config.cxx b/reco/offline/steer/Config.cxx
index 82aa9cc6b47eecc14ae319481c2be410fc680540..f8e603c1220bcd7b8ef96d61cfb728e280a528cc 100644
--- a/reco/offline/steer/Config.cxx
+++ b/reco/offline/steer/Config.cxx
@@ -32,7 +32,10 @@ namespace cbm::reco::offline
     // --- Global settings
     f_glb_logLevel   = settings["global"]["log_level"].as<string>();
     f_glb_logVerbose = settings["global"]["log_verbose"].as<string>();
+    f_glb_logColor   = settings["global"]["log_color"].as<string>();
     f_glb_mode       = ToCbmRecoMode(settings["global"]["mode"].as<string>());
+    f_glb_numTs      = settings["global"]["nTimeslices"].as<Int_t>();
+    f_glb_firstTs    = settings["global"]["firstTimeslice"].as<Int_t>();
 
     // --- Event builder
     f_evbuild_type       = ToCbmEvbuildType(settings["evbuild"]["type"].as<string>());
@@ -146,7 +149,10 @@ namespace cbm::reco::offline
     // --- Global settings
     settings["global"]["log_level"]   = f_glb_logLevel;
     settings["global"]["log_verbose"] = f_glb_logVerbose;
+    settings["global"]["log_color"]      = f_glb_logColor;
     settings["global"]["mode"]        = ToString(f_glb_mode);
+    settings["global"]["nTimeslices"]    = f_glb_numTs;
+    settings["global"]["firstTimeslice"] = f_glb_firstTs;
 
     // --- Event builder
     settings["evbuild"]["type"]            = ToString(f_evbuild_type);
diff --git a/reco/offline/steer/Config.h b/reco/offline/steer/Config.h
index a013033884705ad6b042d7e6886a9a8888a86026..0b6e13dcd5d4579b4b701452595dd4c56912d626 100644
--- a/reco/offline/steer/Config.h
+++ b/reco/offline/steer/Config.h
@@ -89,7 +89,10 @@ namespace cbm::reco::offline
     // --- Global settings
     std::string f_glb_logLevel   = "INFO";
     std::string f_glb_logVerbose = "LOW";
+    std::string f_glb_logColor   = "true";
     ECbmRecoMode f_glb_mode      = ECbmRecoMode::Undefined;
+    Int_t f_glb_numTs            = -1;
+    Int_t f_glb_firstTs          = 0;
 
     // --- Event builder
     ECbmEvbuildType f_evbuild_type      = ECbmEvbuildType::Undefined;
diff --git a/reco/offline/steer/Run.cxx b/reco/offline/steer/Run.cxx
index 94d12c10bd808b7c2cf994656c5934f1e14affa1..3ba8147ca40375476b78418a55307f8c039afcb2 100644
--- a/reco/offline/steer/Run.cxx
+++ b/reco/offline/steer/Run.cxx
@@ -84,7 +84,7 @@ namespace cbm::reco::offline
 
     TFile* inFile = source->GetInFile();
     if (!inFile) throw std::runtime_error("No input file");
-    TTree* inTree = dynamic_cast<TTree*>(inFile->Get("cbmsim"));
+    auto* inTree = inFile->Get<TTree>("cbmsim");
     if (!inTree) throw std::runtime_error("No input tree");
 
     for (ECbmModuleId detector = ECbmModuleId::kMvd; detector != ECbmModuleId::kNofSystems; ++detector)
@@ -141,10 +141,10 @@ namespace cbm::reco::offline
   {
 
     // --- Mirror options and configuration
-    LOG(info) << GetName() << ": Input file is     " << fInput;
-    LOG(info) << GetName() << ": Parameter file is " << fParams;
-    LOG(info) << GetName() << ": Output file is    " << fOutput;
-    LOG(info) << GetName() << ": Geometry setup is " << fSetupTag;
+    LOG(info) << GetName() << ": Output file is       " << fOutput;
+    LOG(info) << GetName() << ": Digitization file is " << fRaw;
+    LOG(info) << GetName() << ": Parameter file is    " << fPar;
+    LOG(info) << GetName() << ": Geometry setup is    " << fSetupTag;
     LOG(info) << "Configuration: \n" << fConfig.ToString();
 
     // --- Timer
@@ -154,13 +154,18 @@ namespace cbm::reco::offline
     // --- Run info
     fRun.SetGenerateRunInfo(true);
 
+    // --- Logger settings
+    FairLogger::GetLogger()->SetLogScreenLevel(fConfig.f_glb_logLevel.data());
+    FairLogger::GetLogger()->SetLogVerbosityLevel(fConfig.f_glb_logVerbose.data());
+    FairLogger::GetLogger()->SetColoredLog(fConfig.f_glb_logColor.data());
+
     // --- Check input, output and parameter files
-    if (!CheckFile(fInput.Data())) throw std::runtime_error("Input file does not exist");
-    if (!CheckFile(fParams.Data())) throw std::runtime_error("Parameter file does not exist");
+    if (!CheckFile(fRaw.Data())) throw std::runtime_error("Digitization (raw) file does not exist");
+    if (!CheckFile(fPar.Data())) throw std::runtime_error("Parameter file does not exist");
     if (CheckFile(fOutput.Data()) && !fOverwrite) throw std::runtime_error("Output file already exists");
 
     // --- Input and output
-    FairFileSource* source = new FairFileSource(fInput);
+    FairFileSource* source = new FairFileSource(fRaw);
     fRun.SetSource(source);
     fRun.SetSink(new FairRootFileSink(fOutput));
 
@@ -182,7 +187,7 @@ namespace cbm::reco::offline
     LOG(info) << GetName() << ": Set runtime DB...";
     FairRuntimeDb* rtdb       = fRun.GetRuntimeDb();
     FairParRootFileIo* parIo1 = new FairParRootFileIo();
-    parIo1->open(fParams.Data(), "UPDATE");
+    parIo1->open(fPar.Data(), "UPDATE");
     rtdb->setFirstInput(parIo1);
 
     // --- Initialisation
@@ -200,7 +205,7 @@ namespace cbm::reco::offline
     // --- Execute run
     std::cout << std::endl << std::endl;
     LOG(info) << GetName() << ": Starting run" << std::endl;
-    fRun.Run(fNumTs, 0);
+    fRun.Run(fConfig.f_glb_firstTs, fConfig.f_glb_numTs);
 
     // --- Finish
     timer.Stop();
@@ -208,9 +213,9 @@ namespace cbm::reco::offline
     FairMonitor::GetMonitor()->Print();
     std::cout << std::endl << std::endl;
     LOG(info) << GetName() << ": Execution successful";
-    LOG(info) << GetName() << ": Input file was    " << fInput;
-    LOG(info) << GetName() << ": Parameter file is " << fParams;
-    LOG(info) << GetName() << ": Output file is    " << fOutput;
+    LOG(info) << GetName() << ": Digitization file was " << fRaw;
+    LOG(info) << GetName() << ": Parameter file was    " << fPar;
+    LOG(info) << GetName() << ": Output file is        " << fOutput;
     LOG(info) << GetName() << ": Execution time: Init " << timeInit << " s, Exec " << timeExec << "s";
   }
   // --------------------------------------------------------------------------
diff --git a/reco/offline/steer/Run.h b/reco/offline/steer/Run.h
index 6c819ad499ffc330ce2136a7196823c5d019b173..0e8387df43d235bfed8fab34d1f86a11b8de51d4 100644
--- a/reco/offline/steer/Run.h
+++ b/reco/offline/steer/Run.h
@@ -15,7 +15,6 @@
 #include <FairRunAna.h>
 
 #include <TNamed.h>
-#include <TTree.h>
 
 #include <string>
 
@@ -24,6 +23,8 @@
 class TGeoManager;
 class CbmSetup;
 class FairTask;
+class FairFileSource;
+class TTree;
 
 namespace cbm::reco::offline
 {
@@ -83,10 +84,10 @@ namespace cbm::reco::offline
     void SetGeoSetupTag(const char* tag) { fSetupTag = tag; }
 
 
-    /** @brief Set input file name
-     ** @param fileName  Input file name
+    /** @brief Set digitization (raw) file name
+     ** @param fileName  Digi (raw) file name
      **/
-    void SetInput(const char* fileName) { fInput = fileName; }
+    void SetRawFile(const char* fileName) { fRaw = fileName; }
 
 
     /** @brief Set number of timeslices to process
@@ -104,10 +105,10 @@ namespace cbm::reco::offline
     /** @brief Set parameter file name
      ** @param fileName  Parameter file name
      **/
-    void SetParams(const char* fileName) { fParams = fileName; }
+    void SetParFile(const char* fileName) { fPar = fileName; }
 
 
-  private:
+   private:
     /** @brief Copy constructor forbidden **/
     Run(const Run&) = delete;
 
@@ -140,9 +141,9 @@ namespace cbm::reco::offline
 
   private:
     FairRunAna fRun {};
-    TString fInput    = "";
-    TString fParams   = "";
     TString fOutput   = "";
+    TString fRaw      = "";
+    TString fPar      = "";
     TString fSetupTag = "";
     CbmSetup* fSetup  = nullptr;
     size_t fNumTs     = 0;