diff --git a/src/mesh/MeshFaceBoundary.cpp b/src/mesh/MeshFaceBoundary.cpp
index f061ed646355a76fe846546c1564efb07253123e..2aeaa4b9db806605886cf529247a9db5e4ced0d4 100644
--- a/src/mesh/MeshFaceBoundary.cpp
+++ b/src/mesh/MeshFaceBoundary.cpp
@@ -6,7 +6,7 @@
 
 template <size_t Dimension>
 MeshFaceBoundary<Dimension>::MeshFaceBoundary(const Mesh<Connectivity<Dimension>>&, const RefFaceList& ref_face_list)
-  : m_face_list(ref_face_list.list()), m_boundary_name(ref_face_list.refId().tagName())
+  : m_ref_face_list(ref_face_list), m_boundary_name(ref_face_list.refId().tagName())
 {}
 
 template MeshFaceBoundary<1>::MeshFaceBoundary(const Mesh<Connectivity<1>>&, const RefFaceList&);
diff --git a/src/mesh/MeshFaceBoundary.hpp b/src/mesh/MeshFaceBoundary.hpp
index 7493e9cd46e4d434902e65116024bbd7b82f5069..6ef09579717e87511a99ef5867cda59b299a1be5 100644
--- a/src/mesh/MeshFaceBoundary.hpp
+++ b/src/mesh/MeshFaceBoundary.hpp
@@ -16,7 +16,7 @@ template <size_t Dimension>
 class [[nodiscard]] MeshFaceBoundary   // clazy:exclude=copyable-polymorphic
 {
  protected:
-  Array<const FaceId> m_face_list;
+  RefFaceList m_ref_face_list;
   std::string m_boundary_name;
 
   std::array<TinyVector<Dimension>, Dimension*(Dimension - 1)> _getBounds(const Mesh<Connectivity<Dimension>>& mesh)
@@ -30,9 +30,16 @@ class [[nodiscard]] MeshFaceBoundary   // clazy:exclude=copyable-polymorphic
   MeshFaceBoundary& operator=(const MeshFaceBoundary&) = default;
   MeshFaceBoundary& operator=(MeshFaceBoundary&&) = default;
 
+  PUGS_INLINE
+  const RefFaceList& refFaceList() const
+  {
+    return m_ref_face_list;
+  }
+
+  PUGS_INLINE
   const Array<const FaceId>& faceList() const
   {
-    return m_face_list;
+    return m_ref_face_list.list();
   }
 
  protected:
diff --git a/src/mesh/MeshFlatFaceBoundary.cpp b/src/mesh/MeshFlatFaceBoundary.cpp
index cb7740c6736f507e5b3ff12b4baa93789349ca8a..87d353e25404c3b5996a63945a9e220e49e97e55 100644
--- a/src/mesh/MeshFlatFaceBoundary.cpp
+++ b/src/mesh/MeshFlatFaceBoundary.cpp
@@ -8,21 +8,11 @@ template <size_t Dimension>
 MeshFlatFaceBoundary<Dimension>
 getMeshFlatFaceBoundary(const Mesh<Connectivity<Dimension>>& mesh, const IBoundaryDescriptor& boundary_descriptor)
 {
-  for (size_t i_ref_face_list = 0; i_ref_face_list < mesh.connectivity().template numberOfRefItemList<ItemType::face>();
-       ++i_ref_face_list) {
-    const auto& ref_face_list = mesh.connectivity().template refItemList<ItemType::face>(i_ref_face_list);
-    const RefId& ref          = ref_face_list.refId();
-    if (ref == boundary_descriptor) {
-      MeshFlatNodeBoundary<Dimension> mesh_flat_node_boundary = getMeshFlatNodeBoundary(mesh, boundary_descriptor);
+  MeshFaceBoundary<Dimension> mesh_face_boundary          = getMeshFaceBoundary(mesh, boundary_descriptor);
+  MeshFlatNodeBoundary<Dimension> mesh_flat_node_boundary = getMeshFlatNodeBoundary(mesh, boundary_descriptor);
 
-      return MeshFlatFaceBoundary<Dimension>{mesh, ref_face_list, mesh_flat_node_boundary.outgoingNormal()};
-    }
-  }
-
-  std::ostringstream ost;
-  ost << "cannot find face list with name \"" << rang::fgB::red << boundary_descriptor << rang::style::reset << "\"";
-
-  throw NormalError(ost.str());
+  return MeshFlatFaceBoundary<Dimension>{mesh, mesh_face_boundary.refFaceList(),
+                                         mesh_flat_node_boundary.outgoingNormal()};
 }
 
 template MeshFlatFaceBoundary<1> getMeshFlatFaceBoundary(const Mesh<Connectivity<1>>&, const IBoundaryDescriptor&);