diff --git a/src/scheme/CellbyCellLimitation.hpp b/src/scheme/CellbyCellLimitation.hpp
index f9b8fc6028db2775fdaf09b74d1de9f5f04d5406..97d11a07e035595735861a173df6210179b4f2d8 100644
--- a/src/scheme/CellbyCellLimitation.hpp
+++ b/src/scheme/CellbyCellLimitation.hpp
@@ -17,12 +17,15 @@
 #include <mesh/MeshNodeBoundary.hpp>
 #include <mesh/MeshTraits.hpp>
 #include <mesh/MeshVariant.hpp>
+#include <mesh/StencilManager.hpp>
 #include <scheme/DiscreteFunctionDPk.hpp>
 #include <scheme/DiscreteFunctionDPkVariant.hpp>
 #include <scheme/DiscreteFunctionDPkVector.hpp>
+#include <scheme/DiscreteFunctionP0.hpp>
 #include <scheme/DiscreteFunctionUtils.hpp>
 #include <scheme/InflowListBoundaryConditionDescriptor.hpp>
 #include <scheme/PolynomialReconstruction.hpp>
+#include <scheme/PolynomialReconstructionDescriptor.hpp>
 #include <utils/PugsTraits.hpp>
 #include <variant>
 
@@ -39,6 +42,7 @@ class CellByCellLimitation
  public:
   void
   density_limiter(const MeshType& mesh,
+                  const std::vector<std::shared_ptr<const IBoundaryDescriptor>>& symmetry_boundary_descriptor_list,
                   const DiscreteFunctionP0<const double>& rho,
                   DiscreteFunctionDPk<Dimension, double>& rho_L) const
   {
@@ -46,16 +50,20 @@ class CellByCellLimitation
     const auto& face_to_node_matrix = mesh.connectivity().faceToNodeMatrix();
 
     const auto& xr = mesh.xr();
-    const auto& xl = mesh.xl();
+    // const auto& xl = mesh.xl();
 
     MeshData<MeshType>& mesh_data = MeshDataManager::instance().getMeshData(mesh);
 
-    auto stencil = StencilManager::instance().getStencil(mesh.connectivity(), 1);
-
-    auto xj = mesh_data.xj();
+    //    auto stencil = StencilManager::instance()._getStencilArray(mesh.connectivity(), 1);
+    auto stencil = StencilManager::instance()
+                     .getCellToCellStencilArray(mesh.connectivity(),
+                                                StencilDescriptor{1, StencilDescriptor::ConnectionType::by_nodes},
+                                                symmetry_boundary_descriptor_list);
+    auto xj        = mesh_data.xj();
+    const auto& xl = mesh_data.xl();
 
-    const QuadratureFormula<1> qf =
-      QuadratureManager::instance().getLineFormula(GaussLegendreQuadratureDescriptor(m_quadrature_degree));
+    // const QuadratureFormula<1> qf =
+    //   QuadratureManager::instance().getLineFormula(GaussLegendreQuadratureDescriptor(m_quadrature_degree));
 
     parallel_for(
       mesh.numberOfCells(), PUGS_LAMBDA(const CellId cell_id) {
@@ -81,21 +89,31 @@ class CellByCellLimitation
           rho_bar_max = std::max(rho_bar_max, rho_xk);
         }
 
-        auto face_list = cell_to_face_matrix[cell_id];
-        for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
-          const FaceId face_id = face_list[i_face];
+        if constexpr (Dimension == 2) {
+          auto face_list = cell_to_face_matrix[cell_id];
+
+          for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
+            const FaceId face_id = face_list[i_face];
 
-          const Rd& x0 = xr[face_to_node_matrix[face_id][0]];
-          const Rd& x1 = xl[face_id][0];
-          const Rd& x2 = xr[face_to_node_matrix[face_id][1]];
+            const Rd& x0 = xr[face_to_node_matrix[face_id][0]];
+            const Rd& x2 = xr[face_to_node_matrix[face_id][1]];
+            const Rd& x1 = .5 * (x0 + x2);
 
-          const LineParabolicTransformation<Dimension> t(x0, x1, x2);
-          for (size_t iq = 0; iq < qf.numberOfPoints(); ++iq) {
-            const double rho_xk = rho_L[cell_id](t(qf.point(iq)));
+            const double rho_x0 = rho_L[cell_id](x0);
+            const double rho_x1 = rho_L[cell_id](x1);
+            const double rho_x2 = rho_L[cell_id](x2);
 
-            rho_bar_min = std::min(rho_bar_min, rho_xk);
-            rho_bar_max = std::max(rho_bar_max, rho_xk);
+            rho_bar_min = std::min(rho_bar_min, std::min(rho_x0, std::min(rho_x1, rho_x2)));
+            rho_bar_max = std::max(rho_bar_max, std::max(rho_x0, std::max(rho_x1, rho_x2)));
           }
+          // const LineParabolicTransformation<Dimension> t(x0, x1, x2);
+          // for (size_t iq = 0; iq < qf.numberOfPoints(); ++iq) {
+          // const double rho_xk = rho_L[cell_id](t(qf.point(iq)));
+
+          // rho_bar_min = std::min(rho_bar_min, rho_xk);
+          // rho_bar_max = std::max(rho_bar_max, rho_xk);
+          //}
+        } else {
         }
 
         const double eps = 1E-14;
@@ -122,11 +140,17 @@ class CellByCellLimitation
   }
 
   void
-  specific_internal_nrj_limiter(const MeshType& mesh,
-                                const DiscreteFunctionP0<const double>& rho,
-                                const DiscreteFunctionDPk<Dimension, double>& rho_L
-                                  DiscreteFunctionP0<const double>& epsilon,
-                                DiscreteFunctionDPk<Dimension, double>& epsilon_R) const
+  specific_internal_nrj_limiter(
+    const MeshType& mesh,
+    const std::vector<std::shared_ptr<const IBoundaryDescriptor>>& symmetry_boundary_descriptor_list,
+
+    // const DiscreteFunctionP0<const double>& rho,
+    // const DiscreteFunctionDPk<Dimension, double>& rho_L,
+    const DiscreteFunctionP0<const double>& epsilon,
+    // const DiscreteFunctionDPk<Dimension, double>&
+    auto epsilon_R(const CellId cell_id, const Rd& x),
+    CellValue<const double>& lambda_epsilon)   // const
+  //                                DiscreteFunctionDPk<Dimension, double>& epsilon_R) const
   {
     const auto& cell_to_face_matrix = mesh.connectivity().cellToFaceMatrix();
     const auto& face_to_node_matrix = mesh.connectivity().faceToNodeMatrix();
@@ -136,12 +160,15 @@ class CellByCellLimitation
 
     MeshData<MeshType>& mesh_data = MeshDataManager::instance().getMeshData(mesh);
 
-    auto stencil = StencilManager::instance().getStencil(mesh.connectivity(), 1);
-
+    //    auto stencil = StencilManager::instance()._getStencilArray(mesh.connectivity(), 1);
+    auto stencil = StencilManager::instance()
+                     .getCellToCellStencilArray(mesh.connectivity(),
+                                                StencilDescriptor{1, StencilDescriptor::ConnectionType::by_nodes},
+                                                symmetry_boundary_descriptor_list);
     auto xj = mesh_data.xj();
 
-    const QuadratureFormula<1> qf =
-      QuadratureManager::instance().getLineFormula(GaussLegendreQuadratureDescriptor(m_quadrature_degree));
+    //    const QuadratureFormula<1> qf =
+    // QuadratureManager::instance().getLineFormula(GaussLegendreQuadratureDescriptor(m_quadrature_degree));
 
     parallel_for(
       mesh.numberOfCells(), PUGS_LAMBDA(const CellId cell_id) {
@@ -171,17 +198,23 @@ class CellByCellLimitation
         for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
           const FaceId face_id = face_list[i_face];
 
-          const Rd& x0 = xr[face_to_node_matrix[face_id][0]];
-          const Rd& x1 = xl[face_id][0];
-          const Rd& x2 = xr[face_to_node_matrix[face_id][1]];
+          const Rd& x0            = xr[face_to_node_matrix[face_id][0]];
+          const Rd& x1            = xl[face_id][0];
+          const Rd& x2            = xr[face_to_node_matrix[face_id][1]];
+          const double epsilon_x0 = epsilon_R(cell_id, x0);
+          const double epsilon_x1 = epsilon_R(cell_id, x1);
+          const double epsilon_x2 = epsilon_R(cell_id, x2);
 
-          const LineParabolicTransformation<Dimension> t(x0, x1, x2);
-          for (size_t iq = 0; iq < qf.numberOfPoints(); ++iq) {
-            const double epsilon_xk = epsilon_R(cell_id, t(qf.point(iq)));
+          epsilon_R_min = std::min(epsilon_R_min, std::min(epsilon_x0, std::min(epsilon_x1, epsilon_x2)));
+          epsilon_R_max = std::max(epsilon_R_max, std::max(epsilon_x0, std::max(epsilon_x1, epsilon_x2)));
 
-            epsilon_R_min = std::min(epsilon_R_min, epsilon_xk);
-            epsilon_R_max = std::max(epsilon_R_max, epsilon_xk);
-          }
+          // const LineParabolicTransformation<Dimension> t(x0, x1, x2);
+          // for (size_t iq = 0; iq < qf.numberOfPoints(); ++iq) {
+          // const double epsilon_xk = epsilon_R(cell_id, t(qf.point(iq)));
+
+          // epsilon_R_min = std::min(epsilon_R_min, epsilon_xk);
+          // epsilon_R_max = std::max(epsilon_R_max, epsilon_xk);
+          //}
         }
 
         const double eps = 1E-14;