diff --git a/src/mesh/MeshEdgeBoundary.cpp b/src/mesh/MeshEdgeBoundary.cpp
index 2542b0a3d6eaa1d47927e6c83147b4d06888cf06..00ece5864c622b9e62d50afba09380d6022dfaef 100644
--- a/src/mesh/MeshEdgeBoundary.cpp
+++ b/src/mesh/MeshEdgeBoundary.cpp
@@ -7,7 +7,7 @@
 
 template <size_t Dimension>
 MeshEdgeBoundary<Dimension>::MeshEdgeBoundary(const Mesh<Connectivity<Dimension>>&, const RefEdgeList& ref_edge_list)
-  : m_edge_list(ref_edge_list.list()), m_boundary_name(ref_edge_list.refId().tagName())
+  : m_ref_edge_list(ref_edge_list), m_boundary_name(ref_edge_list.refId().tagName())
 {}
 
 template MeshEdgeBoundary<1>::MeshEdgeBoundary(const Mesh<Connectivity<1>>&, const RefEdgeList&);
@@ -43,18 +43,17 @@ MeshEdgeBoundary<Dimension>::MeshEdgeBoundary(const Mesh<Connectivity<Dimension>
     Array<EdgeId> edge_list(edge_ids.size());
     parallel_for(
       edge_ids.size(), PUGS_LAMBDA(int r) { edge_list[r] = edge_ids[r]; });
-    m_edge_list = edge_list;
+    m_ref_edge_list = RefEdgeList{ref_face_list.refId(), edge_list, ref_face_list.isBoundary()};
   } else if constexpr (Dimension == 2) {
     Array<EdgeId> edge_list(face_list.size());
     parallel_for(
       face_list.size(), PUGS_LAMBDA(int r) { edge_list[r] = static_cast<FaceId::base_type>(face_list[r]); });
-    m_edge_list = edge_list;
+    m_ref_edge_list = RefEdgeList{ref_face_list.refId(), edge_list, ref_face_list.isBoundary()};
   }
 
   // This is quite dirty but it allows a non negligible performance
   // improvement
-  const_cast<Connectivity<Dimension>&>(mesh.connectivity())
-    .addRefItemList(RefItemList<ItemType::edge>(ref_face_list.refId(), m_edge_list, ref_face_list.isBoundary()));
+  const_cast<Connectivity<Dimension>&>(mesh.connectivity()).addRefItemList(m_ref_edge_list);
 }
 
 template MeshEdgeBoundary<2>::MeshEdgeBoundary(const Mesh<Connectivity<2>>&, const RefFaceList&);
diff --git a/src/mesh/MeshEdgeBoundary.hpp b/src/mesh/MeshEdgeBoundary.hpp
index 9ff40cc6e66070c6b1d3f6f2a5dcf3296cb9b791..012579bb065ec697d7d7aa97cd1bec0664b076ff 100644
--- a/src/mesh/MeshEdgeBoundary.hpp
+++ b/src/mesh/MeshEdgeBoundary.hpp
@@ -16,7 +16,7 @@ template <size_t Dimension>
 class [[nodiscard]] MeshEdgeBoundary   // clazy:exclude=copyable-polymorphic
 {
  protected:
-  Array<const EdgeId> m_edge_list;
+  RefEdgeList m_ref_edge_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]] MeshEdgeBoundary   // clazy:exclude=copyable-polymorphic
   MeshEdgeBoundary& operator=(const MeshEdgeBoundary&) = default;
   MeshEdgeBoundary& operator=(MeshEdgeBoundary&&) = default;
 
+  PUGS_INLINE
+  const RefEdgeList& refEdgeList() const
+  {
+    return m_ref_edge_list;
+  }
+
+  PUGS_INLINE
   const Array<const EdgeId>& edgeList() const
   {
-    return m_edge_list;
+    return m_ref_edge_list.list();
   }
 
  protected: