diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.cxx
index 9a9bf115ca2db5ecd5e9a4b6f9a7e39a2a96ab11..8a7454564051ecb7089c5e31ba78d5295981afeb 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.cxx
@@ -3,6 +3,7 @@
 
 #include <Acts/EventData/MultiTrajectoryHelpers.hpp>
 #include "TrackerIdentifier/FaserSCT_ID.h"
+#include "FaserActsKalmanFilter/IndexSourceLink.h"
 
 CreateTrkTrackTool::CreateTrkTrackTool(const std::string& type, const std::string& name, const IInterface* parent) :
     AthAlgTool( type, name, parent ) {}
@@ -17,56 +18,56 @@ StatusCode CreateTrkTrackTool::finalize() {
 }
 
 std::unique_ptr<Trk::Track>
-CreateTrkTrackTool::createTrack(const Acts::GeometryContext &gctx, const FaserActsRecMultiTrajectory &traj, bool backwardPropagation) const {
+CreateTrkTrackTool::createTrack(const Acts::GeometryContext &gctx, const CreateTrkTrackTool::TrackContainer::TrackProxy &track, bool backwardPropagation) const {
   std::unique_ptr<Trk::Track> newtrack = nullptr;
   DataVector<const Trk::TrackStateOnSurface>* finalTrajectory = new DataVector<const Trk::TrackStateOnSurface>{};
-  using ConstTrackStateProxy = Acts::detail_lt::TrackStateProxy<IndexSourceLink, 6, true>;
-  auto trajState = Acts::MultiTrajectoryHelpers::trajectoryState(traj.multiTrajectory(), traj.tips().front());
-  traj.multiTrajectory().visitBackwards(traj.tips().front(), [&](const ConstTrackStateProxy& state) {
+  // Loop over all the output state to create track state
+  for (const auto& state : track.trackStatesReversed()) {
     auto flag = state.typeFlags();
     if (state.referenceSurface().associatedDetectorElement() != nullptr) {
       std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
-      const Trk::TrackParameters *parm;
+      std::unique_ptr<Trk::TrackParameters> parm;
 
-      if (flag[Acts::TrackStateFlag::HoleFlag]) {
+      if (flag.test(Acts::TrackStateFlag::HoleFlag)) {
+        //todo: make the particle hypothesis configurable
         const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                   state.predicted(), state.predictedCovariance());
-        parm = ConvertActsTrackParameterToATLAS(actsParam, gctx);
+                                                   state.predicted(), state.predictedCovariance(), Acts::ParticleHypothesis::pion());
+        parm = std::move(ConvertActsTrackParameterToATLAS(actsParam, gctx));
         typePattern.set(Trk::TrackStateOnSurface::Hole);
       }
-      else if (flag[Acts::TrackStateFlag::OutlierFlag]) {
+      else if (flag.test(Acts::TrackStateFlag::OutlierFlag)) {
         const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                   state.filtered(), state.filteredCovariance());
-        parm = ConvertActsTrackParameterToATLAS(actsParam, gctx);
+                                                   state.filtered(), state.filteredCovariance(), Acts::ParticleHypothesis::pion());
+        parm = std::move(ConvertActsTrackParameterToATLAS(actsParam, gctx));
         typePattern.set(Trk::TrackStateOnSurface::Outlier);
       }
       else {
         const Acts::BoundTrackParameters actsParam(state.referenceSurface().getSharedPtr(),
-                                                   state.smoothed(), state.smoothedCovariance());
-        parm = ConvertActsTrackParameterToATLAS(actsParam, gctx);
+                                                   state.smoothed(), state.smoothedCovariance(), Acts::ParticleHypothesis::pion());
+        parm = std::move(ConvertActsTrackParameterToATLAS(actsParam, gctx));
         typePattern.set(Trk::TrackStateOnSurface::Measurement);
       }
-      Tracker::FaserSCT_ClusterOnTrack* clusterOnTrack = nullptr;
-      if (state.hasUncalibrated()) {
-        const Tracker::FaserSCT_Cluster* cluster = state.uncalibrated().hit();
+      std::unique_ptr<Tracker::FaserSCT_ClusterOnTrack> clusterOnTrack = nullptr;
+      if (state.hasUncalibratedSourceLink()) {
+        const Tracker::FaserSCT_Cluster* cluster = state.getUncalibratedSourceLink().template get<IndexSourceLink>().hit();
         if (cluster->detectorElement() != nullptr) {
-          clusterOnTrack = new Tracker::FaserSCT_ClusterOnTrack{
+          clusterOnTrack = std::make_unique<Tracker::FaserSCT_ClusterOnTrack>(
               cluster,
               Trk::LocalParameters{
                   Trk::DefinedParameter{cluster->localPosition()[0], Trk::loc1},
                   Trk::DefinedParameter{cluster->localPosition()[1], Trk::loc2}
               },
-              cluster->localCovariance(),
+              Amg::MatrixX(cluster->localCovariance()),
               m_idHelper->wafer_hash(cluster->detectorElement()->identify())
-          };
+          );
         }
       }
       double nDoF = state.calibratedSize();
       const Trk::FitQualityOnSurface* quality = new Trk::FitQualityOnSurface(state.chi2(), nDoF);
       const Trk::TrackStateOnSurface* perState = new Trk::TrackStateOnSurface(
-									      clusterOnTrack, 
-									      parm,
-									      quality,
+									      *quality,
+									      std::move(clusterOnTrack), 
+									      std::move(parm),
 									      nullptr,
 									      typePattern);
       if ((perState) && (!backwardPropagation)) {
@@ -75,20 +76,19 @@ CreateTrkTrackTool::createTrack(const Acts::GeometryContext &gctx, const FaserAc
 	        finalTrajectory->push_back(perState);
       }
     }
-    return;
-  });
+  }
 
-  Trk::FitQuality* q = new Trk::FitQuality {trajState.chi2Sum, static_cast<double>(trajState.nMeasurements - 5)};
+  std::unique_ptr<Trk::FitQuality> q = std::make_unique<Trk::FitQuality>(track.chi2(), static_cast<double>(track.nMeasurements() - 5));
   Trk::TrackInfo newInfo(Trk::TrackInfo::TrackFitter::KalmanFitter, Trk::ParticleHypothesis::muon);
   std::unique_ptr<DataVector<const Trk::TrackStateOnSurface>> sink(finalTrajectory);
   // newtrack = std::make_unique<Trk::Track>(newInfo, std::move(*finalTrajectory), quality);
-  Trk::Track* tmpTrack = new Trk::Track(newInfo, std::move(*sink), q);
+  Trk::Track* tmpTrack = new Trk::Track(newInfo, std::move(sink), std::move(q));
   newtrack = std::unique_ptr<Trk::Track>(tmpTrack);
   return newtrack;
 }
 
 
-const Trk::TrackParameters*
+std::unique_ptr<Trk::TrackParameters>
 CreateTrkTrackTool::ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const {
   using namespace Acts::UnitLiterals;
   std::optional<AmgSymMatrix(5)> cov = std::nullopt;
@@ -110,6 +110,5 @@ CreateTrkTrackTool::ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParam
   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));
   double charge = tqOverP > 0. ? 1. : -1.;
-  const Trk::CurvilinearParameters * curv = new Trk::CurvilinearParameters(pos,tmom,charge, cov);
-  return curv;
+  return std::make_unique<Trk::CurvilinearParameters>(pos,tmom,charge, cov);
 }
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.h
index 5fcf1f8c47d0fa0b95044d8237362b6d11f2a2a1..88be350103cdc74a08ef8744208f8d8b6f15f0d7 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CreateTrkTrackTool.h
@@ -7,21 +7,29 @@
 #include "TrkParameters/TrackParameters.h"
 #include "Acts/Geometry/GeometryContext.hpp"
 #include "Acts/EventData/TrackParameters.hpp"
-#include "FaserActsRecMultiTrajectory.h"
+#include "Acts/EventData/TrackContainer.hpp"
+#include "Acts/EventData/TrackProxy.hpp"
+#include "Acts/EventData/VectorTrackContainer.hpp"
+#include "Acts/EventData/VectorMultiTrajectory.hpp"
+//#include "FaserActsRecMultiTrajectory.h"
 
 
 class FaserSCT_ID;
 
 class CreateTrkTrackTool: public AthAlgTool {
 public:
+  using TrackContainer =
+      Acts::TrackContainer<Acts::VectorTrackContainer,
+                           Acts::VectorMultiTrajectory, std::shared_ptr>;
+ 
   CreateTrkTrackTool(const std::string &type, const std::string &name, const IInterface *parent);
   virtual ~CreateTrkTrackTool() = default;
   virtual StatusCode initialize() override;
   virtual StatusCode finalize() override;
-  std::unique_ptr<Trk::Track> createTrack(const Acts::GeometryContext &gctx, const FaserActsRecMultiTrajectory &traj, bool backwardPropagation=false) const;
-  const Trk::TrackParameters* ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const;
+  std::unique_ptr<Trk::Track> createTrack(const Acts::GeometryContext &gctx, const TrackContainer::TrackProxy &track, bool backwardPropagation=false) const;
+  std::unique_ptr<Trk::TrackParameters> ConvertActsTrackParameterToATLAS(const Acts::BoundTrackParameters &actsParameter, const Acts::GeometryContext& gctx) const;
 private:
   const FaserSCT_ID* m_idHelper {nullptr};
 };
 
-#endif //FASERACTSKALMANFILTER_CREATETRKTRACKTOOL_H
\ No newline at end of file
+#endif //FASERACTSKALMANFILTER_CREATETRKTRACKTOOL_H