diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp
index e8ad766a47a69d47cee3639a4e8f5a30483725f5..ae9923fffc697061ed6c24c797de791e3930c989 100644
--- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp
+++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp
@@ -16,6 +16,7 @@
 #include "Acts/Vertexing/AMVFInfo.hpp"
 #include "Acts/Vertexing/TrackToVertexIPEstimator.hpp"
 #include "Acts/Vertexing/VertexFinderOptions.hpp"
+#include "Acts/Vertexing/VertexFitterOptions.hpp"
 
 namespace Acts {
 /// @class AdaptiveMultiVertexFinder
@@ -339,6 +340,22 @@ class AdaptiveMultiVertexFinder {
       const Vertex<InputTrack_t>* vtx,
       const std::vector<Vertex<InputTrack_t>*>& allVertices) const;
 
+  /// @brief Method that deletes last vertex from list of all vertices
+  /// and either refits all vertices afterwards (if refitAfterBadVertex)
+  /// of reverts to the old state of the vertex fitter before the bad
+  /// vertex was added to the fit (if not refitAfterBadVertex).
+  ///
+  /// @param allVertices Vector containing the unique_ptr to vertices
+  /// @param allVerticesPtr Vector containing the actual addresses
+  /// @param fitterState The current vertex fitter state
+  /// @param oldFitterState The old vertex fitter state
+  /// @param vFitterOptions The vertex fitter options
+  Result<void> deleteLastVertex(
+      std::vector<std::unique_ptr<Vertex<InputTrack_t>>>& allVertices,
+      std::vector<Vertex<InputTrack_t>*>& allVerticesPtr,
+      FitterState_t& fitterState, FitterState_t& oldFitterState,
+      const VertexFitterOptions<InputTrack_t>& vFitterOptions) const;
+
   /// @brief Prepares the output vector of vertices
   ///
   /// @param allVerticesPtr Vector of pointers to vertices
diff --git a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp
index 785cb1fce1e1aceb1d7881e883565616b85f2f83..f41e1e8b381209cf953e42308e16b3d119e78025 100644
--- a/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp
+++ b/Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp
@@ -6,7 +6,6 @@
 // License, v. 2.0. If a copy of the MPL was not distributed with this
 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-#include "Acts/Vertexing/VertexFitterOptions.hpp"
 #include "Acts/Vertexing/VertexingError.hpp"
 
 template <typename vfitter_t, typename sfinder_t>
@@ -91,7 +90,6 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find(
     }
     ACTS_DEBUG("New position of current vertex candidate after fit: "
                << vtxCandidate->fullPosition());
-
     // Check if vertex is good vertex
     bool isGoodVertex = false;
     int nCompatibleTracks = 0;
@@ -106,7 +104,6 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find(
       bool removedNonCompatibleTrack =
           canRemoveNonCompatibleTrackFromSeedTracks(vtxCandidate, seedTracks,
                                                     fitterState);
-
       if (!removedNonCompatibleTrack) {
         ACTS_DEBUG(
             "Could not remove any further track from seed tracks. Break.");
@@ -121,34 +118,11 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find(
 
     // Delete vertex from allVertices list again if it's not kept
     if (not keepVertex) {
-      allVertices.pop_back();
-      allVerticesPtr.pop_back();
-
-      if (!m_cfg.refitAfterBadVertex) {
-        fitterState.vertexCollection = oldFitterState.vertexCollection;
-        fitterState.annealingState = oldFitterState.annealingState;
-        fitterState.vtxInfoMap.clear();
-        for (const auto& vtx : allVerticesPtr) {
-          fitterState.vtxInfoMap.insert(
-              std::make_pair(vtx, oldFitterState.vtxInfoMap[vtx]));
-        }
-        fitterState.trackToVerticesMultiMap =
-            oldFitterState.trackToVerticesMultiMap;
-        fitterState.tracksAtVerticesMap = oldFitterState.tracksAtVerticesMap;
-
-      } else {
-        // Update fitter state with removed vertex candidate
-        fitterState.updateTrkToVerticesMultiMap(allVerticesPtr);
-
-        // TODO: clean tracksAtVerticesMap maybe here? i.e. remove all entries
-        // with old vertex?
-
-        // Do the fit with removed vertex
-        auto fitResult = m_cfg.vertexFitter.fit(
-            fitterState, allVerticesPtr, m_cfg.linearizer, vFitterOptions);
-        if (!fitResult.ok()) {
-          return fitResult.error();
-        }
+      auto deleteVertexResult =
+          deleteLastVertex(allVertices, allVerticesPtr, fitterState,
+                           oldFitterState, vFitterOptions);
+      if (not deleteVertexResult.ok()) {
+        return deleteVertexResult.error();
       }
     }
     iteration++;
@@ -543,6 +517,45 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::isMergedVertex(
   return false;
 }
 
+template <typename vfitter_t, typename sfinder_t>
+auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::deleteLastVertex(
+    std::vector<std::unique_ptr<Vertex<InputTrack_t>>>& allVertices,
+    std::vector<Vertex<InputTrack_t>*>& allVerticesPtr,
+    FitterState_t& fitterState, FitterState_t& oldFitterState,
+    const VertexFitterOptions<InputTrack_t>& vFitterOptions) const
+    -> Result<void> {
+  allVertices.pop_back();
+  allVerticesPtr.pop_back();
+
+  if (!m_cfg.refitAfterBadVertex) {
+    fitterState.vertexCollection = oldFitterState.vertexCollection;
+    fitterState.annealingState = oldFitterState.annealingState;
+    fitterState.vtxInfoMap.clear();
+    for (const auto& vtx : allVerticesPtr) {
+      fitterState.vtxInfoMap.insert(
+          std::make_pair(vtx, oldFitterState.vtxInfoMap[vtx]));
+    }
+    fitterState.trackToVerticesMultiMap =
+        oldFitterState.trackToVerticesMultiMap;
+    fitterState.tracksAtVerticesMap = oldFitterState.tracksAtVerticesMap;
+
+  } else {
+    // Update fitter state with removed vertex candidate
+    fitterState.updateTrkToVerticesMultiMap(allVerticesPtr);
+
+    // TODO: clean tracksAtVerticesMap maybe here? i.e. remove all entries
+    // with old vertex?
+
+    // Do the fit with removed vertex
+    auto fitResult = m_cfg.vertexFitter.fit(fitterState, allVerticesPtr,
+                                            m_cfg.linearizer, vFitterOptions);
+    if (!fitResult.ok()) {
+      return fitResult.error();
+    }
+  }
+  return {};
+}
+
 template <typename vfitter_t, typename sfinder_t>
 auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::getVertexOutputList(
     const std::vector<Vertex<InputTrack_t>*>& allVerticesPtr,