diff --git a/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp b/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp
index 7e4dda5ce5b68c3bd6f9b03605b6b980e98b1654..df95acc6cbe9cfa3fe53902b659792f367b5c558 100644
--- a/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp
+++ b/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.cpp
@@ -32,6 +32,8 @@
 //#include "Tools/KiTrackMarlinCEDTools.h"
 #include "Tools/FTDHelixFitter.h"
 
+#include <TStopwatch.h>
+
 using namespace MarlinTrk ;
 
 // Used to fedine the quality of the track output collection
@@ -64,6 +66,23 @@ StatusCode ForwardTrackingAlg::initialize(){
   // can be printed. As this is mainly used for debugging it is not a steerable parameter.
   //if( _useCED )MarlinCED::init(this) ;    //CED
 
+  if(m_dumpTime){
+    NTuplePtr nt1(ntupleSvc(), "MyTuples/Time"+name());
+    if ( !nt1 ) {
+      m_tuple = ntupleSvc()->book("MyTuples/Time"+name(),CLID_ColumnWiseTuple,"Tracking time");
+      if ( 0 != m_tuple ) {
+	m_tuple->addItem ("timeTotal",  m_timeTotal ).ignore();
+      }
+      else {
+	fatal() << "Cannot book MyTuples/Time"+name() <<endmsg;
+	return StatusCode::FAILURE;
+      }
+    }
+    else{
+      m_tuple = nt1;
+    }
+  }
+
   // Now set min and max values for all the criteria
   for( unsigned i=0; i < _criteriaNames.size(); i++ ){
     std::vector< float > emptyVec;
@@ -181,6 +200,8 @@ StatusCode ForwardTrackingAlg::initialize(){
 StatusCode ForwardTrackingAlg::execute(){
   debug() << " processing event number " << _nEvt << endmsg;
 
+  auto stopwatch = TStopwatch();
+
   auto trkCol = _outColHdl.createAndPut();
   //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   //                                                                                                              //
@@ -683,6 +704,12 @@ StatusCode ForwardTrackingAlg::execute(){
   //if( _useCED ) MarlinCED::draw(this);
   
   _nEvt ++ ;
+
+  if(m_dumpTime&&m_tuple){
+    m_timeTotal = stopwatch.RealTime()*1000;
+    m_tuple->write();
+  }
+
   return StatusCode::SUCCESS;
 }
 
diff --git a/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.h b/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.h
index 56de6af9f2bb3ea94b24554b3139a10b658b0600..bd7a5173be02214e734579e3d4c025f8006ec1a2 100644
--- a/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.h
+++ b/Reconstruction/SiliconTracking/src/ForwardTrackingAlg.h
@@ -21,6 +21,8 @@
 #include "Criteria/Criteria.h"
 #include "ILDImpl/SectorSystemFTD.h"
 
+#include "GaudiKernel/NTuple.h"
+
 using namespace KiTrack;
 using namespace KiTrackMarlin;
 
@@ -234,7 +236,10 @@ class ForwardTrackingAlg : public GaudiAlgorithm {
   
   int _nRun ;
   int _nEvt ;
-  
+
+  NTuple::Tuple*       m_tuple;
+  NTuple::Item<float>  m_timeTotal;
+
   /** B field in z direction */
   double _Bz;
 
@@ -255,6 +260,7 @@ class ForwardTrackingAlg : public GaudiAlgorithm {
   Gaudi::Property<std::vector<std::string> > _criteriaNames{this, "Criteria", Criteria::getAllCriteriaNamesVec()};
   Gaudi::Property<std::vector<float> > _critMinimaInit{this, "CriteriaMin", {} };
   Gaudi::Property<std::vector<float> > _critMaximaInit{this, "CriteriaMax", {} };
+  Gaudi::Property<bool>   m_dumpTime{this, "DumpTime", true};
 
   std::map<std::string, std::vector<float> > _critMinima;
   std::map<std::string, std::vector<float> > _critMaxima;
diff --git a/Reconstruction/SiliconTracking/src/TrackSubsetAlg.cpp b/Reconstruction/SiliconTracking/src/TrackSubsetAlg.cpp
index 792685092237ca9248c16bc63dd7fca8a8ce9f1f..d4741f2eb165767d51fdaf7afee0612dacf942b7 100644
--- a/Reconstruction/SiliconTracking/src/TrackSubsetAlg.cpp
+++ b/Reconstruction/SiliconTracking/src/TrackSubsetAlg.cpp
@@ -15,6 +15,8 @@
 
 #include "TrackSystemSvc/MarlinTrkUtils.h"
 
+#include <TStopwatch.h>
+
 using namespace KiTrack;
 
 DECLARE_COMPONENT(TrackSubsetAlg)
@@ -39,6 +41,23 @@ StatusCode TrackSubsetAlg::initialize() {
   _nRun = 0 ;
   _nEvt = 0 ;
 
+  if(m_dumpTime){
+    NTuplePtr nt1(ntupleSvc(), "MyTuples/Time"+name());
+    if ( !nt1 ) {
+      m_tuple = ntupleSvc()->book("MyTuples/Time"+name(),CLID_ColumnWiseTuple,"Tracking time");
+      if ( 0 != m_tuple ) {
+	m_tuple->addItem ("timeTotal", m_timeTotal ).ignore();
+      }
+      else {
+	fatal() << "Cannot book MyTuples/Time"+name() <<endmsg;
+	return StatusCode::FAILURE;
+      }
+    }
+    else{
+      m_tuple = nt1;
+    }
+  }
+
   for(unsigned i=0; i<_trackInputColNames.size(); i++){
     _inTrackColHdls.push_back(new DataHandle<edm4hep::TrackCollection> (_trackInputColNames[i], Gaudi::DataHandle::Reader, this));
   }
@@ -96,6 +115,8 @@ StatusCode TrackSubsetAlg::finalize(){
 }
 
 StatusCode TrackSubsetAlg::execute(){ 
+  auto stopwatch = TStopwatch();
+
   std::vector<edm4hep::Track> tracks;
 
   auto trkCol = _outColHdl.createAndPut();
@@ -331,6 +352,12 @@ StatusCode TrackSubsetAlg::execute(){
   Navigation::Instance()->Initialize();
 
   _nEvt ++ ;
+
+  if(m_dumpTime&&m_tuple){
+    m_timeTotal = stopwatch.RealTime()*1000;
+    m_tuple->write();
+  }
+
   return StatusCode::SUCCESS;
 }
 
diff --git a/Reconstruction/SiliconTracking/src/TrackSubsetAlg.h b/Reconstruction/SiliconTracking/src/TrackSubsetAlg.h
index 952d08fa2607dee095444f3dcf0563901c28dc63..1023eba976e861461174d93a7158294328ef4854 100644
--- a/Reconstruction/SiliconTracking/src/TrackSubsetAlg.h
+++ b/Reconstruction/SiliconTracking/src/TrackSubsetAlg.h
@@ -11,6 +11,7 @@
 
 #include "Math/ProbFunc.h"
 
+#include "GaudiKernel/NTuple.h"
 /**  Processor that takes tracks from multiple sources and outputs them (or modified versions, or a subset of them)
  * as one track collection.
  * 
@@ -74,11 +75,15 @@ class TrackSubsetAlg : public GaudiAlgorithm {
   Gaudi::Property<float> _initialTrackError_tanL{this, "InitialTrackErrorTanL",1e2};
   Gaudi::Property<double> _maxChi2PerHit{this, "MaxChi2PerHit", 1e2};
   Gaudi::Property<double> _omega{this, "Omega", 0.75};
+  Gaudi::Property<bool> m_dumpTime{this, "DumpTime", true};
   
   float _bField;
   
   int _nRun ;
   int _nEvt ;
+
+  NTuple::Tuple*       m_tuple;
+  NTuple::Item<float>  m_timeTotal;
 };
 
 /** A functor to return whether two tracks are compatible: The criterion is if the share a TrackerHit or more */