diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h
index c2a13707a3409a4cea377ffe94e42f814d581c2b..bd8ec6e86e6ca2f633f5b6025c945bf217e833de 100755
--- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/FaserActsKalmanFilterAlg.h
@@ -106,11 +106,13 @@ public:
   virtual Acts::MagneticFieldContext getMagneticFieldContext(const EventContext& ctx) const;
 
 private:
-  const FaserSCT_ID* m_idHelper{nullptr};
+  const FaserSCT_ID* m_idHelper {nullptr};
   std::shared_ptr<TrackFitterFunction> m_fit;
   std::unique_ptr<const Acts::Logger> m_logger;
 
   Gaudi::Property<std::string> m_actsLogging {this, "ActsLogging", "VERBOSE"};
+  std::unique_ptr<Trk::Track> makeTrack(Acts::GeometryContext& tgContext, TrackFitterResult& fitResult, std::vector<Tracker::FaserSCT_SpacePoint>  seed_spcollection) const;
+  const Trk::TrackParameters* ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const;
 
   // Read handle for conditions object to get the field cache
   SG::ReadCondHandleKey<FaserFieldCacheCondObj> m_fieldCondObjInputKey {this, "FaserFieldCacheCondObj", "fieldCondObj", "Name of the Magnetic Field conditions object key"};
@@ -124,7 +126,7 @@ private:
   SG::ReadHandleKey<TrackerSimDataCollection> m_sctMap {this, "TrackerSimDataCollection", "SCT_SDO_Map"};
   const TrackerDD::SCT_DetectorManager* m_detManager{nullptr};
 
-  SG::WriteHandleKey<TrackCollection> m_trackCollection { this, "FaserActsCKFTrackCollection", "FaserActsCKFTrackCollection", "Output trackcollection name" };
+  SG::WriteHandleKey<TrackCollection> m_trackCollection { this, "FaserActsKFTrackCollection", "FaserActsKFTrackCollection", "Output track collection" };
 };
 
 #endif
diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackFinderTool.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackFinderTool.h
index 961a9723f2772f252dc1ac274a9b35bd759d6af7..5db8dbf7b12d8a6a773696c2741e598c141342c9 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackFinderTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ITrackFinderTool.h
@@ -1,6 +1,7 @@
 #ifndef FASERACTSKALMANFILTER_ITRACKFINDERTOOL_H
 #define FASERACTSKALMANFILTER_ITRACKFINDERTOOL_H
 
+#include "TrackerSpacePoint/FaserSCT_SpacePoint.h"
 #include "GaudiKernel/IInterface.h"
 #include "GaudiKernel/IAlgTool.h"
 #include "FaserActsKalmanFilter/IndexSourceLink.h"
@@ -18,6 +19,7 @@ public:
   virtual const std::shared_ptr<const Acts::Surface> initialSurface() const = 0;
   virtual const std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks() const = 0;
   virtual const std::shared_ptr<std::vector<Measurement>> measurements() const = 0;
+  virtual const std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> spacePoints() const = 0;
 };
 
 #endif  // FASERACTSKALMANFILTER_ITRACKFINDERTOOL_H
\ No newline at end of file
diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ProtoTrackWriterTool.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ProtoTrackWriterTool.h
index 16909fe3a830a6bb0078998259232f3efbd4ae72..a71ddb56ab7b70af4930fc5cd1369010a5e7446b 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ProtoTrackWriterTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/ProtoTrackWriterTool.h
@@ -1,6 +1,7 @@
 #ifndef FASERACTSKALMANFILTER_PROTOTRACKWRITERTOOL_H
 #define FASERACTSKALMANFILTER_PROTOTRACKWRITERTOOL_H
 
+#include "TrackerSpacePoint/FaserSCT_SpacePoint.h"
 #include "AthenaBaseComps/AthAlgTool.h"
 #include "Gaudi/Property.h"
 #include "GaudiKernel/IInterface.h"
diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/SegmentFitTrackFinderTool.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/SegmentFitTrackFinderTool.h
index ff874e9374a7abd5561f74e1cb89a4eb5094894d..09b8d144aec9f2e20fe98446c9a1cfab2d1b753b 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/SegmentFitTrackFinderTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/SegmentFitTrackFinderTool.h
@@ -13,6 +13,7 @@
 #include "TrackerSpacePoint/FaserSCT_SpacePointContainer.h"
 #include "FaserActsGeometryInterfaces/IFaserActsTrackingGeometryTool.h"
 #include "FaserActsKalmanFilter/ITrackFinderTool.h"
+#include "TrackerSpacePoint/FaserSCT_SpacePoint.h"
 #include "TrkTrack/TrackCollection.h"
 
 class FaserSCT_ID;
@@ -33,12 +34,14 @@ public:
   virtual const std::shared_ptr<const Acts::Surface> initialSurface() const override;
   virtual const std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks() const override;
   virtual const std::shared_ptr<std::vector<Measurement>> measurements() const override;
+  virtual const std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> spacePoints() const override;
 
 private:
   std::shared_ptr<const Acts::CurvilinearTrackParameters> m_initialTrackParameters;
   std::shared_ptr<const Acts::Surface> m_initialSurface;
   std::shared_ptr<std::vector<IndexSourceLink>> m_sourceLinks {};
   std::shared_ptr<std::vector<Measurement>> m_measurements {};
+  std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> m_spacePoints {};
 
   const FaserSCT_ID* m_idHelper {nullptr};
   const TrackerDD::SCT_DetectorManager* m_detManager {nullptr};
@@ -81,4 +84,8 @@ inline const std::shared_ptr<std::vector<Measurement>>
   return m_measurements;
 }
 
+inline const std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>>
+    SegmentFitTrackFinderTool::spacePoints() const {
+  return m_spacePoints;
+}
 #endif // FASERACTSKALMANFILTER_SEGMENTFITTRACKFINDERTOOL_H
diff --git a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/TruthSeededTrackFinderTool.h b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/TruthSeededTrackFinderTool.h
index ab1767af69d0602d23a3cccd6d147f32586f4429..c4e7a87975c8fc435b53f96897d76a836675409e 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/TruthSeededTrackFinderTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/FaserActsKalmanFilter/TruthSeededTrackFinderTool.h
@@ -48,11 +48,14 @@ public:
     return m_measurements;
   }
 
+  virtual const std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> spacePoints() const override;
+
 private:
   std::shared_ptr<const Acts::CurvilinearTrackParameters> m_initialTrackParameters;
   std::shared_ptr<const Acts::Surface> m_initialSurface;
   std::shared_ptr<std::vector<IndexSourceLink>> m_sourceLinks {};
   std::shared_ptr<std::vector<Measurement>> m_measurements {};
+  std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> m_spacePoints {};
 
   const FaserSCT_ID* m_idHelper{nullptr};
   const TrackerDD::SCT_DetectorManager* m_detManager{nullptr};
@@ -60,7 +63,7 @@ private:
   static std::vector<Acts::Vector3> map2vector(const std::map<int, Acts::Vector3>& positions, int station);
   static Acts::Vector3 average(const std::vector<Acts::Vector3>& spacePoints);
   static std::pair<Acts::Vector3, Acts::Vector3> linear_fit(const std::vector<Acts::Vector3>& position);
-  static std::pair<double, double> momentum2(const std::map<int, Acts::Vector3>& hits, double B=0.55) ;
+  static std::pair<double, double> momentum2(const std::map<int, Acts::Vector3>& hits, double B=0.57) ;
 
   SG::ReadHandleKey<SpacePointForSeedCollection>  m_spacePointCollectionKey {
     this, "FaserSpacePointsSeedsName", "Seeds_SpacePointContainer"};
@@ -93,4 +96,9 @@ private:
   Gaudi::Property<double> m_covTime {this, "covTime", 1};
 };
 
+inline const std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>>
+TruthSeededTrackFinderTool::spacePoints() const {
+  return m_spacePoints;
+}
+
 #endif // FASERACTSKALMANFILTER_TRUTHSEEDEDTRACKFINDERTOOL_H
diff --git a/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py b/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py
index 0f10b935969a7112d69c4d54c496778b3f70513a..9c3ddda06b4177c30d78104968e8aa45ecd84832 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py
+++ b/Tracking/Acts/FaserActsKalmanFilter/python/FaserActsKalmanFilterConfig.py
@@ -50,12 +50,43 @@ from MagFieldServices.MagFieldServicesConfig import MagneticFieldSvcCfg
 #     ostream.TakeItemsFromInput = True
 #     return acc
 
+def FaserActsKalmanFilter_OutputCfg(flags):
+    acc = ComponentAccumulator()
+    acc.merge(OutputStreamCfg(flags, "ESD"))
+    ostream = acc.getEventAlgo("OutputStreamESD")
+    ostream.TakeItemsFromInput = True
+    return acc
+
+def FaserActsKalmanFilter_OutputAODCfg(flags):
+    acc = ComponentAccumulator()
+    itemList = ["xAOD::EventInfo#*",
+                "xAOD::EventAuxInfo#*",
+                "FaserSCT_RDO_Container#*",
+                "xAOD::FaserTriggerData#*",
+                "xAOD::FaserTriggerDataAux#*",
+                "ScintWaveformContainer#*",
+                "TrackCollection#*",
+                "xAOD::WaveformHitContainer#*",
+                "xAOD::WaveformHitAuxContainer#*",
+                "xAOD::WaveformClock#*",
+                "xAOD::WaveformClockAuxInfo#*"
+                ]
+    acc.merge(OutputStreamCfg(flags, "AOD",itemList))
+    ostream = acc.getEventAlgo("OutputStreamAOD")
+    ostream.TakeItemsFromInput = True
+    return acc
+
 
 def FaserActsKalmanFilterCfg(flags, **kwargs):
     acc = ComponentAccumulator()
     trajectory_writer_tool = CompFactory.TrajectoryWriterTool()
     trajectory_writer_tool.FilePath = "KalmanFilterTrajectories.root"
     track_finder_tool = CompFactory.SegmentFitTrackFinderTool()
+    # track_finder_tool.covLoc0 = 1e-3
+    # track_finder_tool.covLoc1 = 3.61e-4
+    # track_finder_tool.covPhi = 1.1e-3
+    # track_finder_tool.covTheta = 8.4e-8
+    # track_finder_tool.covQOverP = 1e-3
     track_finder_tool.covLoc0 = 1e-4
     track_finder_tool.covLoc1 = 1e-4
     track_finder_tool.covPhi = 1e-4
@@ -68,7 +99,12 @@ def FaserActsKalmanFilterCfg(flags, **kwargs):
     # track_finder_tool.covMeas01 = 0.01
     # track_finder_tool.covMeas10 = 0.01
     # track_finder_tool.covMeas11 = 0.64
-    #
+    # track_finder_tool.covLoc0 = 1e-4
+    # track_finder_tool.covLoc1 = 1e-4
+    # track_finder_tool.covPhi = 1e-4
+    # track_finder_tool.covTheta = 1e-4
+    # track_finder_tool.covQOverP = 1e-4
+
     # track_finder_tool.covLoc0 = 1e-1
     # track_finder_tool.covLoc1 = 1e-1
     # track_finder_tool.covPhi = 1e-1
@@ -102,4 +138,6 @@ def FaserActsKalmanFilterCfg(flags, **kwargs):
     kalman_filter.TrackFinderTool = track_finder_tool
     kalman_filter.ActsLogging = "INFO"
     acc.addEventAlgo(kalman_filter)
+    acc.merge(FaserActsKalmanFilter_OutputCfg(flags))
+    acc.merge(FaserActsKalmanFilter_OutputAODCfg(flags))
     return acc
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/FaserActsKalmanFilterAlg.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/FaserActsKalmanFilterAlg.cxx
index 6f5207e06d5dbd4e99912e9d9365f35317fbb386..a31bf4ba89722e01ab283a10ff3fec3ddb19aaa0 100755
--- a/Tracking/Acts/FaserActsKalmanFilter/src/FaserActsKalmanFilterAlg.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/FaserActsKalmanFilterAlg.cxx
@@ -46,6 +46,8 @@
 #include "FaserActsGeometry/IFaserActsPropStepRootWriterSvc.h"
 #include "FaserActsGeometry/FaserActsDetectorElement.h"
 
+#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h"
+
 //ROOT
 #include <TTree.h>
 
@@ -79,6 +81,8 @@ StatusCode FaserActsKalmanFilterAlg::initialize() {
   ATH_CHECK(m_trackFinderTool.retrieve());
   ATH_CHECK(m_trajectoryWriterTool.retrieve());
   ATH_CHECK(m_protoTrackWriterTool.retrieve());
+  ATH_CHECK(m_trackCollection.initialize());
+  ATH_CHECK(detStore()->retrieve(m_idHelper,"FaserSCT_ID"));
   m_fit = makeTrackFitterFunction(m_trackingGeometryTool->trackingGeometry());
   if (m_actsLogging == "VERBOSE") {
     m_logger = Acts::getDefaultLogger("KalmanFitter", Acts::Logging::VERBOSE);
@@ -95,7 +99,10 @@ StatusCode FaserActsKalmanFilterAlg::initialize() {
 StatusCode FaserActsKalmanFilterAlg::execute() {
   const EventContext& ctx = Gaudi::Hive::currentContext();
 
-  ATH_MSG_VERBOSE(name() << "::" << __FUNCTION__);
+  //make TrackCollection
+  ATH_CHECK(m_trackCollection.initialize());
+  SG::WriteHandle<TrackCollection> trackContainer{m_trackCollection,ctx};
+  std::unique_ptr<TrackCollection> outputTracks = std::make_unique<TrackCollection>();
 
   std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry
       = m_trackingGeometryTool->trackingGeometry();
@@ -114,6 +121,9 @@ StatusCode FaserActsKalmanFilterAlg::execute() {
       m_trackFinderTool->sourceLinks();
   std::shared_ptr<std::vector<Measurement>> measurements =
       m_trackFinderTool->measurements();
+  // FIXME this will only work for SegmentFitTrackFinder
+  std::shared_ptr<std::vector<Tracker::FaserSCT_SpacePoint>> spacePoints =
+      m_trackFinderTool->spacePoints();
   ATH_CHECK(m_protoTrackWriterTool->write(initialTrackParameters, measurements, geoctx));
 
   TrajectoryContainer trajectories;
@@ -140,6 +150,10 @@ StatusCode FaserActsKalmanFilterAlg::execute() {
   if (result.ok()) {
     // Get the fit output object
     const auto& fitOutput = result.value();
+    std::unique_ptr<Trk::Track> track = makeTrack(geoctx, result, *spacePoints);
+    if (track) {
+      outputTracks->push_back(std::move(track));
+    }
 
     // The track entry indices container. One element here.
     std::vector<size_t> trackTips;
@@ -170,6 +184,9 @@ StatusCode FaserActsKalmanFilterAlg::execute() {
 
   std::vector<Acts::CurvilinearTrackParameters> initialTrackParametersVector {*initialTrackParameters};
   m_trajectoryWriterTool->writeout(trajectories, geoctx, initialTrackParametersVector);
+
+  ATH_CHECK(trackContainer.record(std::move(outputTracks)));
+
   return StatusCode::SUCCESS;
 }
 
@@ -187,4 +204,116 @@ Acts::MagneticFieldContext FaserActsKalmanFilterAlg::getMagneticFieldContext(con
   }
   const FaserFieldCacheCondObj* fieldCondObj{*readHandle};
   return Acts::MagneticFieldContext(fieldCondObj);
-}
\ No newline at end of file
+}
+
+
+std::unique_ptr<Trk::Track>
+FaserActsKalmanFilterAlg::makeTrack(Acts::GeometryContext& geoCtx, TrackFitterResult& fitResult, std::vector<Tracker::FaserSCT_SpacePoint> sps) const {
+  std::unique_ptr<Trk::Track> newtrack = nullptr;
+  //Get the fit output object
+  const auto& fitOutput = fitResult.value();
+  if (fitOutput.fittedParameters) {
+    DataVector<const Trk::TrackStateOnSurface>* finalTrajectory = new DataVector<const Trk::TrackStateOnSurface>{};
+    std::vector<std::unique_ptr<const Acts::BoundTrackParameters>> actsSmoothedParam;
+    // Loop over all the output state to create track state
+    fitOutput.fittedStates.visitBackwards(fitOutput.lastMeasurementIndex, [&](const auto &state) {
+      auto flag = state.typeFlags();
+      if (state.referenceSurface().associatedDetectorElement() != nullptr) {
+        //	const auto* actsElement = dynamic_cast<const FaserActsDetectorElement*>(state.referenceSurface().associatedDetectorElement());
+        //	if (actsElement != nullptr ){
+        // We need to determine the type of state
+        std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
+        const Trk::TrackParameters *parm;
+
+        // State is a hole (no associated measurement), use predicted para meters
+        if (flag[Acts::TrackStateFlag::HoleFlag] == true) {
+          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
+                                                     state.predicted(),
+                                                     state.predictedCovariance());
+          parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
+          // auto boundaryCheck = m_boundaryCheckTool->boundaryCheck(*p arm);
+          typePattern.set(Trk::TrackStateOnSurface::Hole);
+        }
+          // The state was tagged as an outlier, use filtered parameters
+        else if (flag[Acts::TrackStateFlag::OutlierFlag] == true) {
+          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
+                                                     state.filtered(), state.filteredCovariance());
+          parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
+          typePattern.set(Trk::TrackStateOnSurface::Outlier);
+        }
+          // The state is a measurement state, use smoothed parameters
+        else {
+          const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
+                                                     state.smoothed(), state.smoothedCovariance());
+          actsSmoothedParam.push_back(std::make_unique<const Acts::BoundTrackParameters>(Acts::BoundTrackParameters(actsParam)));
+          //  const auto& psurface=actsParam.referenceSurface();
+          Acts::Vector2 local(actsParam.parameters()[Acts::eBoundLoc0], actsParam.parameters()[Acts::eBoundLoc1]);
+          //  const Acts::Vector3 dir = Acts::makeDirectionUnitFromPhiTheta(actsParam.parameters()[Acts::eBoundPhi], actsParam.parameters()[Acts::eBoundTheta]);
+          //  auto pos=actsParam.position(tgContext);
+          parm = ConvertActsTrackParameterToATLAS(actsParam, geoCtx);
+          typePattern.set(Trk::TrackStateOnSurface::Measurement);
+        }
+        Tracker::FaserSCT_ClusterOnTrack* measState = nullptr;
+        if (state.hasUncalibrated()) {
+          auto sp= sps.at(state.uncalibrated().index());
+          //const Tracker::FaserSCT_Cluster* fitCluster=&sp;
+          const Tracker::FaserSCT_Cluster* fitCluster=sp.clusterList().first;
+          if(fitCluster != nullptr) {
+            if (fitCluster->detectorElement() != nullptr) {
+              measState = new Tracker::FaserSCT_ClusterOnTrack{
+                  fitCluster,
+                  Trk::LocalParameters{
+                      Trk::DefinedParameter{fitCluster->localPosition()[0], Trk::loc1},
+                      Trk::DefinedParameter{fitCluster->localPosition()[1], Trk::loc2}
+                  },
+                  fitCluster->localCovariance(),
+                  m_idHelper->wafer_hash(fitCluster->detectorElement()->identify())
+              };
+            }
+          }
+        }
+        double nDoF = state.calibratedSize();
+        const Trk::FitQualityOnSurface *quality = new Trk::FitQualityOnSurface(state.chi2(), nDoF);
+        const Trk::TrackStateOnSurface *perState = new Trk::TrackStateOnSurface(measState, parm, quality, nullptr, typePattern);
+        // If a state was succesfully created add it to the trajectory
+        if (perState) {
+          finalTrajectory->insert(finalTrajectory->begin(), perState);
+        }
+      }
+      return;
+    });
+
+    // Create the track using the states
+    const Trk::TrackInfo newInfo(Trk::TrackInfo::TrackFitter::KalmanFitter, Trk::ParticleHypothesis::muon);
+    // Trk::FitQuality* q = nullptr;
+    // newInfo.setTrackFitter(Trk::TrackInfo::TrackFitter::KalmanFitter     ); //Mark the fitter as KalmanFitter
+    newtrack = std::make_unique<Trk::Track>(newInfo, std::move(*finalTrajectory), nullptr);
+  }
+  return newtrack;
+}
+
+const Trk::TrackParameters*
+FaserActsKalmanFilterAlg ::ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const      {
+  using namespace Acts::UnitLiterals;
+  std::optional<AmgSymMatrix(5)> cov = std::nullopt;
+  if (actsParameter.covariance()){
+    AmgSymMatrix(5) newcov(actsParameter.covariance()->topLeftCorner(5, 5));
+    // Convert the covariance matrix to GeV
+    for(int i=0; i < newcov.rows(); i++){
+      newcov(i, 4) = newcov(i, 4)*1_MeV;
+    }
+    for(int i=0; i < newcov.cols(); i++){
+      newcov(4, i) = newcov(4, i)*1_MeV;
+    }
+    cov =  std::optional<AmgSymMatrix(5)>(newcov);
+  }
+  const Amg::Vector3D& pos=actsParameter.position(gctx);
+  double tphi=actsParameter.get<Acts::eBoundPhi>();
+  double ttheta=actsParameter.get<Acts::eBoundTheta>();
+  double tqOverP=actsParameter.get<Acts::eBoundQOverP>()*1_MeV;
+  double p = std::abs(1. / tqOverP);
+  Amg::Vector3D tmom(p * std::cos(tphi) * std::sin(ttheta), p * std::sin(tphi) * std::sin(ttheta), p * std::cos(ttheta));
+  const Trk::CurvilinearParameters * curv = new Trk::CurvilinearParameters(pos,tmom,tqOverP>0, cov);
+  return curv;
+}
+
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/SegmentFitTrackFinderTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/SegmentFitTrackFinderTool.cxx
index 12ee0cae5609e33a477f2724f083a03909b32fad..0aa77c3e8b3f18a75b55aafb730e216e388c10f5 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/SegmentFitTrackFinderTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/SegmentFitTrackFinderTool.cxx
@@ -73,6 +73,7 @@ StatusCode SegmentFitTrackFinderTool::run() {
   std::array<Acts::BoundIndices, kSize> Indices = {Acts::eBoundLoc0, Acts::eBoundLoc1};
   std::vector<IndexSourceLink> sourceLinks;
   std::vector<Measurement> measurements;
+  std::vector<Tracker::FaserSCT_SpacePoint> spacePoints {};
   for (const FaserSCT_SpacePointCollection* spacePointCollection : *spacePointContainer) {
     for (const Tracker::FaserSCT_SpacePoint *spacePoint: *spacePointCollection) {
       Identifier id1 = spacePoint->cluster1()->identify();
@@ -80,6 +81,7 @@ StatusCode SegmentFitTrackFinderTool::run() {
       // check if both clusters have been used to reconstruct track
       if (std::find(trackIds.begin(), trackIds.end(), id1) != trackIds.end() &&
           std::find(trackIds.begin(), trackIds.end(), id2) != trackIds.end()) {
+        spacePoints.push_back(*spacePoint);
         Identifier id = spacePoint->associatedSurface().associatedDetectorElementIdentifier();
         // create source link
         Acts::GeometryIdentifier geoId = identifierMap->at(id);
@@ -95,6 +97,7 @@ StatusCode SegmentFitTrackFinderTool::run() {
   }
   m_sourceLinks = std::make_shared<std::vector<IndexSourceLink>>(sourceLinks);
   m_measurements = std::make_shared<std::vector<Measurement>>(measurements);
+  m_spacePoints = std::make_shared<std::vector<Tracker::FaserSCT_SpacePoint>>(spacePoints);
 
   // TODO how should we handle events without a track in each station?
   if (positions.size() != 3) {
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx
index 85b1036e415fb3f28f9f6b8ee37679afb60304bd..f5b850d8a05877b9d7d48db65faadbff7cfac519 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/TruthBasedInitialParameterTool.cxx
@@ -51,8 +51,6 @@ Acts::CurvilinearTrackParameters TruthBasedInitialParameterTool::getInitialParam
     }
   }
 
-  std::cout << "?? px = " << momentum.x() << " py = " << momentum.y() << " pz = " << momentum.z() << std::endl;
-
   Acts::Vector3 truthVertex = {vertex.x(), vertex.y(), vertex.z()}; // in mm
   Acts::Vector3 truthMomentum = {momentum.x() / 1000, momentum.y() / 1000, momentum.z() / 1000}; // in GeV
   m_simWriterTool->writeout(truthVertex, truthMomentum);
diff --git a/Tracking/Acts/FaserActsKalmanFilter/test/FaserActsKalmanFilterAlg.py b/Tracking/Acts/FaserActsKalmanFilter/test/FaserActsKalmanFilterAlg.py
index c8f9fcd8010cb94155bab2028bff0bc372b98441..a3f1ccacd536a7d821903cd02ea3219290a1ebc1 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/test/FaserActsKalmanFilterAlg.py
+++ b/Tracking/Acts/FaserActsKalmanFilter/test/FaserActsKalmanFilterAlg.py
@@ -11,6 +11,7 @@ from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
 from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
 from TrackerPrepRawDataFormation.TrackerPrepRawDataFormationConfig import FaserSCT_ClusterizationCfg
+from TrackerSegmentFit.TrackerSegmentFitConfig import SegmentFitAlgCfg
 from TrackerSpacePointFormation.TrackerSpacePointFormationConfig import TrackerSpacePointFinderCfg
 from TruthSeededTrackFinder.TruthSeededTrackFinderConfig import TruthSeededTrackFinderCfg
 from FaserActsKalmanFilter.FaserActsKalmanFilterConfig import FaserActsKalmanFilterCfg
@@ -34,10 +35,11 @@ acc.merge(PoolReadCfg(ConfigFlags))
 
 # Inner Detector
 acc.merge(FaserSCT_ClusterizationCfg(ConfigFlags))
+acc.merge(SegmentFitAlgCfg(ConfigFlags))
 acc.merge(TrackerSpacePointFinderCfg(ConfigFlags))
 acc.merge(TruthSeededTrackFinderCfg(ConfigFlags))
 acc.merge(FaserActsKalmanFilterCfg(ConfigFlags))
-acc.getEventAlgo("FaserActsKalmanFilterAlg").OutputLevel = DEBUG
+# acc.getEventAlgo("FaserActsKalmanFilterAlg").OutputLevel = DEBUG
 
 # logging.getLogger('forcomps').setLevel(VERBOSE)
 # acc.foreach_component("*").OutputLevel = VERBOSE
@@ -48,5 +50,5 @@ acc.getEventAlgo("FaserActsKalmanFilterAlg").OutputLevel = DEBUG
 # ConfigFlags.dump()
 
 # Execute and finish
-sc = acc.run(maxEvents=1000)
+sc = acc.run(maxEvents=100)
 sys.exit(not sc.isSuccess())
diff --git a/Tracking/Acts/FaserActsKalmanFilter/test/TI12KalmanFilter.py b/Tracking/Acts/FaserActsKalmanFilter/test/TI12KalmanFilter.py
new file mode 100644
index 0000000000000000000000000000000000000000..0a8dc9ae131fb78410da19250f36155e12912367
--- /dev/null
+++ b/Tracking/Acts/FaserActsKalmanFilter/test/TI12KalmanFilter.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+
+import sys
+from AthenaCommon.Logging import log, logging
+from AthenaCommon.Constants import DEBUG, VERBOSE, INFO
+from AthenaCommon.Configurable import Configurable
+from CalypsoConfiguration.AllConfigFlags import ConfigFlags
+from AthenaConfiguration.TestDefaults import defaultTestFiles
+from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
+from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
+from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
+from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
+from FaserByteStreamCnvSvc.FaserByteStreamCnvSvcConfig import FaserByteStreamCnvSvcCfg
+from TrackerPrepRawDataFormation.TrackerPrepRawDataFormationConfig import FaserSCT_ClusterizationCfg
+from TrackerSegmentFit.TrackerSegmentFitConfig import SegmentFitAlgCfg
+from TrackerSpacePointFormation.TrackerSpacePointFormationConfig import TrackerSpacePointFinderCfg
+from FaserActsKalmanFilter.FaserActsKalmanFilterConfig import FaserActsKalmanFilterCfg
+
+
+log.setLevel(DEBUG)
+Configurable.configurableRun3Behavior = True
+
+# Configure
+ConfigFlags.Input.Files = ['MiddleStationTrack.raw']
+ConfigFlags.Output.ESDFileName = "MiddleStation-KalmanFilter.ESD.pool.root"
+ConfigFlags.Output.AODFileName = "MiddleStation-KalmanFilter.AOD.pool.root"
+ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-01"
+ConfigFlags.IOVDb.DatabaseInstance = "OFLP200"
+ConfigFlags.Input.ProjectName = "data21"
+ConfigFlags.Input.isMC = False
+ConfigFlags.GeoModel.FaserVersion = "FASER-01"
+ConfigFlags.Common.isOnline = False
+ConfigFlags.GeoModel.Align.Dynamic = False
+ConfigFlags.Beam.NumberOfCollisions = 0.
+ConfigFlags.Detector.GeometryFaserSCT = True
+ConfigFlags.lock()
+
+# Core components
+acc = MainServicesCfg(ConfigFlags)
+acc.merge(FaserByteStreamCnvSvcCfg(ConfigFlags))
+acc.merge(FaserSCT_ClusterizationCfg(ConfigFlags))
+acc.merge(SegmentFitAlgCfg(ConfigFlags))
+acc.merge(TrackerSpacePointFinderCfg(ConfigFlags))
+acc.merge(FaserActsKalmanFilterCfg(ConfigFlags))
+acc.getEventAlgo("FaserActsKalmanFilterAlg").OutputLevel = DEBUG
+
+replicaSvc = acc.getService("DBReplicaSvc")
+replicaSvc.COOLSQLiteVetoPattern = ""
+replicaSvc.UseCOOLSQLite = True
+replicaSvc.UseCOOLFrontier = False
+replicaSvc.UseGeomSQLite = True
+
+
+# logging.getLogger('forcomps').setLevel(VERBOSE)
+# acc.foreach_component("*").OutputLevel = VERBOSE
+# acc.foreach_component("*ClassID*").OutputLevel = INFO
+# acc.getService("StoreGateSvc").Dump = True
+# acc.getService("ConditionStore").Dump = True
+# acc.printConfig(withDetails=True)
+# ConfigFlags.dump()
+
+# Execute and finish
+sc = acc.run(maxEvents=-1)
+sys.exit(not sc.isSuccess())