diff --git a/src/mesh/Stencil.hpp b/src/mesh/Stencil.hpp
index 900c1b4d2e5dad1ff338c7c7714fcbe5f498cfb7..eb4864c7d064ab45b934aa70639697de18cc989e 100644
--- a/src/mesh/Stencil.hpp
+++ b/src/mesh/Stencil.hpp
@@ -8,8 +8,38 @@
 class Stencil
 {
  public:
-  using BoundaryDescriptorStencilList =
-    std::vector<std::pair<std::shared_ptr<const IBoundaryDescriptor>, ConnectivityMatrix>>;
+  class BoundaryDescriptorStencil
+  {
+   private:
+    std::shared_ptr<const IBoundaryDescriptor> m_iboundary_descriptor;
+    ConnectivityMatrix m_stencil;
+
+   public:
+    const IBoundaryDescriptor&
+    boundaryDescriptor() const
+    {
+      return *m_iboundary_descriptor;
+    }
+
+    const ConnectivityMatrix&
+    stencil() const
+    {
+      return m_stencil;
+    }
+
+    BoundaryDescriptorStencil(const std::shared_ptr<const IBoundaryDescriptor>& iboundary_descriptor,
+                              const ConnectivityMatrix& stencil)
+      : m_iboundary_descriptor{iboundary_descriptor}, m_stencil{stencil}
+    {}
+
+    BoundaryDescriptorStencil(const BoundaryDescriptorStencil&) = default;
+    BoundaryDescriptorStencil(BoundaryDescriptorStencil&&)      = default;
+
+    BoundaryDescriptorStencil()  = default;
+    ~BoundaryDescriptorStencil() = default;
+  };
+
+  using BoundaryDescriptorStencilList = std::vector<BoundaryDescriptorStencil>;
 
  private:
   ConnectivityMatrix m_stencil;
diff --git a/src/mesh/StencilBuilder.cpp b/src/mesh/StencilBuilder.cpp
index ddff37e0cb6a693999701b83eb5418ef35644af8..30e922ec24b8303b9dd279ac702c154648a26b29 100644
--- a/src/mesh/StencilBuilder.cpp
+++ b/src/mesh/StencilBuilder.cpp
@@ -318,9 +318,10 @@ StencilBuilder::_build(const ConnectivityType& connectivity,
         size_t i = 0;
         for (auto&& p_boundary_descriptor : symmetry_boundary_descriptor_list) {
           symmetry_boundary_stencil_list.emplace_back(
-            std::make_pair(p_boundary_descriptor,
-                           ConnectivityMatrix{symmetry_row_map_list[i],
-                                              convert_to_array(symmetry_column_indices_vector[i])}));
+            Stencil::BoundaryDescriptorStencil{p_boundary_descriptor,
+                                               ConnectivityMatrix{symmetry_row_map_list[i],
+                                                                  convert_to_array(
+                                                                    symmetry_column_indices_vector[i])}});
           ++i;
         }
       }
diff --git a/src/scheme/PolynomialReconstruction.cpp b/src/scheme/PolynomialReconstruction.cpp
index b0cacf9d9768a73e5b1127d91569c0832254a523..7bcf3a5c68407bc0fb50d6cf46560de4178b635f 100644
--- a/src/scheme/PolynomialReconstruction.cpp
+++ b/src/scheme/PolynomialReconstruction.cpp
@@ -785,7 +785,7 @@ PolynomialReconstruction::_build(
     auto stencil_cell_list = stencil[cell_id];
     size_t stencil_size    = stencil_cell_list.size();
     for (size_t i = 0; i < m_descriptor.symmetryBoundaryDescriptorList().size(); ++i) {
-      auto& ghost_stencil = stencil.symmetryBoundaryStencilList()[i].second;
+      auto& ghost_stencil = stencil.symmetryBoundaryStencilList()[i].stencil();
       stencil_size += ghost_stencil[cell_id].size();
     }
 
@@ -898,7 +898,7 @@ PolynomialReconstruction::_build(
                 }
 
                 for (size_t i_symmetry = 0; i_symmetry < stencil.symmetryBoundaryStencilList().size(); ++i_symmetry) {
-                  auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].second;
+                  auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].stencil();
                   auto ghost_cell_list = ghost_stencil[cell_j_id];
                   for (size_t i = 0; i < ghost_cell_list.size(); ++i, ++index) {
                     const CellId cell_i_id = ghost_cell_list[i];
@@ -954,7 +954,7 @@ PolynomialReconstruction::_build(
                 }
 
                 for (size_t i_symmetry = 0; i_symmetry < stencil.symmetryBoundaryStencilList().size(); ++i_symmetry) {
-                  auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].second;
+                  auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].stencil();
                   auto ghost_cell_list = ghost_stencil[cell_j_id];
                   for (size_t i = 0; i < ghost_cell_list.size(); ++i, ++index) {
                     const CellId cell_i_id = ghost_cell_list[i];
@@ -989,7 +989,7 @@ PolynomialReconstruction::_build(
             }
           }
           for (size_t i_symmetry = 0; i_symmetry < stencil.symmetryBoundaryStencilList().size(); ++i_symmetry) {
-            auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].second;
+            auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].stencil();
             auto ghost_cell_list = ghost_stencil[cell_j_id];
 
             const Rd& origin = symmetry_origin_list[i_symmetry];
@@ -1034,7 +1034,7 @@ PolynomialReconstruction::_build(
                 }
               }
               for (size_t i_symmetry = 0; i_symmetry < stencil.symmetryBoundaryStencilList().size(); ++i_symmetry) {
-                auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].second;
+                auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].stencil();
                 auto ghost_cell_list = ghost_stencil[cell_j_id];
 
                 const Rd& origin = symmetry_origin_list[i_symmetry];
@@ -1079,7 +1079,7 @@ PolynomialReconstruction::_build(
               }
             }
             for (size_t i_symmetry = 0; i_symmetry < stencil.symmetryBoundaryStencilList().size(); ++i_symmetry) {
-              auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].second;
+              auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].stencil();
               auto ghost_cell_list = ghost_stencil[cell_j_id];
 
               const Rd& origin = symmetry_origin_list[i_symmetry];
@@ -1120,7 +1120,7 @@ PolynomialReconstruction::_build(
             }
           }
           for (size_t i_symmetry = 0; i_symmetry < stencil.symmetryBoundaryStencilList().size(); ++i_symmetry) {
-            auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].second;
+            auto& ghost_stencil  = stencil.symmetryBoundaryStencilList()[i_symmetry].stencil();
             auto ghost_cell_list = ghost_stencil[cell_j_id];
 
             const Rd& origin = symmetry_origin_list[i_symmetry];
diff --git a/tests/test_StencilBuilder.cpp b/tests/test_StencilBuilder.cpp
index 0ef8d97ba9ef690ca4420a49905881e5ccbc49b3..754a443a7d63d391807d8133110e04ec8b2b224f 100644
--- a/tests/test_StencilBuilder.cpp
+++ b/tests/test_StencilBuilder.cpp
@@ -130,7 +130,7 @@ TEST_CASE("StencilBuilder", "[mesh]")
           is_empty &= (stencil[cell_id].size() == 0);
           for (size_t i_symmetry_stencil = 0; i_symmetry_stencil < stencil.symmetryBoundaryStencilList().size();
                ++i_symmetry_stencil) {
-            is_empty &= (stencil.symmetryBoundaryStencilList()[i_symmetry_stencil].second[cell_id].size() == 0);
+            is_empty &= (stencil.symmetryBoundaryStencilList()[i_symmetry_stencil].stencil()[cell_id].size() == 0);
           }
         }
       }
@@ -148,10 +148,10 @@ TEST_CASE("StencilBuilder", "[mesh]")
 
       for (size_t i_symmetry_stencil = 0; i_symmetry_stencil < stencil.symmetryBoundaryStencilList().size();
            ++i_symmetry_stencil) {
-        auto p_boundary_descriptor = stencil.symmetryBoundaryStencilList()[i_symmetry_stencil].first;
-        const IBoundaryDescriptor& boundary_descriptor = *p_boundary_descriptor;
+        const IBoundaryDescriptor& boundary_descriptor =
+          stencil.symmetryBoundaryStencilList()[i_symmetry_stencil].boundaryDescriptor();
 
-        auto boundary_stencil   = stencil.symmetryBoundaryStencilList()[i_symmetry_stencil].second;
+        auto boundary_stencil   = stencil.symmetryBoundaryStencilList()[i_symmetry_stencil].stencil();
         auto boundary_node_list = getMeshFlatNodeBoundary(mesh, boundary_descriptor);
 
         CellValue<bool> boundary_cell{mesh.connectivity()};