diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp
index 65337fc608bb02499ee7b1fae75ea0738b9f7b45..0ae7a5ca1fc4da78281584031c5ae7a5c6f5b4a9 100644
--- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp
+++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp
@@ -238,19 +238,23 @@ class AdaptiveMultiVertexFinder {
   ///
   /// @param track The track
   /// @param vtx The vertex
+  /// @param vertexingOptions Vertexing options
   ///
   /// @return The IP significance
-  Result<double> getIPSignificance(const InputTrack_t* track,
-                                   const Vertex<InputTrack_t>& vtx) const;
+  Result<double> getIPSignificance(
+      const InputTrack_t* track, const Vertex<InputTrack_t>& vtx,
+      const VertexingOptions<InputTrack_t>& vertexingOptions) const;
 
   /// @brief Adds compatible track to vertex candidate
   ///
   /// @param tracks The tracks
   /// @param vtx The vertex candidate
   /// @param[out] fitterState The vertex fitter state
+  /// @param vertexingOptions Vertexing options
   Result<void> addCompatibleTracksToVertex(
       const std::vector<const InputTrack_t*>& tracks, Vertex<InputTrack_t>& vtx,
-      FitterState_t& fitterState) const;
+      FitterState_t& fitterState,
+      const VertexingOptions<InputTrack_t>& vertexingOptions) const;
 
   /// @brief Method that tries to recover from cases where no tracks
   /// were added to the vertex candidate after seeding
@@ -261,13 +265,15 @@ class AdaptiveMultiVertexFinder {
   /// @param[out] vtx The vertex candidate
   /// @param currentConstraint Vertex constraint
   /// @param[out] fitterState The vertex fitter state
+  /// @param vertexingOptions Vertexing options
   ///
   /// return True if recovery was successful, false otherwise
   Result<bool> canRecoverFromNoCompatibleTracks(
       const std::vector<const InputTrack_t*>& allTracks,
       const std::vector<const InputTrack_t*>& seedTracks,
       Vertex<InputTrack_t>& vtx, const Vertex<InputTrack_t>& currentConstraint,
-      FitterState_t& fitterState) const;
+      FitterState_t& fitterState,
+      const VertexingOptions<InputTrack_t>& vertexingOptions) const;
 
   /// @brief Method that tries to prepare the vertex for the fit
   ///
@@ -277,13 +283,15 @@ class AdaptiveMultiVertexFinder {
   /// @param[out] vtx The vertex candidate
   /// @param currentConstraint Vertex constraint
   /// @param[out] fitterState The vertex fitter state
+  /// @param vertexingOptions Vertexing options
   ///
   /// @return True if preparation was successful, false otherwise
   Result<bool> canPrepareVertexForFit(
       const std::vector<const InputTrack_t*>& allTracks,
       const std::vector<const InputTrack_t*>& seedTracks,
       Vertex<InputTrack_t>& vtx, const Vertex<InputTrack_t>& currentConstraint,
-      FitterState_t& fitterState) const;
+      FitterState_t& fitterState,
+      const VertexingOptions<InputTrack_t>& vertexingOptions) const;
 
   /// @brief Method that checks if vertex is a good vertex and if
   /// compatible tracks are available
diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp
index ff2610e51b0024ac4dde710783c3ef6368588e3f..1653da1084726b8efc3f4b92643e5259a73a265e 100644
--- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp
+++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp
@@ -63,8 +63,9 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find(
       allVerticesPtr.pop_back();
       break;
     }
-    auto prepResult = canPrepareVertexForFit(
-        allTracks, seedTracks, vtxCandidate, currentConstraint, fitterState);
+    auto prepResult = canPrepareVertexForFit(allTracks, seedTracks,
+                                             vtxCandidate, currentConstraint,
+                                             fitterState, vertexingOptions);
 
     if (!prepResult.ok()) {
       return prepResult.error();
@@ -180,7 +181,8 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::estimateDeltaZ(
 
 template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::getIPSignificance(
-    const InputTrack_t* track, const Vertex<InputTrack_t>& vtx) const
+    const InputTrack_t* track, const Vertex<InputTrack_t>& vtx,
+    const VertexingOptions<InputTrack_t>& vertexingOptions) const
     -> Result<double> {
   // TODO: In original implementation the covariance of the given vertex is set
   // to zero. I did the same here now, but consider removing this and just
@@ -192,7 +194,9 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::getIPSignificance(
     newVtx.setFullCovariance(SpacePointSymMatrix::Zero());
   }
 
-  auto estRes = m_cfg.ipEstimator.estimate(*track, newVtx);
+  auto estRes =
+      m_cfg.ipEstimator.estimate(*track, newVtx, vertexingOptions.geoContext,
+                                 vertexingOptions.magFieldContext);
   if (!estRes.ok()) {
     return estRes.error();
   }
@@ -210,12 +214,13 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::getIPSignificance(
 
 template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
-    addCompatibleTracksToVertex(const std::vector<const InputTrack_t*>& tracks,
-                                Vertex<InputTrack_t>& vtx,
-                                FitterState_t& fitterState) const
+    addCompatibleTracksToVertex(
+        const std::vector<const InputTrack_t*>& tracks,
+        Vertex<InputTrack_t>& vtx, FitterState_t& fitterState,
+        const VertexingOptions<InputTrack_t>& vertexingOptions) const
     -> Result<void> {
   for (const auto& trk : tracks) {
-    auto sigRes = getIPSignificance(trk, vtx);
+    auto sigRes = getIPSignificance(trk, vtx, vertexingOptions);
     if (!sigRes.ok()) {
       return sigRes.error();
     }
@@ -243,7 +248,9 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
         const std::vector<const InputTrack_t*>& seedTracks,
         Vertex<InputTrack_t>& vtx,
         const Vertex<InputTrack_t>& currentConstraint,
-        FitterState_t& fitterState) const -> Result<bool> {
+        FitterState_t& fitterState,
+        const VertexingOptions<InputTrack_t>& vertexingOptions) const
+    -> Result<bool> {
   // Recover from cases where no compatible tracks to vertex
   // candidate were found
   // TODO: This is for now how it's done in athena... this look a bit
@@ -271,7 +278,8 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
           VertexInfo<InputTrack_t>(currentConstraint, vtx.fullPosition());
 
       // Try to add compatible track with adapted vertex position
-      auto res = addCompatibleTracksToVertex(allTracks, vtx, fitterState);
+      auto res = addCompatibleTracksToVertex(allTracks, vtx, fitterState,
+                                             vertexingOptions);
       if (!res.ok()) {
         return Result<bool>::failure(res.error());
       }
@@ -294,24 +302,29 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
 
 template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
-    canPrepareVertexForFit(const std::vector<const InputTrack_t*>& allTracks,
-                           const std::vector<const InputTrack_t*>& seedTracks,
-                           Vertex<InputTrack_t>& vtx,
-                           const Vertex<InputTrack_t>& currentConstraint,
-                           FitterState_t& fitterState) const -> Result<bool> {
+    canPrepareVertexForFit(
+        const std::vector<const InputTrack_t*>& allTracks,
+        const std::vector<const InputTrack_t*>& seedTracks,
+        Vertex<InputTrack_t>& vtx,
+        const Vertex<InputTrack_t>& currentConstraint,
+        FitterState_t& fitterState,
+        const VertexingOptions<InputTrack_t>& vertexingOptions) const
+    -> Result<bool> {
   // Add vertex info to fitter state
   fitterState.vtxInfoMap[&vtx] =
       VertexInfo<InputTrack_t>(currentConstraint, vtx.fullPosition());
 
   // Add all compatible tracks to vertex
-  auto resComp = addCompatibleTracksToVertex(allTracks, vtx, fitterState);
+  auto resComp = addCompatibleTracksToVertex(allTracks, vtx, fitterState,
+                                             vertexingOptions);
   if (!resComp.ok()) {
     return Result<bool>::failure(resComp.error());
   }
 
   // Try to recover from cases where adding compatible track was not possible
-  auto resRec = canRecoverFromNoCompatibleTracks(
-      allTracks, seedTracks, vtx, currentConstraint, fitterState);
+  auto resRec = canRecoverFromNoCompatibleTracks(allTracks, seedTracks, vtx,
+                                                 currentConstraint, fitterState,
+                                                 vertexingOptions);
   if (!resRec.ok()) {
     return Result<bool>::failure(resRec.error());
   }
diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.hpp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.hpp
index ae53491b8dd6845496a9e1abbe63d8fa00ef3461..eaafee956d1da2f83949e3fb0e1e2f162f7afd1a 100644
--- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.hpp
+++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.hpp
@@ -253,11 +253,11 @@ class AdaptiveMultiVertexFitter {
   /// at current vertex
   ///
   /// @param state The state object
-  /// @param geoContext The geometry context
   /// @param currentVtx Current vertex
+  /// @param vertexingOptions Vertexing options
   Result<void> setAllVertexCompatibilities(
-      State& state, const GeometryContext& geoContext,
-      Vertex<InputTrack_t>* currentVtx) const;
+      State& state, Vertex<InputTrack_t>* currentVtx,
+      const VertexingOptions<input_track_t>& vertexingOptions) const;
 
   /// @brief Sets weights to the track according to Eq.(5.46) in Ref.(1)
   ///  and updates the vertices by calling the VertexUpdater
diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.ipp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.ipp
index dfb2d5f33fc6d589f04ae8368ad6c9274a7d615d..053b9ed08264cdb883c349c8fa8eea8a37de0bf2 100644
--- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.ipp
+++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFitter.ipp
@@ -94,7 +94,7 @@ Acts::AdaptiveMultiVertexFitter<input_track_t, linearizer_t>::fitImpl(
 
       // Set vertexCompatibility for all TrackAtVertex objects
       // at current vertex
-      setAllVertexCompatibilities(state, geoContext, currentVtx);
+      setAllVertexCompatibilities(state, currentVtx, vertexingOptions);
     }  // End loop over vertex collection
 
     // Now after having estimated all compatibilities of all tracks at
@@ -204,12 +204,12 @@ Acts::Result<void> Acts::
   auto& currentVtxInfo = state.vtxInfoMap[vtx];
   // The seed position
   const Vector3D& seedPos = currentVtxInfo.seedPosition.template head<3>();
-  auto& geoContext = vertexingOptions.geoContext;
 
   // Loop over all tracks at current vertex
   for (const auto& trk : currentVtxInfo.trackLinks) {
     auto res = m_cfg.ipEst.getParamsAtClosestApproach(
-        geoContext, m_extractParameters(*trk), seedPos);
+        vertexingOptions.geoContext, vertexingOptions.magFieldContext,
+        m_extractParameters(*trk), seedPos);
     if (!res.ok()) {
       return res.error();
     }
@@ -222,8 +222,9 @@ Acts::Result<void> Acts::
 template <typename input_track_t, typename linearizer_t>
 Acts::Result<void>
 Acts::AdaptiveMultiVertexFitter<input_track_t, linearizer_t>::
-    setAllVertexCompatibilities(State& state, const GeometryContext& geoContext,
-                                Vertex<input_track_t>* currentVtx) const {
+    setAllVertexCompatibilities(
+        State& state, Vertex<input_track_t>* currentVtx,
+        const VertexingOptions<input_track_t>& vertexingOptions) const {
   VertexInfo<input_track_t>& currentVtxInfo = state.vtxInfoMap[currentVtx];
 
   // Loop over tracks at current vertex and
@@ -236,7 +237,8 @@ Acts::AdaptiveMultiVertexFitter<input_track_t, linearizer_t>::
     if (currentVtxInfo.ip3dParams.find(trk) ==
         currentVtxInfo.ip3dParams.end()) {
       auto res = m_cfg.ipEst.getParamsAtClosestApproach(
-          geoContext, m_extractParameters(*trk),
+          vertexingOptions.geoContext, vertexingOptions.magFieldContext,
+          m_extractParameters(*trk),
           VectorHelpers::position(currentVtxInfo.linPoint));
       if (!res.ok()) {
         return res.error();
@@ -246,7 +248,7 @@ Acts::AdaptiveMultiVertexFitter<input_track_t, linearizer_t>::
     }
     // Set compatibility with current vertex
     auto compRes = m_cfg.ipEst.getVertexCompatibility(
-        geoContext, &(currentVtxInfo.ip3dParams.at(trk)),
+        vertexingOptions.geoContext, &(currentVtxInfo.ip3dParams.at(trk)),
         VectorHelpers::position(currentVtxInfo.oldPosition));
     if (!compRes.ok()) {
       return compRes.error();
diff --git a/Core/include/Acts/Vertexing/HelicalTrackLinearizer.ipp b/Core/include/Acts/Vertexing/HelicalTrackLinearizer.ipp
index 8d60896de0f406e736e0d2b4acf2abc8b00294b7..4f75c4c9581069e74697e1582570ffc16c13e52c 100644
--- a/Core/include/Acts/Vertexing/HelicalTrackLinearizer.ipp
+++ b/Core/include/Acts/Vertexing/HelicalTrackLinearizer.ipp
@@ -19,6 +19,7 @@ Acts::Result<Acts::LinearizedTrack> Acts::
   const std::shared_ptr<PerigeeSurface> perigeeSurface =
       Surface::makeShared<PerigeeSurface>(linPointPos);
 
+  // Create propagator options
   propagator_options_t pOptions(gctx, mctx);
   pOptions.direction = backward;
 
diff --git a/Core/include/Acts/Vertexing/ImpactPoint3dEstimator.hpp b/Core/include/Acts/Vertexing/ImpactPoint3dEstimator.hpp
index 943f9adec3e2bfc68a727e9122c9761b5d5ef677..f2358e7b668d0e39a81106139587cb5871bdbb1f 100644
--- a/Core/include/Acts/Vertexing/ImpactPoint3dEstimator.hpp
+++ b/Core/include/Acts/Vertexing/ImpactPoint3dEstimator.hpp
@@ -34,40 +34,21 @@ class ImpactPoint3dEstimator {
     ///
     /// @param bIn The magnetic field
     /// @param prop The propagator
-    /// @param propOptions The propagator options
-    /// @param doBackwardPropagation Set the propagation direction to backward
-    Config(const BField_t& bIn, std::shared_ptr<propagator_t> prop,
-           propagator_options_t propOptions, bool doBackwardPropagation = true)
-        : bField(bIn),
-          propagator(std::move(prop)),
-          pOptions(std::move(propOptions)) {
-      if (doBackwardPropagation) {
-        pOptions.direction = backward;
-      }
-    }
+    Config(const BField_t& bIn, std::shared_ptr<propagator_t> prop)
+        : bField(bIn), propagator(std::move(prop)) {}
 
     /// @brief Config constructor if BField_t == NullBField (no B-Field
     /// provided)
     ///
     /// @param prop The propagator
-    /// @param propOptions The propagator options
-    /// @param doBackwardPropagation Set the propagation direction to backward
     template <typename T = BField_t,
               std::enable_if_t<std::is_same<T, NullBField>::value, int> = 0>
-    Config(std::shared_ptr<propagator_t> prop, propagator_options_t propOptions,
-           bool doBackwardPropagation = true)
-        : propagator(std::move(prop)), pOptions(std::move(propOptions)) {
-      if (doBackwardPropagation) {
-        pOptions.direction = backward;
-      }
-    }
+    Config(std::shared_ptr<propagator_t> prop) : propagator(std::move(prop)) {}
 
     /// Magnetic field
     BField_t bField;
     /// Propagator
     std::shared_ptr<propagator_t> propagator;
-    // The propagator options
-    propagator_options_t pOptions;
     /// Max. number of iterations in Newton method
     int maxIterations = 20;
     /// Desired precision in deltaPhi in Newton method
@@ -103,13 +84,14 @@ class ImpactPoint3dEstimator {
   /// given reference point (vertex).
   ///
   /// @param gctx The geometry context
+  /// @param mctx The magnetic field context
   /// @param trkParams Track parameters
   /// @param vtxPos Reference position (vertex)
   ///
   /// @return New track params
   Result<std::unique_ptr<const BoundParameters>> getParamsAtClosestApproach(
-      const GeometryContext& gctx, const BoundParameters& trkParams,
-      const Vector3D& vtxPos) const;
+      const GeometryContext& gctx, const Acts::MagneticFieldContext& mctx,
+      const BoundParameters& trkParams, const Vector3D& vtxPos) const;
 
   /// @brief Estimates the compatibility of a
   /// track to a vertex position based on the 3d
diff --git a/Core/include/Acts/Vertexing/ImpactPoint3dEstimator.ipp b/Core/include/Acts/Vertexing/ImpactPoint3dEstimator.ipp
index 3ed4680858b4b940fed2102b69d2969c5f78a238..d3b1cf6e1fec07f2bed53980079f304211770f35 100644
--- a/Core/include/Acts/Vertexing/ImpactPoint3dEstimator.ipp
+++ b/Core/include/Acts/Vertexing/ImpactPoint3dEstimator.ipp
@@ -38,6 +38,7 @@ Acts::Result<std::unique_ptr<const Acts::BoundParameters>>
 Acts::ImpactPoint3dEstimator<input_track_t, propagator_t,
                              propagator_options_t>::
     getParamsAtClosestApproach(const GeometryContext& gctx,
+                               const Acts::MagneticFieldContext& mctx,
                                const BoundParameters& trkParams,
                                const Vector3D& vtxPos) const {
   Vector3D deltaR;
@@ -70,9 +71,12 @@ Acts::ImpactPoint3dEstimator<input_track_t, propagator_t,
       Surface::makeShared<PlaneSurface>(
           std::make_shared<Transform3D>(thePlane));
 
+  // Create propagator options
+  propagator_options_t pOptions(gctx, mctx);
+  pOptions.direction = backward;
+
   // Do the propagation to linPointPos
-  auto result =
-      m_cfg.propagator->propagate(trkParams, *planeSurface, m_cfg.pOptions);
+  auto result = m_cfg.propagator->propagate(trkParams, *planeSurface, pOptions);
   if (result.ok()) {
     return std::move((*result).endParameters);
   } else {
diff --git a/Core/include/Acts/Vertexing/TrackToVertexIPEstimator.hpp b/Core/include/Acts/Vertexing/TrackToVertexIPEstimator.hpp
index 8c34eea4d5de0c3a37013650689e8843d7a211be..2666a51c68412b8f51712d85235591f82080cf5e 100644
--- a/Core/include/Acts/Vertexing/TrackToVertexIPEstimator.hpp
+++ b/Core/include/Acts/Vertexing/TrackToVertexIPEstimator.hpp
@@ -39,22 +39,11 @@ class TrackToVertexIPEstimator {
  public:
   /// @brief Configuration struct
   ///
-  /// @param p The propagator
-  /// @param propOptions The propagator options
-  /// @param doBackwardPropagation Set the propagation direction to backward
+  /// @param prop The propagator
   struct Config {
-    Config(std::shared_ptr<propagator_t> p,
-           const propagator_options_t& propOptions,
-           bool doBackwardPropagation = true)
-        : propagator(std::move(p)), pOptions(propOptions) {
-      if (doBackwardPropagation) {
-        pOptions.direction = backward;
-      }
-    }
+    Config(std::shared_ptr<propagator_t> prop) : propagator(std::move(prop)) {}
 
     std::shared_ptr<propagator_t> propagator;
-
-    propagator_options_t pOptions;
   };
 
   /// @brief Default constructor
@@ -77,8 +66,12 @@ class TrackToVertexIPEstimator {
   ///
   /// @param track Track to estimate IP from
   /// @param vtx Vertex the track belongs to
+  /// @param gctx The geometry context
+  /// @param mctx The magnetic field context
   Result<ImpactParametersAndSigma> estimate(
-      const BoundParameters& track, const Vertex<input_track_t>& vtx) const;
+      const BoundParameters& track, const Vertex<input_track_t>& vtx,
+      const GeometryContext& gctx,
+      const Acts::MagneticFieldContext& mctx) const;
 
  private:
   /// Config
diff --git a/Core/include/Acts/Vertexing/TrackToVertexIPEstimator.ipp b/Core/include/Acts/Vertexing/TrackToVertexIPEstimator.ipp
index 3d3989b21ceae04bd4736e1eaca8204d026d15b4..853dcedcf40600adbeac2e951c94bd63eb113384 100644
--- a/Core/include/Acts/Vertexing/TrackToVertexIPEstimator.ipp
+++ b/Core/include/Acts/Vertexing/TrackToVertexIPEstimator.ipp
@@ -13,7 +13,10 @@ template <typename input_track_t, typename propagator_t,
 Acts::Result<Acts::ImpactParametersAndSigma> Acts::TrackToVertexIPEstimator<
     input_track_t, propagator_t,
     propagator_options_t>::estimate(const BoundParameters& track,
-                                    const Vertex<input_track_t>& vtx) const {
+                                    const Vertex<input_track_t>& vtx,
+                                    const GeometryContext& gctx,
+                                    const Acts::MagneticFieldContext& mctx)
+    const {
   // estimating the d0 and its significance by propagating the trajectory state
   // towards
   // the vertex position. By this time the vertex should NOT contain this
@@ -21,9 +24,12 @@ Acts::Result<Acts::ImpactParametersAndSigma> Acts::TrackToVertexIPEstimator<
   const std::shared_ptr<PerigeeSurface> perigeeSurface =
       Surface::makeShared<PerigeeSurface>(vtx.position());
 
+  // Create propagator options
+  propagator_options_t pOptions(gctx, mctx);
+  pOptions.direction = backward;
+
   // Do the propagation to linPoint
-  auto result =
-      m_cfg.propagator->propagate(track, *perigeeSurface, m_cfg.pOptions);
+  auto result = m_cfg.propagator->propagate(track, *perigeeSurface, pOptions);
 
   if (!result.ok()) {
     return result.error();
diff --git a/Core/include/Acts/Vertexing/ZScanVertexFinder.ipp b/Core/include/Acts/Vertexing/ZScanVertexFinder.ipp
index 7344f7d2a16bd2b201c3b7533e2ae5be3c209c15..491253247c90bef584818698f4b8d18f2fbc9680 100644
--- a/Core/include/Acts/Vertexing/ZScanVertexFinder.ipp
+++ b/Core/include/Acts/Vertexing/ZScanVertexFinder.ipp
@@ -30,8 +30,9 @@ auto Acts::ZScanVertexFinder<vfitter_t>::find(
     ImpactParametersAndSigma ipas;
     if (useConstraint &&
         vertexingOptions.vertexConstraint.covariance()(0, 0) != 0) {
-      auto estRes =
-          m_cfg.ipEstimator.estimate(params, vertexingOptions.vertexConstraint);
+      auto estRes = m_cfg.ipEstimator.estimate(
+          params, vertexingOptions.vertexConstraint,
+          vertexingOptions.geoContext, vertexingOptions.magFieldContext);
       if (estRes.ok()) {
         ipas = *estRes;
       } else {
diff --git a/Tests/UnitTests/Core/Vertexing/AdaptiveMultiVertexFinderTests.cpp b/Tests/UnitTests/Core/Vertexing/AdaptiveMultiVertexFinderTests.cpp
index f6980479cd8b6600b9b0af5e45912b47ac3bda4d..2aa5af3c50022df8a20595d19fa309b2c51be56a 100644
--- a/Tests/UnitTests/Core/Vertexing/AdaptiveMultiVertexFinderTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/AdaptiveMultiVertexFinderTests.cpp
@@ -35,8 +35,8 @@ using Propagator = Propagator<EigenStepper<ConstantBField>>;
 using Linearizer = HelicalTrackLinearizer<Propagator>;
 
 // Create a test context
-GeometryContext tgContext = GeometryContext();
-MagneticFieldContext mfContext = MagneticFieldContext();
+GeometryContext geoContext = GeometryContext();
+MagneticFieldContext magFieldContext = MagneticFieldContext();
 
 BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_finder_test) {
   // Set debug mode
@@ -50,13 +50,11 @@ BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_finder_test) {
 
   // Set up propagator with void navigator
   auto propagator = std::make_shared<Propagator>(stepper);
-  PropagatorOptions<> pOptions(tgContext, mfContext);
-  pOptions.direction = backward;
 
   // IP 3D Estimator
   using IPEstimator = ImpactPoint3dEstimator<BoundParameters, Propagator>;
 
-  IPEstimator::Config ip3dEstCfg(bField, propagator, pOptions, false);
+  IPEstimator::Config ip3dEstCfg(bField, propagator);
   IPEstimator ip3dEst(ip3dEstCfg);
 
   std::vector<double> temperatures{8.0, 4.0, 2.0, 1.4142136, 1.2247449, 1.0};
@@ -84,7 +82,7 @@ BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_finder_test) {
 
   using IPEstimater = TrackToVertexIPEstimator<BoundParameters, Propagator>;
 
-  IPEstimater::Config ipEstCfg(propagator, pOptions);
+  IPEstimater::Config ipEstCfg(propagator);
 
   // Create TrackToVertexIPEstimator
   IPEstimater ipEst(ipEstCfg);
@@ -120,7 +118,8 @@ BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_finder_test) {
     tracksPtr.push_back(&trk);
   }
 
-  VertexingOptions<BoundParameters> vertexingOptions(tgContext, mfContext);
+  VertexingOptions<BoundParameters> vertexingOptions(geoContext,
+                                                     magFieldContext);
 
   Vector3D constraintPos{0._mm, 0._mm, 0_mm};
   ActsSymMatrixD<3> constraintCov;
diff --git a/Tests/UnitTests/Core/Vertexing/AdaptiveMultiVertexFitterTests.cpp b/Tests/UnitTests/Core/Vertexing/AdaptiveMultiVertexFitterTests.cpp
index 886e8b6fc19715659c172d483c01b701ea5d34fb..b8f385ba6224c9725a426a10d5f57350d41f3a17 100644
--- a/Tests/UnitTests/Core/Vertexing/AdaptiveMultiVertexFitterTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/AdaptiveMultiVertexFitterTests.cpp
@@ -30,8 +30,8 @@ using Propagator = Propagator<EigenStepper<ConstantBField>>;
 using Linearizer = HelicalTrackLinearizer<Propagator>;
 
 // Create a test context
-GeometryContext tgContext = GeometryContext();
-MagneticFieldContext mfContext = MagneticFieldContext();
+GeometryContext geoContext = GeometryContext();
+MagneticFieldContext magFieldContext = MagneticFieldContext();
 
 // Vertex x/y position distribution
 std::uniform_real_distribution<> vXYDist(-0.1_mm, 0.1_mm);
@@ -75,14 +75,14 @@ BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_fitter_test) {
 
   // Set up propagator with void navigator
   auto propagator = std::make_shared<Propagator>(stepper);
-  PropagatorOptions<> pOptions(tgContext, mfContext);
 
-  VertexingOptions<BoundParameters> vertexingOptions(tgContext, mfContext);
+  VertexingOptions<BoundParameters> vertexingOptions(geoContext,
+                                                     magFieldContext);
 
   // IP 3D Estimator
   using IPEstimator = ImpactPoint3dEstimator<BoundParameters, Propagator>;
 
-  IPEstimator::Config ip3dEstCfg(bField, propagator, pOptions);
+  IPEstimator::Config ip3dEstCfg(bField, propagator);
   IPEstimator ip3dEst(ip3dEstCfg);
 
   AdaptiveMultiVertexFitter<BoundParameters, Linearizer>::Config fitterCfg(
@@ -163,7 +163,7 @@ BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_fitter_test) {
     std::shared_ptr<PerigeeSurface> perigeeSurface =
         Surface::makeShared<PerigeeSurface>(vtxPosVec[vtxIdx]);
 
-    allTracks.push_back(BoundParameters(tgContext, std::move(covMat), paramVec,
+    allTracks.push_back(BoundParameters(geoContext, std::move(covMat), paramVec,
                                         perigeeSurface));
   }
 
@@ -321,14 +321,14 @@ BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_fitter_test_athena) {
 
   // Set up propagator with void navigator
   auto propagator = std::make_shared<Propagator>(stepper);
-  PropagatorOptions<> pOptions(tgContext, mfContext);
 
-  VertexingOptions<BoundParameters> vertexingOptions(tgContext, mfContext);
+  VertexingOptions<BoundParameters> vertexingOptions(geoContext,
+                                                     magFieldContext);
 
   // IP 3D Estimator
   using IPEstimator = ImpactPoint3dEstimator<BoundParameters, Propagator>;
 
-  IPEstimator::Config ip3dEstCfg(bField, propagator, pOptions, false);
+  IPEstimator::Config ip3dEstCfg(bField, propagator);
   IPEstimator ip3dEst(ip3dEstCfg);
 
   std::vector<double> temperatures(1, 3.);
@@ -373,22 +373,22 @@ BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_fitter_test_athena) {
 
   std::vector<BoundParameters> params1;
   params1.push_back(
-      BoundParameters(tgContext, covMat1, pos1a, mom1a, 1, 0,
+      BoundParameters(geoContext, covMat1, pos1a, mom1a, 1, 0,
                       Surface::makeShared<PerigeeSurface>(pos1a)));
   params1.push_back(
-      BoundParameters(tgContext, covMat1, pos1b, mom1b, -1, 0,
+      BoundParameters(geoContext, covMat1, pos1b, mom1b, -1, 0,
                       Surface::makeShared<PerigeeSurface>(pos1b)));
   params1.push_back(
-      BoundParameters(tgContext, covMat1, pos1c, mom1c, 1, 0,
+      BoundParameters(geoContext, covMat1, pos1c, mom1c, 1, 0,
                       Surface::makeShared<PerigeeSurface>(pos1c)));
   params1.push_back(
-      BoundParameters(tgContext, covMat1, pos1d, mom1d, -1, 0,
+      BoundParameters(geoContext, covMat1, pos1d, mom1d, -1, 0,
                       Surface::makeShared<PerigeeSurface>(pos1d)));
   params1.push_back(
-      BoundParameters(tgContext, covMat1, pos1e, mom1e, 1, 0,
+      BoundParameters(geoContext, covMat1, pos1e, mom1e, 1, 0,
                       Surface::makeShared<PerigeeSurface>(pos1e)));
   params1.push_back(
-      BoundParameters(tgContext, covMat1, pos1f, mom1f, -1, 0,
+      BoundParameters(geoContext, covMat1, pos1f, mom1f, -1, 0,
                       Surface::makeShared<PerigeeSurface>(pos1f)));
 
   // Create second vector of tracks
@@ -404,13 +404,13 @@ BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_fitter_test_athena) {
 
   std::vector<BoundParameters> params2;
   params2.push_back(
-      BoundParameters(tgContext, covMat2, pos2a, mom2a, 1, 0,
+      BoundParameters(geoContext, covMat2, pos2a, mom2a, 1, 0,
                       Surface::makeShared<PerigeeSurface>(pos2a)));
   params2.push_back(
-      BoundParameters(tgContext, covMat2, pos2b, mom2b, -1, 0,
+      BoundParameters(geoContext, covMat2, pos2b, mom2b, -1, 0,
                       Surface::makeShared<PerigeeSurface>(pos2b)));
   params2.push_back(
-      BoundParameters(tgContext, covMat2, pos2c, mom2c, -1, 0,
+      BoundParameters(geoContext, covMat2, pos2c, mom2c, -1, 0,
                       Surface::makeShared<PerigeeSurface>(pos2c)));
 
   std::vector<Vertex<BoundParameters>*> vtxList;
diff --git a/Tests/UnitTests/Core/Vertexing/FullBilloirVertexFitterTests.cpp b/Tests/UnitTests/Core/Vertexing/FullBilloirVertexFitterTests.cpp
index 249cd7554450ceaedcda352172296f9e5560b278..8239c0035a18a83917d2c9c3d30f9aebca9adb09 100644
--- a/Tests/UnitTests/Core/Vertexing/FullBilloirVertexFitterTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/FullBilloirVertexFitterTests.cpp
@@ -33,8 +33,8 @@ using Linearizer =
     HelicalTrackLinearizer<Propagator<EigenStepper<ConstantBField>>>;
 
 // Create a test context
-GeometryContext tgContext = GeometryContext();
-MagneticFieldContext mfContext = MagneticFieldContext();
+GeometryContext geoContext = GeometryContext();
+MagneticFieldContext magFieldContext = MagneticFieldContext();
 
 /// @brief Unit test for FullBilloirVertexFitter
 ///
@@ -70,7 +70,7 @@ BOOST_AUTO_TEST_CASE(billoir_vertex_fitter_empty_input_test) {
 
   const std::vector<const BoundParameters*> emptyVector;
 
-  VertexingOptions<BoundParameters> vfOptions(tgContext, mfContext,
+  VertexingOptions<BoundParameters> vfOptions(geoContext, magFieldContext,
                                               myConstraint);
 
   Vertex<BoundParameters> fittedVertex =
@@ -155,10 +155,10 @@ BOOST_AUTO_TEST_CASE(billoir_vertex_fitter_defaulttrack_test) {
     myCovMat(3, 3) = 30.;
     myConstraint.setFullCovariance(std::move(myCovMat));
     myConstraint.setFullPosition(SpacePointVector(0, 0, 0, 0));
-    VertexingOptions<BoundParameters> vfOptions(tgContext, mfContext);
+    VertexingOptions<BoundParameters> vfOptions(geoContext, magFieldContext);
 
-    VertexingOptions<BoundParameters> vfOptionsConstr(tgContext, mfContext,
-                                                      myConstraint);
+    VertexingOptions<BoundParameters> vfOptionsConstr(
+        geoContext, magFieldContext, myConstraint);
     // Create position of vertex and perigee surface
     double x = vXYDist(gen);
     double y = vXYDist(gen);
@@ -198,7 +198,7 @@ BOOST_AUTO_TEST_CASE(billoir_vertex_fitter_defaulttrack_test) {
       covMat << resD0 * resD0, 0., 0., 0., 0., 0., 0., resZ0 * resZ0, 0., 0.,
           0., 0., 0., 0., resPh * resPh, 0., 0., 0., 0., 0., 0., resTh * resTh,
           0., 0., 0., 0., 0., 0., resQp * resQp, 0., 0., 0., 0., 0., 0., 1.;
-      tracks.push_back(BoundParameters(tgContext, std::move(covMat), paramVec,
+      tracks.push_back(BoundParameters(geoContext, std::move(covMat), paramVec,
                                        perigeeSurface));
     }
 
@@ -292,9 +292,9 @@ BOOST_AUTO_TEST_CASE(billoir_vertex_fitter_usertrack_test) {
     myConstraint.setFullCovariance(std::move(myCovMat));
     myConstraint.setFullPosition(SpacePointVector(0, 0, 0, 0));
 
-    VertexingOptions<InputTrack> vfOptions(tgContext, mfContext);
+    VertexingOptions<InputTrack> vfOptions(geoContext, magFieldContext);
 
-    VertexingOptions<InputTrack> vfOptionsConstr(tgContext, mfContext,
+    VertexingOptions<InputTrack> vfOptionsConstr(geoContext, magFieldContext,
                                                  myConstraint);
 
     // Create position of vertex and perigee surface
@@ -337,7 +337,7 @@ BOOST_AUTO_TEST_CASE(billoir_vertex_fitter_usertrack_test) {
       covMat << resD0 * resD0, 0., 0., 0., 0., 0., 0., resZ0 * resZ0, 0., 0.,
           0., 0., 0., 0., resPh * resPh, 0., 0., 0., 0., 0., 0., resTh * resTh,
           0., 0., 0., 0., 0., 0., resQp * resQp, 0., 0., 0., 0., 0., 0., 1.;
-      tracks.push_back(InputTrack(BoundParameters(tgContext, std::move(covMat),
+      tracks.push_back(InputTrack(BoundParameters(geoContext, std::move(covMat),
                                                   paramVec, perigeeSurface)));
     }
 
diff --git a/Tests/UnitTests/Core/Vertexing/ImpactPoint3dEstimatorTests.cpp b/Tests/UnitTests/Core/Vertexing/ImpactPoint3dEstimatorTests.cpp
index b1dd2458c2fdbd979b8b9278af91dc4c8c37133a..e39f700348f253ed848fd65c4770e82bf4adbdd1 100644
--- a/Tests/UnitTests/Core/Vertexing/ImpactPoint3dEstimatorTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/ImpactPoint3dEstimatorTests.cpp
@@ -28,8 +28,8 @@ namespace Test {
 using Covariance = BoundSymMatrix;
 using Propagator = Propagator<EigenStepper<ConstantBField>>;
 // Create a test context
-GeometryContext tgContext = GeometryContext();
-MagneticFieldContext mfContext = MagneticFieldContext();
+GeometryContext geoContext = GeometryContext();
+MagneticFieldContext magFieldContext = MagneticFieldContext();
 
 // Track d0 distribution
 std::uniform_real_distribution<> d0Dist(-0.01_mm, 0.01_mm);
@@ -70,11 +70,10 @@ BOOST_AUTO_TEST_CASE(impactpoint_3d_estimator_params_distance_test) {
 
   // Set up propagator with void navigator
   auto propagator = std::make_shared<Propagator>(stepper);
-  PropagatorOptions<> pOptions(tgContext, mfContext);
 
   // Set up the ImpactPoint3dEstimator
   ImpactPoint3dEstimator<BoundParameters, Propagator>::Config ipEstCfg(
-      bField, propagator, pOptions);
+      bField, propagator);
 
   ImpactPoint3dEstimator<BoundParameters, Propagator> ipEstimator(ipEstCfg);
 
@@ -117,7 +116,7 @@ BOOST_AUTO_TEST_CASE(impactpoint_3d_estimator_params_distance_test) {
         Surface::makeShared<PerigeeSurface>(refPosition);
 
     // Creating the track
-    BoundParameters myTrack(tgContext, std::move(covMat), paramVec,
+    BoundParameters myTrack(geoContext, std::move(covMat), paramVec,
                             perigeeSurface);
 
     // Distance in transverse plane
@@ -125,7 +124,7 @@ BOOST_AUTO_TEST_CASE(impactpoint_3d_estimator_params_distance_test) {
 
     // Estimate 3D distance
     auto distanceRes =
-        ipEstimator.calculateDistance(tgContext, myTrack, refPosition);
+        ipEstimator.calculateDistance(geoContext, myTrack, refPosition);
     BOOST_CHECK(distanceRes.ok());
 
     double distance = *distanceRes;
@@ -140,8 +139,8 @@ BOOST_AUTO_TEST_CASE(impactpoint_3d_estimator_params_distance_test) {
                 << std::endl;
     }
 
-    auto res =
-        ipEstimator.getParamsAtClosestApproach(tgContext, myTrack, refPosition);
+    auto res = ipEstimator.getParamsAtClosestApproach(
+        geoContext, magFieldContext, myTrack, refPosition);
 
     BOOST_CHECK(res.ok());
 
@@ -190,11 +189,10 @@ BOOST_AUTO_TEST_CASE(impactpoint_3d_estimator_compatibility_test) {
 
   // Set up propagator with void navigator
   auto propagator = std::make_shared<Propagator>(stepper);
-  PropagatorOptions<> pOptions(tgContext, mfContext);
 
   // Set up the ImpactPoint3dEstimator
   ImpactPoint3dEstimator<BoundParameters, Propagator>::Config ipEstCfg(
-      bField, propagator, pOptions);
+      bField, propagator);
 
   ImpactPoint3dEstimator<BoundParameters, Propagator> ipEstimator(ipEstCfg);
 
@@ -240,25 +238,25 @@ BOOST_AUTO_TEST_CASE(impactpoint_3d_estimator_compatibility_test) {
         Surface::makeShared<PerigeeSurface>(refPosition);
 
     // Creating the track
-    BoundParameters myTrack(tgContext, std::move(covMat), paramVec,
+    BoundParameters myTrack(geoContext, std::move(covMat), paramVec,
                             perigeeSurface);
 
     // Estimate 3D distance
     auto distanceRes =
-        ipEstimator.calculateDistance(tgContext, myTrack, refPosition);
+        ipEstimator.calculateDistance(geoContext, myTrack, refPosition);
     BOOST_CHECK(distanceRes.ok());
 
     distancesList.push_back(*distanceRes);
 
-    auto res =
-        ipEstimator.getParamsAtClosestApproach(tgContext, myTrack, refPosition);
+    auto res = ipEstimator.getParamsAtClosestApproach(
+        geoContext, magFieldContext, myTrack, refPosition);
 
     BOOST_CHECK(res.ok());
 
     BoundParameters params = std::move(**res);
 
     auto compRes =
-        ipEstimator.getVertexCompatibility(tgContext, &params, refPosition);
+        ipEstimator.getVertexCompatibility(geoContext, &params, refPosition);
 
     BOOST_CHECK(compRes.ok());
 
@@ -310,11 +308,10 @@ BOOST_AUTO_TEST_CASE(impactpoint_3d_estimator_athena_test) {
 
   // Set up propagator with void navigator
   auto propagator = std::make_shared<Propagator>(stepper);
-  PropagatorOptions<> pOptions(tgContext, mfContext);
 
   // Set up the ImpactPoint3dEstimator
   ImpactPoint3dEstimator<BoundParameters, Propagator>::Config ipEstCfg(
-      bField, propagator, pOptions);
+      bField, propagator);
 
   ImpactPoint3dEstimator<BoundParameters, Propagator> ipEstimator(ipEstCfg);
 
@@ -329,9 +326,9 @@ BOOST_AUTO_TEST_CASE(impactpoint_3d_estimator_athena_test) {
       Surface::makeShared<PerigeeSurface>(pos1);
 
   // Some fixed track parameter values
-  BoundParameters params1(tgContext, covMat, pos1, mom1, 1, 0, perigeeSurface);
+  BoundParameters params1(geoContext, covMat, pos1, mom1, 1, 0, perigeeSurface);
 
-  auto res1 = ipEstimator.calculateDistance(tgContext, params1, vtxPos);
+  auto res1 = ipEstimator.calculateDistance(geoContext, params1, vtxPos);
   BOOST_CHECK(res1.ok());
   double distance = (*res1);
 
@@ -339,11 +336,11 @@ BOOST_AUTO_TEST_CASE(impactpoint_3d_estimator_athena_test) {
   const double result = 3.10391_mm;
   CHECK_CLOSE_ABS(distance, result, 0.00001_mm);
 
-  auto res2 =
-      ipEstimator.getParamsAtClosestApproach(tgContext, params1, vtxPos);
+  auto res2 = ipEstimator.getParamsAtClosestApproach(
+      geoContext, magFieldContext, params1, vtxPos);
   BOOST_CHECK(res2.ok());
   BoundParameters endParams = std::move(**res2);
-  Vector3D surfaceCenter = endParams.referenceSurface().center(tgContext);
+  Vector3D surfaceCenter = endParams.referenceSurface().center(geoContext);
 
   BOOST_CHECK_EQUAL(surfaceCenter, vtxPos);
 }
diff --git a/Tests/UnitTests/Core/Vertexing/IterativeVertexFinderTests.cpp b/Tests/UnitTests/Core/Vertexing/IterativeVertexFinderTests.cpp
index 355ddbaad06158a7e2e1e3521c4907523d2361fa..0d2addda7bb00a53bd87609d547e4d82065accc0 100644
--- a/Tests/UnitTests/Core/Vertexing/IterativeVertexFinderTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/IterativeVertexFinderTests.cpp
@@ -37,8 +37,8 @@ using Propagator = Propagator<EigenStepper<ConstantBField>>;
 using Linearizer = HelicalTrackLinearizer<Propagator>;
 
 // Create a test context
-GeometryContext tgContext = GeometryContext();
-MagneticFieldContext mfContext = MagneticFieldContext();
+GeometryContext geoContext = GeometryContext();
+MagneticFieldContext magFieldContext = MagneticFieldContext();
 
 // Vertex x/y position distribution
 std::uniform_real_distribution<> vXYDist(-0.1_mm, 0.1_mm);
@@ -102,8 +102,6 @@ BOOST_AUTO_TEST_CASE(iterative_finder_test) {
     // Set up propagator with void navigator
     auto propagator = std::make_shared<Propagator>(stepper);
 
-    PropagatorOptions<> pOptions(tgContext, mfContext);
-
     // Linearizer for BoundParameters type test
     Linearizer::Config ltConfig(bField, propagator);
     Linearizer linearizer(ltConfig);
@@ -117,7 +115,7 @@ BOOST_AUTO_TEST_CASE(iterative_finder_test) {
 
     // Set up all seed finder related things
     TrackToVertexIPEstimator<BoundParameters, Propagator>::Config ipEstCfg(
-        propagator, pOptions);
+        propagator);
     TrackToVertexIPEstimator<BoundParameters, Propagator> ipEst(ipEstCfg);
 
     using ZScanSeedFinder = ZScanVertexFinder<BilloirFitter>;
@@ -139,7 +137,7 @@ BOOST_AUTO_TEST_CASE(iterative_finder_test) {
     using ImpactPointEstimator =
         ImpactPoint3dEstimator<BoundParameters, Propagator>;
 
-    ImpactPointEstimator::Config ip3dEstCfg(bField, propagator, pOptions);
+    ImpactPointEstimator::Config ip3dEstCfg(bField, propagator);
     ImpactPointEstimator ip3dEst(ip3dEstCfg);
 
     VertexFinder::Config cfg(std::move(bFitter), std::move(linearizer),
@@ -210,7 +208,7 @@ BOOST_AUTO_TEST_CASE(iterative_finder_test) {
             0., 0., 0., 0., 0., res_ph * res_ph, 0., 0., 0., 0., 0., 0.,
             res_th * res_th, 0., 0., 0., 0., 0., 0., res_qp * res_qp, 0., 0.,
             0., 0., 0., 0., 1.;
-        auto params = BoundParameters(tgContext, std::move(covMat), paramVec,
+        auto params = BoundParameters(geoContext, std::move(covMat), paramVec,
                                       perigeeSurface);
 
         tracks.push_back(std::make_unique<BoundParameters>(params));
@@ -231,7 +229,8 @@ BOOST_AUTO_TEST_CASE(iterative_finder_test) {
       tracksPtr.push_back(trk.get());
     }
 
-    VertexingOptions<BoundParameters> vertexingOptions(tgContext, mfContext);
+    VertexingOptions<BoundParameters> vertexingOptions(geoContext,
+                                                       magFieldContext);
 
     // find vertices
     auto res = finder.find(tracksPtr, vertexingOptions);
@@ -326,8 +325,6 @@ BOOST_AUTO_TEST_CASE(iterative_finder_test_user_track_type) {
     // Set up propagator with void navigator
     auto propagator = std::make_shared<Propagator>(stepper);
 
-    PropagatorOptions<> pOptions(tgContext, mfContext);
-
     // Linearizer for user defined InputTrack type test
     Linearizer::Config ltConfigUT(bField, propagator);
     Linearizer linearizer(ltConfigUT);
@@ -347,7 +344,7 @@ BOOST_AUTO_TEST_CASE(iterative_finder_test_user_track_type) {
 
     // Set up all seed finder related things
     TrackToVertexIPEstimator<InputTrack, Propagator>::Config ipEstCfg(
-        propagator, pOptions);
+        propagator);
     TrackToVertexIPEstimator<InputTrack, Propagator> ipEst(ipEstCfg);
 
     using ZScanSeedFinder = ZScanVertexFinder<BilloirFitter>;
@@ -358,7 +355,7 @@ BOOST_AUTO_TEST_CASE(iterative_finder_test_user_track_type) {
     // IP 3D Estimator
     using ImpactPointEstimator = ImpactPoint3dEstimator<InputTrack, Propagator>;
 
-    ImpactPointEstimator::Config ip3dEstCfg(bField, propagator, pOptions);
+    ImpactPointEstimator::Config ip3dEstCfg(bField, propagator);
     ImpactPointEstimator ip3dEst(ip3dEstCfg);
 
     // Vertex Finder
@@ -431,8 +428,8 @@ BOOST_AUTO_TEST_CASE(iterative_finder_test_user_track_type) {
             0., 0., 0., 0., 0., res_ph * res_ph, 0., 0., 0., 0., 0., 0.,
             res_th * res_th, 0., 0., 0., 0., 0., 0., res_qp * res_qp, 0., 0.,
             0., 0., 0., 0., 1.;
-        auto paramsUT = InputTrack(BoundParameters(tgContext, std::move(covMat),
-                                                   paramVec, perigeeSurface));
+        auto paramsUT = InputTrack(BoundParameters(
+            geoContext, std::move(covMat), paramVec, perigeeSurface));
 
         tracks.push_back(std::make_unique<InputTrack>(paramsUT));
 
@@ -454,7 +451,8 @@ BOOST_AUTO_TEST_CASE(iterative_finder_test_user_track_type) {
       tracksPtr.push_back(trk.get());
     }
 
-    VertexingOptions<InputTrack> vertexingOptionsUT(tgContext, mfContext);
+    VertexingOptions<InputTrack> vertexingOptionsUT(geoContext,
+                                                    magFieldContext);
 
     // find vertices
     auto res = finder.find(tracksPtr, vertexingOptionsUT);
diff --git a/Tests/UnitTests/Core/Vertexing/KalmanVertexTrackUpdaterTests.cpp b/Tests/UnitTests/Core/Vertexing/KalmanVertexTrackUpdaterTests.cpp
index 5662c77f66a1cef11b3a0ae90bb16062da492423..211ea49e8d897edf59d82233c3fff5f6d9f7f0da 100644
--- a/Tests/UnitTests/Core/Vertexing/KalmanVertexTrackUpdaterTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/KalmanVertexTrackUpdaterTests.cpp
@@ -80,11 +80,10 @@ BOOST_AUTO_TEST_CASE(Kalman_Vertex_TrackUpdater) {
 
   // Set up propagator with void navigator
   auto propagator = std::make_shared<Propagator>(stepper);
-  PropagatorOptions<> pOptions(geoContext, magFieldContext);
 
   // Set up ImpactPoint3dEstimator, used for comparisons later
   ImpactPoint3dEstimator<BoundParameters, Propagator>::Config ip3dEstConfig(
-      bField, propagator, pOptions);
+      bField, propagator);
 
   ImpactPoint3dEstimator<BoundParameters, Propagator> ip3dEst(ip3dEstConfig);
 
diff --git a/Tests/UnitTests/Core/Vertexing/LinearizedTrackFactoryTests.cpp b/Tests/UnitTests/Core/Vertexing/LinearizedTrackFactoryTests.cpp
index 33b84d5ccb8d0bd0be75f727d04cb2fcfb91ffb2..c450d6bf706859f3842ebecbcd8d454037105015 100644
--- a/Tests/UnitTests/Core/Vertexing/LinearizedTrackFactoryTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/LinearizedTrackFactoryTests.cpp
@@ -33,7 +33,7 @@ using Linearizer =
 
 // Create a test context
 GeometryContext geoContext = GeometryContext();
-MagneticFieldContext mfContext = MagneticFieldContext();
+MagneticFieldContext magFieldContext = MagneticFieldContext();
 
 // Vertex x/y position distribution
 std::uniform_real_distribution<> vXYDist(-0.1_mm, 0.1_mm);
@@ -137,7 +137,7 @@ BOOST_AUTO_TEST_CASE(linearized_track_factory_test) {
     LinearizedTrack linTrack =
         linFactory
             .linearizeTrack(parameters, SpacePointVector::Zero(), geoContext,
-                            mfContext)
+                            magFieldContext)
             .value();
 
     BOOST_CHECK_NE(linTrack.parametersAtPCA, vecBoundZero);
@@ -228,7 +228,7 @@ BOOST_AUTO_TEST_CASE(linearized_track_factory_straightline_test) {
     LinearizedTrack linTrack =
         linFactory
             .linearizeTrack(parameters, SpacePointVector::Zero(), geoContext,
-                            mfContext)
+                            magFieldContext)
             .value();
 
     BOOST_CHECK_NE(linTrack.parametersAtPCA, vecBoundZero);
diff --git a/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp b/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp
index ea6d61771706a5485c63921abd65e9c215bf8218..513c35cd7ea330e455d74b09b71179c5792ca4ad 100644
--- a/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/TrackDensityVertexFinderTests.cpp
@@ -29,8 +29,8 @@ namespace Test {
 using Covariance = BoundSymMatrix;
 
 // Create a test context
-GeometryContext tgContext = GeometryContext();
-MagneticFieldContext mfContext = MagneticFieldContext();
+GeometryContext geoContext = GeometryContext();
+MagneticFieldContext magFieldContext = MagneticFieldContext();
 
 ///
 /// @brief Unit test for TrackDensityVertexFinder using same configuration
@@ -47,7 +47,8 @@ BOOST_AUTO_TEST_CASE(track_density_finder_test) {
   Vector3D pos1c{1.2_mm, 1.3_mm, -7_mm};
   Vector3D mom1c{300_MeV, 1000_MeV, 100_MeV};
 
-  VertexingOptions<BoundParameters> vertexingOptions(tgContext, mfContext);
+  VertexingOptions<BoundParameters> vertexingOptions(geoContext,
+                                                     magFieldContext);
 
   TrackDensityVertexFinder<DummyVertexFitter<>, GaussianTrackDensity> finder;
 
@@ -57,11 +58,11 @@ BOOST_AUTO_TEST_CASE(track_density_finder_test) {
       Surface::makeShared<PerigeeSurface>(pos0);
 
   // Test finder for some fixed track parameter values
-  BoundParameters params1a(tgContext, covMat, pos1a, mom1a, 1, 0,
+  BoundParameters params1a(geoContext, covMat, pos1a, mom1a, 1, 0,
                            perigeeSurface);
-  BoundParameters params1b(tgContext, covMat, pos1b, mom1b, -1, 0,
+  BoundParameters params1b(geoContext, covMat, pos1b, mom1b, -1, 0,
                            perigeeSurface);
-  BoundParameters params1c(tgContext, covMat, pos1c, mom1c, -1, 0,
+  BoundParameters params1c(geoContext, covMat, pos1c, mom1c, -1, 0,
                            perigeeSurface);
 
   // Vectors of track parameters in different orders
@@ -106,7 +107,8 @@ BOOST_AUTO_TEST_CASE(track_density_finder_constr_test) {
   double const expectedZResult = -13.013;
 
   // Finder options
-  VertexingOptions<BoundParameters> vertexingOptions(tgContext, mfContext);
+  VertexingOptions<BoundParameters> vertexingOptions(geoContext,
+                                                     magFieldContext);
 
   // Create constraint for seed finding
   Vector3D constraintPos{1.7_mm, 1.3_mm, -6_mm};
@@ -125,11 +127,11 @@ BOOST_AUTO_TEST_CASE(track_density_finder_constr_test) {
       Surface::makeShared<PerigeeSurface>(pos0);
 
   // Test finder for some fixed track parameter values
-  BoundParameters params1a(tgContext, covMat, pos1a, mom1a, 1, 0,
+  BoundParameters params1a(geoContext, covMat, pos1a, mom1a, 1, 0,
                            perigeeSurface);
-  BoundParameters params1b(tgContext, covMat, pos1b, mom1b, -1, 0,
+  BoundParameters params1b(geoContext, covMat, pos1b, mom1b, -1, 0,
                            perigeeSurface);
-  BoundParameters params1c(tgContext, covMat, pos1c, mom1c, -1, 0,
+  BoundParameters params1c(geoContext, covMat, pos1c, mom1c, -1, 0,
                            perigeeSurface);
 
   // Vector of track parameters
@@ -179,7 +181,8 @@ BOOST_AUTO_TEST_CASE(track_density_finder_random_test) {
   std::shared_ptr<PerigeeSurface> perigeeSurface =
       Surface::makeShared<PerigeeSurface>(pos0);
 
-  VertexingOptions<BoundParameters> vertexingOptions(tgContext, mfContext);
+  VertexingOptions<BoundParameters> vertexingOptions(geoContext,
+                                                     magFieldContext);
 
   TrackDensityVertexFinder<DummyVertexFitter<>, GaussianTrackDensity> finder;
 
@@ -209,7 +212,7 @@ BOOST_AUTO_TEST_CASE(track_density_finder_random_test) {
     Vector3D mom(pt * std::cos(phi), pt * std::sin(phi), pt * std::sinh(eta));
     double charge = etaDist(gen) > 0 ? 1 : -1;
 
-    trackVec.push_back(BoundParameters(tgContext, covMat, pos, mom, charge, 0,
+    trackVec.push_back(BoundParameters(geoContext, covMat, pos, mom, charge, 0,
                                        perigeeSurface));
   }
 
@@ -260,7 +263,7 @@ BOOST_AUTO_TEST_CASE(track_density_finder_usertrack_test) {
   double const expectedZResult = -13.013;
 
   // Finder options
-  VertexingOptions<InputTrack> vertexingOptions(tgContext, mfContext);
+  VertexingOptions<InputTrack> vertexingOptions(geoContext, magFieldContext);
 
   // Create constraint for seed finding
   Vector3D constraintPos{1.7_mm, 1.3_mm, -6_mm};
@@ -284,11 +287,11 @@ BOOST_AUTO_TEST_CASE(track_density_finder_usertrack_test) {
 
   // Test finder for some fixed track parameter values
   InputTrack params1a(
-      BoundParameters(tgContext, covMat, pos1a, mom1a, 1, 0, perigeeSurface));
+      BoundParameters(geoContext, covMat, pos1a, mom1a, 1, 0, perigeeSurface));
   InputTrack params1b(
-      BoundParameters(tgContext, covMat, pos1b, mom1b, -1, 0, perigeeSurface));
+      BoundParameters(geoContext, covMat, pos1b, mom1b, -1, 0, perigeeSurface));
   InputTrack params1c(
-      BoundParameters(tgContext, covMat, pos1c, mom1c, -1, 0, perigeeSurface));
+      BoundParameters(geoContext, covMat, pos1c, mom1c, -1, 0, perigeeSurface));
 
   // Vector of track parameters
   std::vector<const InputTrack*> vec1 = {&params1a, &params1b, &params1c};
diff --git a/Tests/UnitTests/Core/Vertexing/TrackToVertexIPEstimatorTests.cpp b/Tests/UnitTests/Core/Vertexing/TrackToVertexIPEstimatorTests.cpp
index 9e99cc1631b9e3fe059ff67eb210173cde0a172d..377ce121430aa55debf991132274aaba2ff0601b 100644
--- a/Tests/UnitTests/Core/Vertexing/TrackToVertexIPEstimatorTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/TrackToVertexIPEstimatorTests.cpp
@@ -30,8 +30,8 @@ namespace Test {
 using Covariance = BoundSymMatrix;
 
 // Create a test context
-GeometryContext tgContext = GeometryContext();
-MagneticFieldContext mfContext = MagneticFieldContext();
+GeometryContext geoContext = GeometryContext();
+MagneticFieldContext magFieldContext = MagneticFieldContext();
 
 // Vertex x/y position distribution
 std::uniform_real_distribution<> vXYDist(-0.1_mm, 0.1_mm);
@@ -79,8 +79,6 @@ BOOST_AUTO_TEST_CASE(track_to_vertex_ip_estimator_test) {
   auto propagator =
       std::make_shared<Propagator<EigenStepper<ConstantBField>>>(stepper);
 
-  PropagatorOptions<> pOptions(tgContext, mfContext);
-
   // Create perigee surface
   std::shared_ptr<PerigeeSurface> perigeeSurface =
       Surface::makeShared<PerigeeSurface>(Vector3D(0., 0., 0.));
@@ -111,7 +109,7 @@ BOOST_AUTO_TEST_CASE(track_to_vertex_ip_estimator_test) {
       TrackToVertexIPEstimator<BoundParameters,
                                Propagator<EigenStepper<ConstantBField>>>;
 
-  IPEst_t::Config ipEstCfg(propagator, pOptions);
+  IPEst_t::Config ipEstCfg(propagator);
 
   // Create TrackToVertexIPEstimator
   IPEst_t ipEst(ipEstCfg);
@@ -140,12 +138,13 @@ BOOST_AUTO_TEST_CASE(track_to_vertex_ip_estimator_test) {
         0., 0., 0., resPh * resPh, 0., 0., 0., 0., 0., 0., resTh * resTh, 0.,
         0., 0., 0., 0., 0., resQp * resQp, 0., 0., 0., 0., 0., 0., 1.;
 
-    BoundParameters track =
-        BoundParameters(tgContext, std::move(covMat), paramVec, perigeeSurface);
+    BoundParameters track = BoundParameters(geoContext, std::move(covMat),
+                                            paramVec, perigeeSurface);
 
     // Check if IP are retrieved
     ImpactParametersAndSigma output =
-        ipEst.estimate(track, myConstraint).value();
+        ipEst.estimate(track, myConstraint, geoContext, magFieldContext)
+            .value();
     BOOST_CHECK_NE(output.IPd0, 0.);
     BOOST_CHECK_NE(output.IPz0, 0.);
   }
diff --git a/Tests/UnitTests/Core/Vertexing/ZScanVertexFinderTests.cpp b/Tests/UnitTests/Core/Vertexing/ZScanVertexFinderTests.cpp
index 4143b9116c6e99e5f76d4a6db584e9b2594466a2..f0c991b3d9a4c932b1def92dbdb1c5fb7d53a9cd 100644
--- a/Tests/UnitTests/Core/Vertexing/ZScanVertexFinderTests.cpp
+++ b/Tests/UnitTests/Core/Vertexing/ZScanVertexFinderTests.cpp
@@ -36,8 +36,8 @@ using Propagator = Propagator<EigenStepper<ConstantBField>>;
 using Linearizer_t = HelicalTrackLinearizer<Propagator>;
 
 // Create a test context
-GeometryContext tgContext = GeometryContext();
-MagneticFieldContext mfContext = MagneticFieldContext();
+GeometryContext geoContext = GeometryContext();
+MagneticFieldContext magFieldContext = MagneticFieldContext();
 
 // Vertex x/y position distribution
 std::uniform_real_distribution<> vXYDist(-0.1_mm, 0.1_mm);
@@ -84,7 +84,6 @@ BOOST_AUTO_TEST_CASE(zscan_finder_test) {
 
     // Set up propagator with void navigator
     auto propagator = std::make_shared<Propagator>(stepper);
-    PropagatorOptions<> pOptions(tgContext, mfContext);
 
     typedef FullBilloirVertexFitter<BoundParameters, Linearizer_t>
         BilloirFitter;
@@ -131,7 +130,7 @@ BOOST_AUTO_TEST_CASE(zscan_finder_test) {
           0., 0., 0., 0., resPh * resPh, 0., 0., 0., 0., 0., 0., resTh * resTh,
           0., 0., 0., 0., 0., 0., resQp * resQp, 0., 0., 0., 0., 0., 0., 1.;
 
-      tracks.push_back(BoundParameters(tgContext, std::move(covMat), paramVec,
+      tracks.push_back(BoundParameters(geoContext, std::move(covMat), paramVec,
                                        perigeeSurface));
     }
 
@@ -146,14 +145,15 @@ BOOST_AUTO_TEST_CASE(zscan_finder_test) {
                   "Vertex finder does not fulfill vertex finder concept.");
 
     TrackToVertexIPEstimator<BoundParameters, Propagator>::Config ipEstCfg(
-        propagator, pOptions);
+        propagator);
     TrackToVertexIPEstimator<BoundParameters, Propagator> ipEst(ipEstCfg);
 
     VertexFinder::Config cfg(std::move(ipEst));
 
     VertexFinder finder(std::move(cfg));
 
-    VertexingOptions<BoundParameters> vertexingOptions(tgContext, mfContext);
+    VertexingOptions<BoundParameters> vertexingOptions(geoContext,
+                                                       magFieldContext);
 
     auto res = finder.find(tracksPtr, vertexingOptions);
 
@@ -205,7 +205,6 @@ BOOST_AUTO_TEST_CASE(zscan_finder_usertrack_test) {
 
     // Set up propagator with void navigator
     auto propagator = std::make_shared<Propagator>(stepper);
-    PropagatorOptions<> pOptions(tgContext, mfContext);
 
     typedef FullBilloirVertexFitter<InputTrack, Linearizer_t> BilloirFitter;
 
@@ -251,7 +250,7 @@ BOOST_AUTO_TEST_CASE(zscan_finder_usertrack_test) {
           0., 0., 0., 0., resPh * resPh, 0., 0., 0., 0., 0., 0., resTh * resTh,
           0., 0., 0., 0., 0., 0., resQp * resQp, 0., 0., 0., 0., 0., 0., 1.;
 
-      tracks.push_back(InputTrack(BoundParameters(tgContext, std::move(covMat),
+      tracks.push_back(InputTrack(BoundParameters(geoContext, std::move(covMat),
                                                   paramVec, perigeeSurface)));
     }
 
@@ -266,7 +265,7 @@ BOOST_AUTO_TEST_CASE(zscan_finder_usertrack_test) {
                   "Vertex finder does not fulfill vertex finder concept.");
 
     TrackToVertexIPEstimator<InputTrack, Propagator>::Config ipEstCfg(
-        propagator, pOptions);
+        propagator);
     TrackToVertexIPEstimator<InputTrack, Propagator> ipEst(ipEstCfg);
 
     VertexFinder::Config cfg(std::move(ipEst));
@@ -278,7 +277,7 @@ BOOST_AUTO_TEST_CASE(zscan_finder_usertrack_test) {
 
     VertexFinder finder(std::move(cfg), extractParameters);
 
-    VertexingOptions<InputTrack> vertexingOptions(tgContext, mfContext);
+    VertexingOptions<InputTrack> vertexingOptions(geoContext, magFieldContext);
 
     auto res = finder.find(tracksPtr, vertexingOptions);