diff --git a/src/mesh/StencilBuilder.cpp b/src/mesh/StencilBuilder.cpp
index d20ebbb5a299aec8f930140fa86fc78052c087f3..8af6a76ae48878a23442e210a19238c48e4db5a1 100644
--- a/src/mesh/StencilBuilder.cpp
+++ b/src/mesh/StencilBuilder.cpp
@@ -119,7 +119,7 @@ StencilBuilder::_build(const ConnectivityType& connectivity,
     error_msg << "Stencil builder requires" << rang::fgB::yellow << number_of_layers << rang::fg::reset
               << " layers while parallel number of ghost layer is "
               << GlobalVariableManager::instance().getNumberOfGhostLayers() << ".\n";
-    error_msg << "Increase the number of ghost layers (using '--number-of-ghost-layers' option).";
+    error_msg << "Increase the number of ghost layers (using the '--number-of-ghost-layers' option).";
     throw NormalError(error_msg.str());
   }
   if (number_of_layers > 2) {
diff --git a/src/scheme/PolynomialReconstruction.cpp b/src/scheme/PolynomialReconstruction.cpp
index 76d27b5008d373a72df50a8e9d371a52cc750f37..2af32e157475b0fe99b9f2cc9cc6c445e05681b3 100644
--- a/src/scheme/PolynomialReconstruction.cpp
+++ b/src/scheme/PolynomialReconstruction.cpp
@@ -771,9 +771,7 @@ PolynomialReconstruction::_build(
     DiscreteFunctionDPk<MeshType::Dimension, double>::BasisViewType::dimensionFromDegree(m_descriptor.degree());
 
   const auto& stencil_array =
-    StencilManager::instance().getCellToCellStencilArray(mesh.connectivity(),
-                                                         StencilDescriptor{m_descriptor.degree(),
-                                                                           StencilDescriptor::Type::by_nodes},
+    StencilManager::instance().getCellToCellStencilArray(mesh.connectivity(), m_descriptor.stencilDescriptor(),
                                                          m_descriptor.symmetryBoundaryDescriptorList());
 
   auto xr = mesh.xr();
diff --git a/src/scheme/PolynomialReconstructionDescriptor.hpp b/src/scheme/PolynomialReconstructionDescriptor.hpp
index ef6c97653b8662ffd9a3f78d52a82a820d7cad80..87188f85f01c3c8f269f0482183bf680444abb27 100644
--- a/src/scheme/PolynomialReconstructionDescriptor.hpp
+++ b/src/scheme/PolynomialReconstructionDescriptor.hpp
@@ -39,6 +39,13 @@ class PolynomialReconstructionDescriptor
     return m_degree;
   }
 
+  PUGS_INLINE
+  const StencilDescriptor&
+  stencilDescriptor() const
+  {
+    return m_stencil_descriptor;
+  }
+
   PUGS_INLINE
   const BoundaryDescriptorList&
   symmetryBoundaryDescriptorList() const
@@ -60,13 +67,6 @@ class PolynomialReconstructionDescriptor
     return m_row_weighting;
   }
 
-  PUGS_INLINE
-  void
-  setDegree(const size_t degree)
-  {
-    m_degree = degree;
-  }
-
   PUGS_INLINE
   void
   setPreconditioning(const bool preconditioning)
diff --git a/tests/test_PolynomialReconstructionDescriptor.cpp b/tests/test_PolynomialReconstructionDescriptor.cpp
index cadc6aaf4904d502ba77396366282fbe89ba1e27..9fc51a5bf708f80f4ea1e03c89be901ef6a9d6be 100644
--- a/tests/test_PolynomialReconstructionDescriptor.cpp
+++ b/tests/test_PolynomialReconstructionDescriptor.cpp
@@ -2,18 +2,23 @@
 #include <catch2/catch_test_macros.hpp>
 #include <catch2/matchers/catch_matchers_all.hpp>
 
+#include <mesh/NamedBoundaryDescriptor.hpp>
+#include <mesh/NumberedBoundaryDescriptor.hpp>
 #include <scheme/PolynomialReconstructionDescriptor.hpp>
 
 // clazy:excludeall=non-pod-global-static
 
 TEST_CASE("PolynomialReconstructionDescriptor", "[scheme]")
 {
-#warning tests are not completed
   SECTION("degree 1")
   {
     PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 1};
 
     REQUIRE(descriptor.degree() == 1);
+    REQUIRE(descriptor.stencilDescriptor().numberOfLayers() == 1);
+    REQUIRE(descriptor.stencilDescriptor().type() == StencilDescriptor::Type::by_nodes);
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList().size() == 0);
+
     REQUIRE(descriptor.preconditioning() == true);
     REQUIRE(descriptor.rowWeighting() == true);
   }
@@ -23,32 +28,82 @@ TEST_CASE("PolynomialReconstructionDescriptor", "[scheme]")
     PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 4};
 
     REQUIRE(descriptor.degree() == 4);
+    REQUIRE(descriptor.stencilDescriptor().numberOfLayers() == 4);
+    REQUIRE(descriptor.stencilDescriptor().type() == StencilDescriptor::Type::by_nodes);
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList().size() == 0);
+
     REQUIRE(descriptor.preconditioning() == true);
     REQUIRE(descriptor.rowWeighting() == true);
   }
 
-  SECTION("utlities")
+  SECTION("degree and stencil")
   {
-    PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 3};
+    StencilDescriptor sd{2, StencilDescriptor::Type::by_faces};
+
+    PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 1, sd};
+
+    REQUIRE(descriptor.degree() == 1);
+    REQUIRE(descriptor.stencilDescriptor().numberOfLayers() == 2);
+    REQUIRE(descriptor.stencilDescriptor().type() == StencilDescriptor::Type::by_faces);
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList().size() == 0);
 
-    REQUIRE(descriptor.degree() == 3);
     REQUIRE(descriptor.preconditioning() == true);
     REQUIRE(descriptor.rowWeighting() == true);
+  }
 
-    SECTION("set degree")
-    {
-      descriptor.setDegree(2);
+  SECTION("degree and symmetries")
+  {
+    std::vector<std::shared_ptr<const IBoundaryDescriptor>> bc_list;
+    bc_list.push_back(std::make_shared<NamedBoundaryDescriptor>("XMIN"));
+    bc_list.push_back(std::make_shared<NamedBoundaryDescriptor>("YMIN"));
+    bc_list.push_back(std::make_shared<NumberedBoundaryDescriptor>(2));
 
-      REQUIRE(descriptor.degree() == 2);
-      REQUIRE(descriptor.preconditioning() == true);
-      REQUIRE(descriptor.rowWeighting() == true);
+    PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 2, bc_list};
 
-      descriptor.setDegree(4);
+    REQUIRE(descriptor.degree() == 2);
+    REQUIRE(descriptor.stencilDescriptor().numberOfLayers() == 2);
+    REQUIRE(descriptor.stencilDescriptor().type() == StencilDescriptor::Type::by_nodes);
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList().size() == 3);
 
-      REQUIRE(descriptor.degree() == 4);
-      REQUIRE(descriptor.preconditioning() == true);
-      REQUIRE(descriptor.rowWeighting() == true);
-    }
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList()[0]->type() == IBoundaryDescriptor::Type::named);
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList()[1]->type() == IBoundaryDescriptor::Type::named);
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList()[2]->type() == IBoundaryDescriptor::Type::numbered);
+
+    REQUIRE(descriptor.preconditioning() == true);
+    REQUIRE(descriptor.rowWeighting() == true);
+  }
+
+  SECTION("degree, stencil and symmetries")
+  {
+    StencilDescriptor sd{3, StencilDescriptor::Type::by_edges};
+
+    std::vector<std::shared_ptr<const IBoundaryDescriptor>> bc_list;
+    bc_list.push_back(std::make_shared<NamedBoundaryDescriptor>("XMIN"));
+    bc_list.push_back(std::make_shared<NumberedBoundaryDescriptor>(2));
+    bc_list.push_back(std::make_shared<NamedBoundaryDescriptor>("YMIN"));
+
+    PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 1, sd, bc_list};
+
+    REQUIRE(descriptor.degree() == 1);
+    REQUIRE(descriptor.stencilDescriptor().numberOfLayers() == 3);
+    REQUIRE(descriptor.stencilDescriptor().type() == StencilDescriptor::Type::by_edges);
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList().size() == 3);
+
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList()[0]->type() == IBoundaryDescriptor::Type::named);
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList()[1]->type() == IBoundaryDescriptor::Type::numbered);
+    REQUIRE(descriptor.symmetryBoundaryDescriptorList()[2]->type() == IBoundaryDescriptor::Type::named);
+
+    REQUIRE(descriptor.preconditioning() == true);
+    REQUIRE(descriptor.rowWeighting() == true);
+  }
+
+  SECTION("utlities")
+  {
+    PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 3};
+
+    REQUIRE(descriptor.degree() == 3);
+    REQUIRE(descriptor.preconditioning() == true);
+    REQUIRE(descriptor.rowWeighting() == true);
 
     SECTION("set preconditioning")
     {