diff --git a/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt b/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt
index 55931d32c715e41b22c094667bcbc8b4ad09be3c..96bec207bbe1220239e15ae37f89e4c5e3e41aba 100755
--- a/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt
+++ b/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt
@@ -28,11 +28,13 @@ atlas_add_component(FaserActsKalmanFilter
     ActsTrackSeedTool.h
     CircleFit.h
     CircleFitTrackSeedTool.h
-#todo    CKF2.h
+    CKF2.h
     # CKF2Alignment.h
     CombinatorialKalmanFilterAlg.h
     EffPlotTool.h
     FASERSourceLink.h
+    TrackFitterFunction.h
+    TrackFinderFunction.h
     FaserActsKalmanFilter/FaserActsGeometryContainers.h
     FaserActsKalmanFilterAlg.h
     FaserActsRecMultiTrajectory.h
@@ -73,13 +75,15 @@ atlas_add_component(FaserActsKalmanFilter
     src/ActsTrackSeedTool.cxx
     src/CircleFit.cxx
     src/CircleFitTrackSeedTool.cxx
-#todo    src/CKF2.cxx
+    src/CKF2.cxx
     # src/CKF2Alignment.cxx
     src/CreateTrkTrackTool.h
     src/CreateTrkTrackTool.cxx
 #    src/ClusterTrackSeedTool.cxx
 #todo    src/CombinatorialKalmanFilterAlg.cxx
 #todo    src/EffPlotTool.cxx
+    src/TrackFitterFunction.cxx
+    src/TrackFinderFunction.cxx
     src/FaserActsKalmanFilterAlg.cxx
     src/FiducialParticleTool.h
     src/FiducialParticleTool.cxx
@@ -100,7 +104,6 @@ atlas_add_component(FaserActsKalmanFilter
 #todo    src/SPSimpleInitialParameterTool.cxx
 #    src/ProtoTrackWriterTool.cxx
 #todo    src/TrackFindingAlgorithmFunction.cxx
-    src/TrackFittingFunction.cxx
 #todo    src/TrajectoryWriterTool.cxx
     src/TruthBasedInitialParameterTool.cxx
     src/SummaryPlotTool.cxx
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
index 87380dd7e41cb3d5b38d2f4b92ca784b95eca8b2..2b24440c888251ff030d204e7edf4fc5b6b96bdc 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
@@ -3,8 +3,8 @@
 #include "StoreGate/ReadHandle.h"
 #include "StoreGate/ReadCondHandleKey.h"
 #include "StoreGate/WriteDecorHandle.h"
-#include "TrackerSpacePoint/FaserSCT_SpacePointCollection.h"
 #include "TrackerSpacePoint/FaserSCT_SpacePoint.h"
+#include "TrackerSpacePoint/FaserSCT_SpacePointCollection.h"
 #include "TrackerIdentifier/FaserSCT_ID.h"
 #include "TrkPrepRawData/PrepRawData.h"
 #include "TrackerPrepRawData/FaserSCT_Cluster.h"
@@ -16,7 +16,6 @@
 #include "Acts/EventData/TrackParameters.hpp"
 #include "FaserActsKalmanFilter/IndexSourceLink.h"
 #include "FaserActsKalmanFilter/Measurement.h"
-#include "FaserActsRecMultiTrajectory.h"
 #include "Acts/Surfaces/PerigeeSurface.hpp"
 #include "Acts/MagneticField/MagneticFieldContext.hpp"
 #include "TrackSelection.h"
@@ -32,11 +31,9 @@
 #include "Acts/EventData/Measurement.hpp"
 #include "Acts/Propagator/PropagatorError.hpp"
 #include "Acts/TrackFinding/CombinatorialKalmanFilterError.hpp"
+#include "Acts/EventData/ProxyAccessor.hpp"
 
-size_t CKF2::TrajectoryInfo::nClusters {0};
-
-using TrajectoriesContainer = std::vector<FaserActsRecMultiTrajectory>;
-//std::array<Acts::BoundIndices, 2> indices = {Acts::eBoundLoc0, Acts::eBoundLoc1};
+size_t CKF2::TrackInfo::nClusters {0};
 
 
 CKF2::CKF2(const std::string& name, ISvcLocator* pSvcLocator) :
@@ -52,19 +49,18 @@ StatusCode CKF2::initialize() {
   ATH_CHECK(m_trackCollection.initialize());
   // ATH_CHECK(m_allTrackCollection.initialize());
   ATH_CHECK(m_eventInfoKey.initialize());
-  if (m_performanceWriter && !m_noDiagnostics) {
-    ATH_CHECK(m_performanceWriterTool.retrieve());
-  }
-  if (m_statesWriter && !m_noDiagnostics) {
-    ATH_CHECK(m_trajectoryStatesWriterTool.retrieve());
-  }
-  if (m_summaryWriter && !m_noDiagnostics) {
-    ATH_CHECK(m_trajectorySummaryWriterTool.retrieve());
-  }
+  
+//todo  if (m_performanceWriter && !m_noDiagnostics) {
+//todo    ATH_CHECK(m_performanceWriterTool.retrieve());
+//todo  }
+//todo  if (m_statesWriter && !m_noDiagnostics) {
+//todo    ATH_CHECK(m_trajectoryStatesWriterTool.retrieve());
+//todo  }
+//todo  if (m_summaryWriter && !m_noDiagnostics) {
+//todo    ATH_CHECK(m_trajectorySummaryWriterTool.retrieve());
+//todo  }
   ATH_CHECK(detStore()->retrieve(m_idHelper,"FaserSCT_ID"));
-  m_fit = makeTrackFinderFunction(m_trackingGeometryTool->trackingGeometry(),
-                                  m_resolvePassive, m_resolveMaterial, m_resolveSensitive);
-  m_kf = makeTrackFitterFunction(m_trackingGeometryTool->trackingGeometry());
+
   // FIXME fix Acts logging level
   if (m_actsLogging == "VERBOSE") {
     m_logger = Acts::getDefaultLogger("KalmanFitter", Acts::Logging::VERBOSE);
@@ -74,6 +70,15 @@ StatusCode CKF2::initialize() {
     m_logger = Acts::getDefaultLogger("KalmanFitter", Acts::Logging::INFO);
   }
 
+  auto magneticField = std::make_shared<FASERMagneticFieldWrapper>();
+  double reverseFilteringMomThreshold = 0.1; //@todo: needs to be validated
+  //@todo: the multiple scattering and energy loss are originallly turned off 
+  m_fitter = makeTrackFitterFunction(m_trackingGeometryTool->trackingGeometry(), magneticField, 
+                                  false, false, reverseFilteringMomThreshold, Acts::FreeToBoundCorrection(false), *m_logger);
+ 
+  m_finder = makeTrackFinderFunction(m_trackingGeometryTool->trackingGeometry(), magneticField,
+                                  m_resolvePassive, m_resolveMaterial, m_resolveSensitive, *m_logger);
+
   return StatusCode::SUCCESS;
 }
 
@@ -101,7 +106,7 @@ StatusCode CKF2::execute() {
   CHECK(m_trackSeedTool->run(m_maskedLayers, m_backwardPropagation));
   std::shared_ptr<const Acts::Surface> initialSurface =
       m_trackSeedTool->initialSurface();
-  std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> initialParameters =
+  std::shared_ptr<std::vector<Acts::BoundTrackParameters>> initialParameters =
       m_trackSeedTool->initialTrackParameters();
   std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks =
       m_trackSeedTool->sourceLinks();
@@ -112,22 +117,53 @@ StatusCode CKF2::execute() {
   std::shared_ptr<std::vector<const Tracker::FaserSCT_SpacePoint*>> spacePoints = m_trackSeedTool->spacePoints();
   std::shared_ptr<std::vector<std::array<std::vector<const Tracker::FaserSCT_Cluster*>, 3>>> seedClusters = m_trackSeedTool->seedClusters();
 
-  TrajectoryInfo::nClusters = sourceLinks->size();
-  TrajectoriesContainer trajectories;
-  trajectories.reserve(initialParameters->size());
+  TrackInfo::nClusters = sourceLinks->size();
 
-  Acts::PropagatorPlainOptions pOptions;
-  pOptions.maxSteps = m_maxSteps;
-  if (m_backwardPropagation) {
-    pOptions.direction = Acts::backward;
-  } else {
-    pOptions.direction = Acts::forward;
+  // construct the container 
+  auto allTrackContainer = std::make_shared<Acts::VectorTrackContainer>();
+  auto allTrackStateContainer = std::make_shared<Acts::VectorMultiTrajectory>();
+  auto selectedTrackContainer = std::make_shared<Acts::VectorTrackContainer>();
+  auto selectedTrackStateContainer = std::make_shared<Acts::VectorMultiTrajectory>();
+
+  auto trackContainerTemp = std::make_shared<Acts::VectorTrackContainer>();
+  auto trackStateContainerTemp =
+      std::make_shared<Acts::VectorMultiTrajectory>();
+
+  FaserActsTrackContainer tracks(allTrackContainer, allTrackStateContainer);
+  FaserActsTrackContainer tracksTemp(trackContainerTemp, trackStateContainerTemp);
+  FaserActsTrackContainer selectedTracks(selectedTrackContainer, selectedTrackStateContainer);
+
+  tracks.addColumn<unsigned int>("trackGroup");
+  tracksTemp.addColumn<unsigned int>("trackGroup");
+  selectedTracks.addColumn<unsigned int>("trackGroup");
+  Acts::ProxyAccessor<unsigned int> seedNumber("trackGroup");
+  
+
+//  // Set the CombinatorialKalmanFilter options
+//  CKF2::TrackFinderOptions options(
+//      gctx, magFieldContext, calibContext,
+//      IndexSourceLinkAccessor(), MeasurementCalibrator(*measurements),
+//      Acts::MeasurementSelector(measurementSelectorCfg),
+//      Acts::LoggerWrapper{*m_logger}, pOptions, &(*initialSurface));
+
+
+  //1) calibrator
+  MeasurementCalibratorAdapter calibrator(MeasurementCalibrator(), *measurements);
+
+  //2) slAccessor 
+  IndexSourceLinkContainer tmp;
+  for (const auto& sl : *sourceLinks) {
+    tmp.emplace_hint(tmp.end(), sl);
   }
+  IndexSourceLinkAccessor slAccessor;
+  slAccessor.container = &tmp;
 
+  //3) measurement selector 
   Acts::MeasurementSelector::Config measurementSelectorCfg = {
-      {Acts::GeometryIdentifier(), {m_chi2Max, m_nMax}},
+      {Acts::GeometryIdentifier(), {{}, {m_chi2Max}, {m_nMax}}},
   };
 
+  // configuration of the GeneralFitterOptions 
   Acts::RotationMatrix3 rotation = Acts::RotationMatrix3::Identity();
   rotation.col(0) = Acts::Vector3(0, 0, -1);
   rotation.col(1) = Acts::Vector3(0, 1, 0);
@@ -135,109 +171,73 @@ StatusCode CKF2::execute() {
   Acts::Translation3 trans(0., 0., origin);
   Acts::Transform3 trafo(rotation * trans);
   initialSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(trafo);
+  
+  Acts::PropagatorPlainOptions pOptions;
+  pOptions.maxSteps = m_maxSteps;
+  if (m_backwardPropagation) {
+    pOptions.direction = Acts::Direction::Backward;
+  } else {
+    pOptions.direction = Acts::Direction::Forward;
+  }
+
+  GeneralFitterOptions options{
+    gctx, magFieldContext, calibContext, &(*initialSurface), pOptions};
 
-  // Set the CombinatorialKalmanFilter options
-  CKF2::TrackFinderOptions options(
-      gctx, magFieldContext, calibContext,
-      IndexSourceLinkAccessor(), MeasurementCalibrator(*measurements),
-      Acts::MeasurementSelector(measurementSelectorCfg),
-      Acts::LoggerWrapper{*m_logger}, pOptions, &(*initialSurface));
 
   // Perform the track finding for all initial parameters
   m_numberOfTrackSeeds += initialParameters->size();
   ATH_MSG_DEBUG("Invoke track finding with " << initialParameters->size() << " seeds.");
-  IndexSourceLinkContainer tmp;
-  for (const auto& sl : *sourceLinks) {
-    tmp.emplace_hint(tmp.end(), sl);
-  }
 
-  for (const auto& init : *initialParameters) {
-    ATH_MSG_DEBUG("  position: " << init.position(gctx).transpose());
-    ATH_MSG_DEBUG("  momentum: " << init.momentum().transpose());
-    ATH_MSG_DEBUG("  charge:   " << init.charge());
-  }
+  unsigned int nSeed = 0;
+  std::list<TrackInfo> allTracks;
 
-  auto results = (*m_fit)(tmp, *initialParameters, options);
-
-  // results contain a MultiTrajectory for each track seed with a trajectory of each branch of the CKF.
-  // To simplify the ambiguity solving a list of MultiTrajectories is created, each containing only a single track.
-  std::list<TrajectoryInfo> allTrajectories;
-  for (auto &result : results) {
-    if (not result.ok()) {
-      // TODO use status bits for different errors
-      // result.error() == Acts::CombinatorialKalmanFilterError::NoTrackFound
-      if (result.error() == Acts::PropagatorError::StepCountLimitReached ||
-          result.error() == Acts::CombinatorialKalmanFilterError::PropagationReachesMaxSteps) 
-      {
-          try
-          {
-            if (!eventInfo->updateErrorState(xAOD::EventInfo::SCT, xAOD::EventInfo::Error)) 
-            {
-              ATH_MSG_WARNING ("Cannot set error state for SCT.");
-            }
-          }
-          catch (...)
-          {
-              ATH_MSG_DEBUG ("SCT error state is locked.");
-          }
-      }
+  for (std::size_t iseed = 0; iseed < (*initialParameters).size(); ++iseed) {
+    ATH_MSG_DEBUG("  position: " << (*initialParameters)[iseed].position(gctx).transpose());
+    ATH_MSG_DEBUG("  momentum: " << (*initialParameters)[iseed].momentum().transpose());
+    ATH_MSG_DEBUG("  charge:   " << (*initialParameters)[iseed].charge());
+    // Clear trackContainerTemp and trackStateContainerTemp
+    tracksTemp.clear();
+
+    auto result = (*m_finder)((*initialParameters).at(iseed), options, calibrator, slAccessor, Acts::MeasurementSelector(measurementSelectorCfg), tracksTemp);
+   
+    if (!result.ok()) {
+      ATH_MSG_WARNING("Track finding failed for seed " << iseed << " with error" << result.error());
       continue;
     }
-    CKFResult ckfResult = result.value();
-    for (size_t trackTip : ckfResult.lastMeasurementIndices) {
-      allTrajectories.emplace_back(TrajectoryInfo(FaserActsRecMultiTrajectory(
-          ckfResult.fittedStates, {trackTip}, {{trackTip, ckfResult.fittedParameters.at(trackTip)}})));
+
+    auto& tracksForSeed = result.value();
+    m_numberOfFittedTracks += tracksForSeed.size();
+    for (auto& track : tracksForSeed) {
+      // Set the seed number, this number decrease by 1 since the seed number
+      // has already been updated
+      seedNumber(track) = nSeed - 1;
+      auto destProxy = tracks.getTrack(tracks.addTrack());
+      destProxy.copyFrom(track, true);  // make sure we copy track states!
+      allTracks.push_back(track); 
     }
   }
-  m_numberOfFittedTracks += allTrajectories.size();
 
-  // the list of MultiTrajectories is sorted by the number of measurements using the chi2 value as a tie-breaker
-  allTrajectories.sort([](const TrajectoryInfo &left, const TrajectoryInfo &right) {
+  // the list of tracks is sorted by the number of measurements using the chi2 value as a tie-breaker
+  allTracks.sort([](const TrackInfo &left, const TrackInfo &right) {
     if (left.nMeasurements > right.nMeasurements) return true;
     if (left.nMeasurements < right.nMeasurements) return false;
     if (left.chi2 < right.chi2) return true;
     else return false;
   });
 
-  // select all tracks with at least 13 heats and with 6 or less shared hits, starting from the best track
-  // TODO use Gaudi parameters for the number of hits and shared hits
-  // TODO allow shared hits only in the first station?
-  // std::vector<FaserActsRecMultiTrajectory> rawTrajectories {};
-  // for (auto raw : allTrajectories)
-  // {
-  //   rawTrajectories.push_back(raw.trajectory);
-  // }
-  // for (const FaserActsRecMultiTrajectory &traj : rawTrajectories) {
-  //   const auto params = traj.trackParameters(traj.tips().front());
-  //   ATH_MSG_DEBUG("Fitted parameters (raw)");
-  //   ATH_MSG_DEBUG("  params:   " << params.parameters().transpose());
-  //   ATH_MSG_DEBUG("  position: " << params.position(gctx).transpose());
-  //   ATH_MSG_DEBUG("  momentum: " << params.momentum().transpose());
-  //   ATH_MSG_DEBUG("  charge:   " << params.charge());
-  //   std::unique_ptr<Trk::Track> track = m_createTrkTrackTool->createTrack(gctx, traj, m_backwardPropagation);
-  //   if (track != nullptr) {
-  //     m_numberOfSelectedTracks++;
-  //     std::unique_ptr<Trk::Track> track2 = m_kalmanFitterTool1->fit(ctx, gctx, track.get(), Acts::BoundVector::Zero(), m_isMC);
-  //     if (track2) {
-  //       outputAllTracks->push_back(std::move(track2));
-  //     } else {
-  //       outputAllTracks->push_back(std::move(track));
-  //       ATH_MSG_WARNING("Re-Fit failed.");
-  //     }
-  //   } else {
-  //     ATH_MSG_WARNING("CKF failed.");
-  //   }
-  // }
-
-  std::vector<FaserActsRecMultiTrajectory> selectedTrajectories {};
-  while (not allTrajectories.empty()) {
-    TrajectoryInfo selected = allTrajectories.front();
-    selectedTrajectories.push_back(selected.trajectory);
-    allTrajectories.remove_if([&](const TrajectoryInfo &p) {
+
+  while (not allTracks.empty()) {
+    TrackInfo selected = allTracks.front();
+    
+    auto destProxy = selectedTracks.getTrack(selectedTracks.addTrack());
+    destProxy.copyFrom(selected.track, true);  // make sure we copy track states!
+
+    allTracks.remove_if([&](const TrackInfo &p) {
       return (p.nMeasurements <= 12) || ((p.clusterSet & selected.clusterSet).count() > 6);
     });
   }
 
+/*
   for (const FaserActsRecMultiTrajectory &traj : selectedTrajectories) {
     const auto params = traj.trackParameters(traj.tips().front());
     ATH_MSG_DEBUG("Fitted parameters");
@@ -273,6 +273,8 @@ StatusCode CKF2::execute() {
   }
   // ATH_CHECK(allTrackContainer.record(std::move(outputAllTracks)));
   ATH_CHECK(trackContainer.record(std::move(outputTracks)));
+*/
+
 
   return StatusCode::SUCCESS;
 }
@@ -302,141 +304,47 @@ Acts::MagneticFieldContext CKF2::getMagneticFieldContext(const EventContext& ctx
 
 
 
-void CKF2::computeSharedHits(std::vector<IndexSourceLink>* sourceLinks, TrackFinderResult& results) const {
-  // Compute shared hits from all the reconstructed tracks
-  // Compute nSharedhits and Update ckf results
-  // hit index -> list of multi traj indexes [traj, meas]
-  static_assert(Acts::SourceLinkConcept<IndexSourceLink>,
-                "Source link does not fulfill SourceLinkConcept");
+void CKF2::computeSharedHits(std::vector<IndexSourceLink>* sourceLinks, FaserActsTrackContainer& tracks) const {
 
   std::vector<std::size_t> firstTrackOnTheHit(
       sourceLinks->size(), std::numeric_limits<std::size_t>::max());
   std::vector<std::size_t> firstStateOnTheHit(
       sourceLinks->size(), std::numeric_limits<std::size_t>::max());
 
-  for (unsigned int iresult = 0; iresult < results.size(); iresult++) {
-    if (not results.at(iresult).ok()) {
-      continue;
-    }
-
-    auto& ckfResult = results.at(iresult).value();
-    auto& measIndexes = ckfResult.lastMeasurementIndices;
-
-    for (auto measIndex : measIndexes) {
-      ckfResult.fittedStates.visitBackwards(measIndex, [&](const auto& state) {
-        if (not state.typeFlags().test(Acts::TrackStateFlag::MeasurementFlag))
-          return;
-
-        std::size_t hitIndex = state.uncalibrated().index();
-
-        // Check if hit not already used
-        if (firstTrackOnTheHit.at(hitIndex) ==
-            std::numeric_limits<std::size_t>::max()) {
-          firstTrackOnTheHit.at(hitIndex) = iresult;
-          firstStateOnTheHit.at(hitIndex) = state.index();
-          return;
-        }
-
-        // if already used, control if first track state has been marked
-        // as shared
-        int indexFirstTrack = firstTrackOnTheHit.at(hitIndex);
-        int indexFirstState = firstStateOnTheHit.at(hitIndex);
-        if (not results.at(indexFirstTrack).value().fittedStates.getTrackState(indexFirstState).typeFlags().test(Acts::TrackStateFlag::SharedHitFlag))
-          results.at(indexFirstTrack).value().fittedStates.getTrackState(indexFirstState).typeFlags().set(Acts::TrackStateFlag::SharedHitFlag);
-
-        // Decorate this track
-        results.at(iresult).value().fittedStates.getTrackState(state.index()).typeFlags().set(Acts::TrackStateFlag::SharedHitFlag);
-      });
-    }
-  }
-}
-
-
-namespace {
-
-using Updater = Acts::GainMatrixUpdater;
-using Smoother = Acts::GainMatrixSmoother;
-
-using Stepper = Acts::EigenStepper<>;
-using Navigator = Acts::Navigator;
-using Propagator = Acts::Propagator<Stepper, Navigator>;
-using CKF = Acts::CombinatorialKalmanFilter<Propagator, Updater, Smoother>;
-
-using TrackParametersContainer = std::vector<CKF2::TrackParameters>;
-
-struct TrackFinderFunctionImpl
-    : public CKF2::TrackFinderFunction {
-  CKF trackFinder;
+  for (auto track : tracks) {
+    for (auto state : track.trackStatesReversed()) {
+      if (!state.typeFlags().test(Acts::TrackStateFlag::MeasurementFlag)) {
+        continue;
+      }
 
-  TrackFinderFunctionImpl(CKF&& f) : trackFinder(std::move(f)) {}
+      std::size_t hitIndex = state.getUncalibratedSourceLink()
+                                 .template get<IndexSourceLink>()
+                                 .index();
 
-  CKF2::TrackFinderResult operator()(
-      const IndexSourceLinkContainer& sourcelinks,
-      const TrackParametersContainer& initialParameters,
-      const CKF2::TrackFinderOptions& options)
-  const override {
-    return trackFinder.findTracks(sourcelinks, initialParameters, options);
-  };
-};
+      // Check if hit not already used
+      if (firstTrackOnTheHit.at(hitIndex) ==
+          std::numeric_limits<std::size_t>::max()) {
+        firstTrackOnTheHit.at(hitIndex) = track.index();
+        firstStateOnTheHit.at(hitIndex) = state.index();
+        continue;
+      }
 
-}  // namespace
+      // if already used, control if first track state has been marked
+      // as shared
+      int indexFirstTrack = firstTrackOnTheHit.at(hitIndex);
+      int indexFirstState = firstStateOnTheHit.at(hitIndex);
+  
+      auto firstState = tracks.getTrack(indexFirstTrack)
+                            .container()
+                            .trackStateContainer()
+                            .getTrackState(indexFirstState);
+      if (!firstState.typeFlags().test(Acts::TrackStateFlag::SharedHitFlag)) {
+        firstState.typeFlags().set(Acts::TrackStateFlag::SharedHitFlag);
+      }
 
-std::shared_ptr<CKF2::TrackFinderFunction>
-CKF2::makeTrackFinderFunction(
-    std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry,
-    bool resolvePassive, bool resolveMaterial, bool resolveSensitive) {
-  auto magneticField = std::make_shared<FASERMagneticFieldWrapper>();
-  Stepper stepper(std::move(magneticField));
-  Navigator::Config cfg{trackingGeometry};
-  cfg.resolvePassive = resolvePassive;
-  cfg.resolveMaterial = resolveMaterial;
-  cfg.resolveSensitive = resolveSensitive;
-  Navigator navigator(cfg);
-  Propagator propagator(std::move(stepper), std::move(navigator));
-  CKF trackFinder(std::move(propagator));
-
-  // build the track finder functions. owns the track finder object.
-  return std::make_shared<TrackFinderFunctionImpl>(std::move(trackFinder));
+      // Decorate this track state
+      state.typeFlags().set(Acts::TrackStateFlag::SharedHitFlag);
+    }
+  }
 }
 
-
-namespace {
-
-using Updater = Acts::GainMatrixUpdater;
-using Smoother = Acts::GainMatrixSmoother;
-using Stepper = Acts::EigenStepper<>;
-using Propagator = Acts::Propagator<Stepper, Acts::Navigator>;
-using Fitter = Acts::KalmanFitter<Propagator, Updater, Smoother>;
-
-struct TrackFitterFunctionImpl
-    : public CKF2::TrackFitterFunction {
-  Fitter trackFitter;
-
-  TrackFitterFunctionImpl(Fitter &&f) : trackFitter(std::move(f)) {}
-
-  CKF2::KFResult operator()(
-      const std::vector<IndexSourceLink> &sourceLinks,
-      const Acts::BoundTrackParameters &initialParameters,
-      const CKF2::TrackFitterOptions &options)
-  const override {
-    return trackFitter.fit(sourceLinks, initialParameters, options);
-  };
-};
-
-}  // namespace
-
-
-std::shared_ptr<CKF2::TrackFitterFunction>
-CKF2::makeTrackFitterFunction(
-    std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry) {
-  auto magneticField = std::make_shared<FASERMagneticFieldWrapper>();
-  auto stepper = Stepper(std::move(magneticField));
-  Acts::Navigator::Config cfg{trackingGeometry};
-  cfg.resolvePassive = false;
-  cfg.resolveMaterial = true;
-  cfg.resolveSensitive = true;
-  Acts::Navigator navigator(cfg);
-  Propagator propagator(std::move(stepper), std::move(navigator));
-  Fitter trackFitter(std::move(propagator));
-  return std::make_shared<TrackFitterFunctionImpl>(std::move(trackFitter));
-}
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h
index cd78bf72531931fc3ef7ef3b1b67edc854e46596..d9f717f77731f78bef626f663d457e9c4560efae 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h
@@ -1,11 +1,11 @@
 #ifndef FASERACTSKALMANFILTER_CKF2_H
 #define FASERACTSKALMANFILTER_CKF2_H
 
+#include "TrackFitterFunction.h"
+#include "TrackFinderFunction.h"
 
 #include "AthenaBaseComps/AthReentrantAlgorithm.h"
 #include "AthenaBaseComps/AthAlgorithm.h"
-#include "TrackerSpacePoint/FaserSCT_SpacePointContainer.h"
-#include "TrackerPrepRawData/FaserSCT_ClusterContainer.h"
 #include "FaserActsGeometryInterfaces/IFaserActsTrackingGeometryTool.h"
 #include "Acts/TrackFitting/KalmanFitter.hpp"
 #include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp"
@@ -22,7 +22,8 @@
 #include <boost/dynamic_bitset.hpp>
 #include "CreateTrkTrackTool.h"
 #include "xAODEventInfo/EventInfo.h"
-using ConstTrackStateProxy = Acts::detail_lt::TrackStateProxy<IndexSourceLink, 6, true>;
+
+
 using ClusterSet = boost::dynamic_bitset<>;
 
 class FaserSCT_ID;
@@ -44,71 +45,31 @@ public:
   StatusCode execute() override;
   StatusCode finalize() override;
 
-  using TrackFinderOptions =
-  Acts::CombinatorialKalmanFilterOptions<IndexSourceLinkAccessor,
-      MeasurementCalibrator,
-      Acts::MeasurementSelector>;
-  using CKFResult = Acts::CombinatorialKalmanFilterResult<IndexSourceLink>;
-  using TrackFitterResult = Acts::Result<CKFResult>;
-  using TrackFinderResult = std::vector<TrackFitterResult>;
-
-  using KFResult =
-    Acts::Result<Acts::KalmanFitterResult<IndexSourceLink>>;
-
-  using TrackFitterOptions =
-  Acts::KalmanFitterOptions<MeasurementCalibrator, Acts::VoidOutlierFinder,
-      Acts::VoidReverseFilteringLogic>;
-
-  using TrackParameters = Acts::CurvilinearTrackParameters;
-  using TrackParametersContainer = std::vector<TrackParameters>;
-
-  // Track Finding
-  class TrackFinderFunction {
-  public:
-    virtual ~TrackFinderFunction() = default;
-    virtual TrackFinderResult operator()(const IndexSourceLinkContainer&,
-                                         const TrackParametersContainer&,
-                                         const TrackFinderOptions&) const = 0;
-  };
-
-  static std::shared_ptr<TrackFinderFunction> makeTrackFinderFunction(
-      std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry,
-      bool resolvePassive, bool resolveMaterial, bool resolveSensitive);
-
-  // Track Fitting
-  class TrackFitterFunction {
-  public:
-    virtual ~TrackFitterFunction() = default;
-    virtual KFResult operator()(const std::vector<IndexSourceLink>&,
-                                const Acts::BoundTrackParameters&,
-                                const TrackFitterOptions&) const = 0;
-  };
-
-  struct TrajectoryInfo {
-    TrajectoryInfo(const FaserActsRecMultiTrajectory &traj) :
-        trajectory{traj}, clusterSet{nClusters} {
-      auto state = Acts::MultiTrajectoryHelpers::trajectoryState(traj.multiTrajectory(), traj.tips().front());
-      traj.multiTrajectory().visitBackwards(traj.tips().front(), [&](const ConstTrackStateProxy& state) {
+  struct TrackInfo {
+    TrackInfo(const FaserActsTrackContainer::TrackProxy& trk) :
+      track{trk}, clusterSet{nClusters} {
+      nMeasurements = trk.nMeasurements();
+      chi2 = trk.chi2();
+      //@todo: Is this unique?
+      index = trk.index();
+      for (const auto& state : track.trackStatesReversed()) {
         auto typeFlags = state.typeFlags();
         if (not typeFlags.test(Acts::TrackStateFlag::MeasurementFlag)) {
-          return true;
+           continue; 
         }
-        clusterSet.set(state.uncalibrated().index());
-        return true;
-      });
-      nMeasurements = state.nMeasurements;
-      chi2 = state.chi2Sum;
+        auto sl = state.getUncalibratedSourceLink().template get<IndexSourceLink>();
+        clusterSet.set(sl.index());
+      }
     }
 
     static size_t nClusters;
-    FaserActsRecMultiTrajectory trajectory;
+    FaserActsTrackContainer::TrackProxy track;
     ClusterSet clusterSet;
     size_t nMeasurements;
     double chi2;
+    size_t index;
   };
 
-  static std::shared_ptr<TrackFitterFunction> makeTrackFitterFunction(
-      std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry);
 
   virtual Acts::MagneticFieldContext getMagneticFieldContext(const EventContext& ctx) const;
 
@@ -118,9 +79,9 @@ private:
   size_t m_numberOfFittedTracks {0};
   size_t m_numberOfSelectedTracks {0};
 
-  void computeSharedHits(std::vector<IndexSourceLink>* sourceLinks, TrackFinderResult& results) const;
-  std::shared_ptr<TrackFinderFunction> m_fit;
-  std::shared_ptr<TrackFitterFunction> m_kf;
+  void computeSharedHits(std::vector<IndexSourceLink>* sourceLinks, FaserActsTrackContainer& tracks) const;
+  std::shared_ptr<TrackFinderFunction> m_finder;
+  std::shared_ptr<TrackFitterFunction> m_fitter;
   std::unique_ptr<const Acts::Logger> m_logger;
   const FaserSCT_ID* m_idHelper {nullptr};
   const TrackerDD::SCT_DetectorManager* m_detManager {nullptr};
@@ -142,9 +103,9 @@ private:
   SG::ReadCondHandleKey<FaserFieldCacheCondObj> m_fieldCondObjInputKey {this, "FaserFieldCacheCondObj", "fieldCondObj", "Name of the Magnetic Field conditions object key"};
   ToolHandle<ITrackSeedTool> m_trackSeedTool {this, "TrackSeed", "ClusterTrackSeedTool"};
   ToolHandle<IFaserActsTrackingGeometryTool> m_trackingGeometryTool {this, "TrackingGeometryTool", "FaserActsTrackingGeometryTool"};
-  ToolHandle<PerformanceWriterTool> m_performanceWriterTool {this, "PerformanceWriterTool", "PerformanceWriterTool"};
-  ToolHandle<RootTrajectoryStatesWriterTool> m_trajectoryStatesWriterTool {this, "RootTrajectoryStatesWriterTool", "RootTrajectoryStatesWriterTool"};
-  ToolHandle<RootTrajectorySummaryWriterTool> m_trajectorySummaryWriterTool {this, "RootTrajectorySummaryWriterTool", "RootTrajectorySummaryWriterTool"};
+//todo  ToolHandle<PerformanceWriterTool> m_performanceWriterTool {this, "PerformanceWriterTool", "PerformanceWriterTool"};
+//todo  ToolHandle<RootTrajectoryStatesWriterTool> m_trajectoryStatesWriterTool {this, "RootTrajectoryStatesWriterTool", "RootTrajectoryStatesWriterTool"};
+//todo  ToolHandle<RootTrajectorySummaryWriterTool> m_trajectorySummaryWriterTool {this, "RootTrajectorySummaryWriterTool", "RootTrajectorySummaryWriterTool"};
   ToolHandle<KalmanFitterTool> m_kalmanFitterTool1 {this, "KalmanFitterTool1", "KalmanFitterTool"};
   ToolHandle<CreateTrkTrackTool> m_createTrkTrackTool {this, "CreateTrkTrackTool", "CreateTrkTrackTool"};
   Gaudi::Property<bool> m_isMC {this, "isMC", false};
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/TrackFitterFunction.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/TrackFitterFunction.cxx
index ec4406108f028c21186b09b64c6acadb37cb90ae..979754d4c98d42d2478748af0bbe06dd1c15cab9 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/TrackFitterFunction.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/TrackFitterFunction.cxx
@@ -1,15 +1,14 @@
 #include "TrackFitterFunction.h"
-//#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h"
+#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h"
 
 template <typename traj_t>
 bool FaserActsOutlierFinder::operator()(typename traj_t::ConstTrackStateProxy state) const {
     //remove the whole IFT
     if(cluster_z<-10000){
       IndexSourceLink sl = state.getUncalibratedSourceLink().template get<IndexSourceLink>();
-      //@todo 
-      //const Tracker::FaserSCT_Cluster* cluster = sl.hit(); 
-      //if(cluster->globalPosition().z()<-100)return true;
-      //if(abs(sl.hit()->globalPosition().z()-cluster_z)<3)return true;
+      const Tracker::FaserSCT_Cluster* cluster = sl.hit(); 
+      if(cluster->globalPosition().z()<-100)return true;
+      if(abs(sl.hit()->globalPosition().z()-cluster_z)<3)return true;
     }
 
     if (not state.hasCalibrated() or not state.hasPredicted()) {