diff --git a/MeshLib/MeshEditing/DuplicateMeshComponents.cpp b/MeshLib/MeshEditing/DuplicateMeshComponents.cpp
index fb089427248d3fc35628e74d9136d8ad0fda822f..6f8b0031b35e4afe8028e2e88350993c11f731ca 100644
--- a/MeshLib/MeshEditing/DuplicateMeshComponents.cpp
+++ b/MeshLib/MeshEditing/DuplicateMeshComponents.cpp
@@ -70,4 +70,15 @@ MeshLib::Element* copyElement(MeshLib::Element const*const element, const std::v
     return new E(new_nodes);
 }
 
+std::vector<MeshLib::Element*> cloneElements(
+    std::vector<MeshLib::Element*> const& elements)
+{
+    std::vector<MeshLib::Element*> cloned_elements;
+    cloned_elements.reserve(elements.size());
+    std::transform(begin(elements), end(elements),
+                   std::back_inserter(cloned_elements),
+                   [](MeshLib::Element* const e) { return e->clone(); });
+    return cloned_elements;
+}
+
 } // namespace MeshLib
diff --git a/MeshLib/MeshEditing/DuplicateMeshComponents.h b/MeshLib/MeshEditing/DuplicateMeshComponents.h
index 9c910eb577e5e6aa75e4c11920c37a1e0ec94980..1aae2785700e108b14f8a6c43ab5888c7c8a021b 100644
--- a/MeshLib/MeshEditing/DuplicateMeshComponents.h
+++ b/MeshLib/MeshEditing/DuplicateMeshComponents.h
@@ -41,4 +41,7 @@ namespace MeshLib
     template <typename E>
     MeshLib::Element* copyElement(MeshLib::Element const*const element, const std::vector<MeshLib::Node*> &nodes);
 
+    /// Clones a vector of elements using the Element::clone() function.
+    std::vector<MeshLib::Element*> cloneElements(
+        std::vector<MeshLib::Element*> const& elements);
 } // end namespace MeshLib
diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
index d9a9ad8c7612c35c4640458a2dffd382c4cca5cf..00cfc3aeaab7aaaad7fe1465eecf42d363de1ad9 100644
--- a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
@@ -14,6 +14,7 @@
 #include "MeshGeoToolsLib/CreateSearchLength.h"
 #include "MeshGeoToolsLib/MeshNodeSearcher.h"
 #include "MeshGeoToolsLib/SearchLength.h"
+#include "MeshLib/MeshEditing/DuplicateMeshComponents.h"
 #include "NeumannBoundaryCondition.h"
 #include "NonuniformDirichletBoundaryCondition.h"
 #include "NonuniformNeumannBoundaryCondition.h"
@@ -152,9 +153,10 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition(
 
     return ProcessLib::createNeumannBoundaryCondition(
         config.config,
-        getClonedElements(boundary_element_searcher, config.geometry),
-        dof_table, variable_id, *config.component_id,
-        mesh.isAxiallySymmetric(), integration_order, shapefunction_order, mesh.getDimension(),
+        MeshLib::cloneElements(
+            boundary_element_searcher.getBoundaryElements(config.geometry)),
+        dof_table, variable_id, *config.component_id, mesh.isAxiallySymmetric(),
+        integration_order, shapefunction_order, mesh.getDimension(),
         parameters);
 }
 
@@ -178,9 +180,10 @@ BoundaryConditionBuilder::createRobinBoundaryCondition(
 
     return ProcessLib::createRobinBoundaryCondition(
         config.config,
-        getClonedElements(boundary_element_searcher, config.geometry),
-        dof_table, variable_id, *config.component_id,
-        mesh.isAxiallySymmetric(), integration_order, shapefunction_order, mesh.getDimension(),
+        MeshLib::cloneElements(
+            boundary_element_searcher.getBoundaryElements(config.geometry)),
+        dof_table, variable_id, *config.component_id, mesh.isAxiallySymmetric(),
+        integration_order, shapefunction_order, mesh.getDimension(),
         parameters);
 }
 
@@ -227,7 +230,8 @@ BoundaryConditionBuilder::createNormalTractionBoundaryCondition(
     return ProcessLib::NormalTractionBoundaryCondition::
         createNormalTractionBoundaryCondition(
             config.config,
-            getClonedElements(boundary_element_searcher, config.geometry),
+            MeshLib::cloneElements(
+                boundary_element_searcher.getBoundaryElements(config.geometry)),
             dof_table, variable_id, mesh.isAxiallySymmetric(),
             integration_order, shapefunction_order, mesh.getDimension(),
             parameters);
@@ -248,20 +252,4 @@ std::unique_ptr<BoundaryCondition> BoundaryConditionBuilder::
             config.config, dof_table, mesh, variable_id, *config.component_id);
 }
 
-std::vector<MeshLib::Element*> BoundaryConditionBuilder::getClonedElements(
-    MeshGeoToolsLib::BoundaryElementsSearcher& boundary_element_searcher,
-    GeoLib::GeoObject const& geometry)
-{
-    std::vector<MeshLib::Element*> elements =
-        boundary_element_searcher.getBoundaryElements(geometry);
-
-    // Deep copy all the elements, because the searcher might destroy the
-    // originals. Store pointers to the copies in the elements vector (i.e.,
-    // in-place modification).
-    for (auto& e : elements)
-        e = e->clone();
-
-    return elements;
-}
-
-}  // ProcessLib
+}  // namespace ProcessLib
diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.h b/ProcessLib/BoundaryCondition/BoundaryCondition.h
index a654c57659168f5c3447bae767c4e3c55e3f0cda..4f60df600815fc52b2e0f450e68eb434b40f39f9 100644
--- a/ProcessLib/BoundaryCondition/BoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/BoundaryCondition.h
@@ -141,10 +141,6 @@ protected:
         const unsigned /*shapefunction_order*/,
         const std::vector<
             std::unique_ptr<ProcessLib::ParameterBase>>& /*parameters*/);
-
-    static std::vector<MeshLib::Element*> getClonedElements(
-        MeshGeoToolsLib::BoundaryElementsSearcher& boundary_element_searcher,
-        GeoLib::GeoObject const& geometry);
 };
 
 }  // ProcessLib
diff --git a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
index 6b6efc9f6c69a6f0869450f43e4b28b98b9b4660..6119668b3efbae79406da781827eb38b319c9449 100644
--- a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
+++ b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
@@ -13,6 +13,7 @@
 #include "MeshGeoToolsLib/MeshNodeSearcher.h"
 #include "MeshGeoToolsLib/SearchLength.h"
 #include "MeshLib/Mesh.h"
+#include "MeshLib/MeshEditing/DuplicateMeshComponents.h"
 #include "ProcessLib/BoundaryCondition/BoundaryConditionConfig.h"
 
 #include "NeumannBoundaryCondition.h"
@@ -40,7 +41,8 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition(
 
     return ProcessLib::LIE::createNeumannBoundaryCondition(
         config.config,
-        getClonedElements(boundary_element_searcher, config.geometry),
+        MeshLib::cloneElements(
+            boundary_element_searcher.getBoundaryElements(config.geometry)),
         dof_table, variable_id, *config.component_id, mesh.isAxiallySymmetric(),
         integration_order, shapefunction_order, mesh.getDimension(), parameters,
         _fracture_prop);