diff --git a/src/language/algorithms/HeatDiamondAlgorithm.cpp b/src/language/algorithms/HeatDiamondAlgorithm.cpp
index 68994e2525c9069ba08d178b7b57a7fb8208319e..06db3fc99abf7154d2285c0e78171f2bd9fdef14 100644
--- a/src/language/algorithms/HeatDiamondAlgorithm.cpp
+++ b/src/language/algorithms/HeatDiamondAlgorithm.cpp
@@ -16,11 +16,13 @@
 #include <mesh/MeshData.hpp>
 #include <mesh/MeshDataManager.hpp>
 #include <mesh/MeshNodeBoundary.hpp>
+#include <mesh/SubItemValuePerItem.hpp>
 #include <output/VTKWriter.hpp>
 #include <scheme/DirichletBoundaryConditionDescriptor.hpp>
 #include <scheme/FourierBoundaryConditionDescriptor.hpp>
 #include <scheme/NeumannBoundaryConditionDescriptor.hpp>
 #include <scheme/SymmetryBoundaryConditionDescriptor.hpp>
+#include <utils/Timer.hpp>
 
 template <size_t Dimension>
 HeatDiamondScheme<Dimension>::HeatDiamondScheme(
@@ -390,18 +392,97 @@ HeatDiamondScheme<Dimension>::HeatDiamondScheme(
         return compute_mes_j;
       }();
 
+      FaceValue<const CellId> face_dual_cell_id = [=]() {
+        FaceValue<CellId> computed_face_dual_cell_id{mesh->connectivity()};
+        CellValue<CellId> dual_cell_id{diamond_mesh->connectivity()};
+        parallel_for(
+          diamond_mesh->numberOfCells(), PUGS_LAMBDA(CellId cell_id) { dual_cell_id[cell_id] = cell_id; });
+
+        mapper->fromDualCell(dual_cell_id, computed_face_dual_cell_id);
+
+        return computed_face_dual_cell_id;
+      }();
+
+      NodeValue<const NodeId> dual_node_primal_node_id = [=]() {
+        CellValue<NodeId> cell_ignored_id{mesh->connectivity()};
+        cell_ignored_id.fill(NodeId{std::numeric_limits<unsigned int>::max()});
+
+        NodeValue<NodeId> node_primal_id{mesh->connectivity()};
+
+        parallel_for(
+          mesh->numberOfNodes(), PUGS_LAMBDA(NodeId node_id) { node_primal_id[node_id] = node_id; });
+
+        NodeValue<NodeId> computed_dual_node_primal_node_id{diamond_mesh->connectivity()};
+
+        mapper->toDualNode(node_primal_id, cell_ignored_id, computed_dual_node_primal_node_id);
+
+        return computed_dual_node_primal_node_id;
+      }();
+
+      CellValue<NodeId> primal_cell_dual_node_id = [=]() {
+        CellValue<NodeId> cell_id{mesh->connectivity()};
+        NodeValue<NodeId> node_ignored_id{mesh->connectivity()};
+        node_ignored_id.fill(NodeId{std::numeric_limits<unsigned int>::max()});
+
+        NodeValue<NodeId> dual_node_id{diamond_mesh->connectivity()};
+
+        parallel_for(
+          diamond_mesh->numberOfNodes(), PUGS_LAMBDA(NodeId node_id) { dual_node_id[node_id] = node_id; });
+
+        CellValue<NodeId> computed_primal_cell_dual_node_id{mesh->connectivity()};
+
+        mapper->fromDualNode(dual_node_id, node_ignored_id, cell_id);
+
+        return cell_id;
+      }();
+      Timer my_timer;
+      const auto& dual_Cjr                     = diamond_mesh_data.Cjr();
+      FaceValue<TinyVector<Dimension>> dualClj = [&] {
+        FaceValue<TinyVector<Dimension>> computedClj{mesh->connectivity()};
+        const auto& dual_node_to_cell_matrix = diamond_mesh->connectivity().nodeToCellMatrix();
+        const auto& dual_cell_to_node_matrix = diamond_mesh->connectivity().cellToNodeMatrix();
+        parallel_for(
+          mesh->numberOfFaces(), PUGS_LAMBDA(FaceId face_id) {
+            const auto& primal_face_to_cell = face_to_cell_matrix[face_id];
+            for (size_t i = 0; i < primal_face_to_cell.size(); i++) {
+              CellId cell_id            = primal_face_to_cell[i];
+              const NodeId dual_node_id = primal_cell_dual_node_id[cell_id];
+              for (size_t i_dual_cell = 0; i_dual_cell < dual_node_to_cell_matrix[dual_node_id].size(); i_dual_cell++) {
+                const CellId dual_cell_id = dual_node_to_cell_matrix[dual_node_id][i_dual_cell];
+                if (face_dual_cell_id[face_id] == dual_cell_id) {
+                  for (size_t i_dual_node = 0; i_dual_node < dual_cell_to_node_matrix[dual_cell_id].size();
+                       i_dual_node++) {
+                    const NodeId final_dual_node_id = dual_cell_to_node_matrix[dual_cell_id][i_dual_node];
+                    if (final_dual_node_id == dual_node_id) {
+                      computedClj[face_id] = dual_Cjr(dual_cell_id, i_dual_node);
+                    }
+                  }
+                }
+              }
+            }
+          });
+        return computedClj;
+      }();
+      std::cout << my_timer.seconds() << "\n";
+
+      FaceValue<TinyVector<Dimension>> nlj = [&] {
+        FaceValue<TinyVector<Dimension>> computedNlj{mesh->connectivity()};
+        parallel_for(
+          mesh->numberOfFaces(),
+          PUGS_LAMBDA(FaceId face_id) { computedNlj[face_id] = 1. / l2Norm(dualClj[face_id]) * dualClj[face_id]; });
+        return computedNlj;
+      }();
+
       FaceValue<const double> alpha_l = [&] {
         CellValue<double> alpha_j{diamond_mesh->connectivity()};
 
         parallel_for(
           diamond_mesh->numberOfCells(), PUGS_LAMBDA(CellId diamond_cell_id) {
-            alpha_j[diamond_cell_id] =
-              dual_mes_l_j[diamond_cell_id] * dual_kappaj[diamond_cell_id] / dual_Vj[diamond_cell_id];
+            alpha_j[diamond_cell_id] = dual_kappaj[diamond_cell_id] / dual_Vj[diamond_cell_id];
           });
 
         FaceValue<double> computed_alpha_l{mesh->connectivity()};
         mapper->fromDualCell(alpha_j, computed_alpha_l);
-
         VTKWriter vtk_writer("DD_" + std::to_string(Dimension), 0.01);
 
         vtk_writer.write(diamond_mesh,
@@ -416,7 +497,8 @@ HeatDiamondScheme<Dimension>::HeatDiamondScheme(
       SparseMatrixDescriptor S{number_of_dof};
       for (FaceId face_id = 0; face_id < mesh->numberOfFaces(); ++face_id) {
         const auto& primal_face_to_cell = face_to_cell_matrix[face_id];
-        const double beta_l             = 1. / Dimension * alpha_l[face_id] * mes_l[face_id];
+        // const double beta_l             = 1. / Dimension * alpha_l[face_id] * mes_l[face_id];
+        const double beta_l = l2Norm(dualClj[face_id]) * alpha_l[face_id] * mes_l[face_id];
         for (size_t i_cell = 0; i_cell < primal_face_to_cell.size(); ++i_cell) {
           const CellId cell_id1 = primal_face_to_cell[i_cell];
           for (size_t j_cell = 0; j_cell < primal_face_to_cell.size(); ++j_cell) {
@@ -433,57 +515,32 @@ HeatDiamondScheme<Dimension>::HeatDiamondScheme(
         }
       }
 
-      FaceValue<const CellId> face_dual_cell_id = [=]() {
-        FaceValue<CellId> computed_face_dual_cell_id{mesh->connectivity()};
-        CellValue<CellId> dual_cell_id{diamond_mesh->connectivity()};
-        parallel_for(
-          diamond_mesh->numberOfCells(), PUGS_LAMBDA(CellId cell_id) { dual_cell_id[cell_id] = cell_id; });
-
-        mapper->fromDualCell(dual_cell_id, computed_face_dual_cell_id);
-
-        return computed_face_dual_cell_id;
-      }();
-
-      NodeValue<const NodeId> dual_node_primal_node_id = [=]() {
-        CellValue<NodeId> cell_ignored_id{mesh->connectivity()};
-        cell_ignored_id.fill(NodeId{std::numeric_limits<unsigned int>::max()});
-
-        NodeValue<NodeId> node_primal_id{mesh->connectivity()};
-
-        parallel_for(
-          mesh->numberOfNodes(), PUGS_LAMBDA(NodeId node_id) { node_primal_id[node_id] = node_id; });
-
-        NodeValue<NodeId> computed_dual_node_primal_node_id{diamond_mesh->connectivity()};
-
-        mapper->toDualNode(node_primal_id, cell_ignored_id, computed_dual_node_primal_node_id);
-
-        return computed_dual_node_primal_node_id;
-      }();
-
-      const auto& dual_Cjr = diamond_mesh_data.Cjr();
-
       const auto& dual_cell_to_node_matrix = diamond_mesh->connectivity().cellToNodeMatrix();
 
       const NodeValuePerFace<const TinyVector<Dimension>> primal_nlr = mesh_data.nlr();
-      const auto& primal_face_cell_is_reversed                       = mesh->connectivity().cellFaceIsReversed();
-      const auto& face_local_numbers_in_their_cells = mesh->connectivity().faceLocalNumbersInTheirCells();
-      const auto& primal_node_to_cell_matrix        = mesh->connectivity().nodeToCellMatrix();
+      // const auto& primal_face_cell_is_reversed                       = mesh->connectivity().cellFaceIsReversed();
+      // const auto& face_local_numbers_in_their_cells = mesh->connectivity().faceLocalNumbersInTheirCells();
+      const auto& primal_node_to_cell_matrix = mesh->connectivity().nodeToCellMatrix();
       for (FaceId face_id = 0; face_id < mesh->numberOfFaces(); ++face_id) {
-        const double alpha_face_id = alpha_l[face_id];
+        const double alpha_face_id = mes_l[face_id] * alpha_l[face_id];
 
         for (size_t i_face_cell = 0; i_face_cell < face_to_cell_matrix[face_id].size(); ++i_face_cell) {
-          CellId i_id = face_to_cell_matrix[face_id][i_face_cell];
-          const bool is_face_reversed_for_cell_i =
-            primal_face_cell_is_reversed(i_id, face_local_numbers_in_their_cells(face_id, i_face_cell));
+          CellId i_id                            = face_to_cell_matrix[face_id][i_face_cell];
+          const bool is_face_reversed_for_cell_i = ((dualClj[face_id], xl[face_id] - xj[i_id]) < 0);
+          //            primal_face_cell_is_reversed(i_id, face_local_numbers_in_their_cells(face_id, i_face_cell));
 
           for (size_t i_node = 0; i_node < primal_face_to_node_matrix[face_id].size(); ++i_node) {
             NodeId node_id = primal_face_to_node_matrix[face_id][i_node];
 
             const TinyVector<Dimension> nil = [&] {
               if (is_face_reversed_for_cell_i) {
-                return -primal_nlr(face_id, i_node);
+                //   return -primal_nlr(face_id, i_node);
+                // } else {
+                //   return primal_nlr(face_id, i_node);
+                // }
+                return -nlj[face_id];
               } else {
-                return primal_nlr(face_id, i_node);
+                return nlj[face_id];
               }
             }();
 
diff --git a/src/mesh/MeshData.hpp b/src/mesh/MeshData.hpp
index c82e9ce06ec8b7d43ce1c6cc2fec282f89dc1fee..6d767e6bee0a96dba8b2e383fc182e7c47d9ba49 100644
--- a/src/mesh/MeshData.hpp
+++ b/src/mesh/MeshData.hpp
@@ -59,13 +59,25 @@ class MeshData : public IMeshData
         m_mesh.numberOfFaces(), PUGS_LAMBDA(FaceId face_id) {
           const auto& face_nodes = face_to_node_matrix[face_id];
 
-          double lenght = 0;
+          double lenght                        = 0;
+          TinyVector<Dimension, double> normal = zero;
           for (size_t i_node = 0; i_node < face_nodes.size(); ++i_node) {
-            lenght += l2Norm(Nlr(face_id, i_node));
+            normal += Nlr(face_id, i_node);
           }
-
+          lenght      = l2Norm(normal);
           ll[face_id] = lenght;
         });
+      // parallel_for(
+      //   m_mesh.numberOfFaces(), PUGS_LAMBDA(FaceId face_id) {
+      //     const auto& face_nodes = face_to_node_matrix[face_id];
+
+      //     double lenght = 0;
+      //     for (size_t i_node = 0; i_node < face_nodes.size(); ++i_node) {
+      //       lenght += l2Norm(Nlr(face_id, i_node));
+      //     }
+
+      //     ll[face_id] = lenght;
+      //   });
 
       m_ll = ll;
     }