diff --git a/src/mesh/DiamondDualMeshBuilder.cpp b/src/mesh/DiamondDualMeshBuilder.cpp
index 8bf89b0103e56f9474ad90fd25fea2e45feccddd..4c8c0658036bcd6f366897d641ba56bc784e046a 100644
--- a/src/mesh/DiamondDualMeshBuilder.cpp
+++ b/src/mesh/DiamondDualMeshBuilder.cpp
@@ -19,67 +19,33 @@ DiamondDualMeshBuilder::_buildDiamondConnectivityDescriptor(const Connectivity<D
   const size_t primal_number_of_faces = primal_connectivity.numberOfFaces();
   const size_t primal_number_of_cells = primal_connectivity.numberOfCells();
 
-  const size_t diamond_number_of_nodes = [&]() {
-    if constexpr (Dimension == 1) {
-      return 2 * primal_number_of_nodes - primal_number_of_cells;
-    } else {
-      return primal_number_of_cells + primal_number_of_nodes;
-    }
-  }();
+  const size_t diamond_number_of_nodes = primal_number_of_cells + primal_number_of_nodes;
 
   diamond_descriptor.node_number_vector.resize(diamond_number_of_nodes);
 
-  if constexpr (Dimension == 1) {
-    const auto& primal_node_number = primal_connectivity.nodeNumber();
-
-    const size_t diamond_number_of_cells = primal_number_of_faces;
-    const size_t number_of_kept_nodes    = 2 * (diamond_number_of_nodes - diamond_number_of_cells);
-
-    const auto& primal_node_to_cell_matrix = primal_connectivity.nodeToCellMatrix();
-    size_t next_kept_node_id               = 0;
-
-    for (NodeId node_id = 0; node_id < primal_connectivity.numberOfNodes(); ++node_id) {
-      const auto& primal_node_cell_list = primal_node_to_cell_matrix[node_id];
-      if (primal_node_cell_list.size() == 1) {
-        diamond_descriptor.node_number_vector[next_kept_node_id++] = primal_node_number[node_id];
-      }
-    }
-
-    if (number_of_kept_nodes != next_kept_node_id) {
-      throw UnexpectedError("unexpected number of kept node" + std::to_string(next_kept_node_id) +
-                            " != " + std::to_string(number_of_kept_nodes));
-    }
-
-  } else {
-    const auto& primal_node_number = primal_connectivity.nodeNumber();
+  const auto& primal_node_number = primal_connectivity.nodeNumber();
 
-    for (NodeId primal_node_id = 0; primal_node_id < primal_connectivity.numberOfNodes(); ++primal_node_id) {
-      diamond_descriptor.node_number_vector[primal_node_id] = primal_node_number[primal_node_id];
-    }
+  for (NodeId primal_node_id = 0; primal_node_id < primal_connectivity.numberOfNodes(); ++primal_node_id) {
+    diamond_descriptor.node_number_vector[primal_node_id] = primal_node_number[primal_node_id];
+  }
 
-    const auto& primal_cell_number = primal_connectivity.cellNumber();
+  const auto& primal_cell_number = primal_connectivity.cellNumber();
 
-    const size_t max_node_number = max(primal_node_number);
+  const size_t max_node_number = max(primal_node_number);
 
-    for (CellId primal_cell_id = 0; primal_cell_id < primal_number_of_cells; ++primal_cell_id) {
-      diamond_descriptor.node_number_vector[primal_number_of_nodes + primal_cell_id] =
-        primal_cell_number[primal_cell_id] + max_node_number;
-    }
+  for (CellId primal_cell_id = 0; primal_cell_id < primal_number_of_cells; ++primal_cell_id) {
+    diamond_descriptor.node_number_vector[primal_number_of_nodes + primal_cell_id] =
+      primal_cell_number[primal_cell_id] + max_node_number;
   }
+
   const size_t diamond_number_of_cells = primal_number_of_faces;
   diamond_descriptor.cell_number_vector.resize(diamond_number_of_cells);
 
-  if constexpr (Dimension == 1) {
-    const auto& primal_node_number = primal_connectivity.nodeNumber();
-    for (NodeId primal_node_id = 0; primal_node_id < primal_number_of_nodes; ++primal_node_id) {
-      diamond_descriptor.cell_number_vector[primal_node_id] = primal_node_number[primal_node_id];
-    }
-  } else {
-    const auto& primal_face_number = primal_connectivity.faceNumber();
-    for (FaceId i_primal_face = 0; i_primal_face < primal_number_of_faces; ++i_primal_face) {
-      diamond_descriptor.cell_number_vector[i_primal_face] = primal_face_number[i_primal_face];
-    }
+  const auto& primal_face_number = primal_connectivity.faceNumber();
+  for (FaceId i_primal_face = 0; i_primal_face < primal_number_of_faces; ++i_primal_face) {
+    diamond_descriptor.cell_number_vector[i_primal_face] = primal_face_number[i_primal_face];
   }
+
   if constexpr (Dimension == 3) {
     const size_t number_of_edges = diamond_descriptor.edge_to_node_vector.size();
     diamond_descriptor.edge_number_vector.resize(number_of_edges);
@@ -99,18 +65,14 @@ DiamondDualMeshBuilder::_buildDiamondConnectivityDescriptor(const Connectivity<D
     const size_t i_cell               = i_face;
     const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face];
 
-    if constexpr (Dimension == 1) {
-      diamond_descriptor.cell_type_vector[i_cell] = CellType::Line;
-    } else if constexpr (Dimension == 2) {
-      if (primal_face_cell_list.size() == 1) {
-        diamond_descriptor.cell_type_vector[i_cell] = CellType::Triangle;
-      } else {
-        Assert(primal_face_cell_list.size() == 2);
-        diamond_descriptor.cell_type_vector[i_cell] = CellType::Quadrangle;
-      }
+    if (primal_face_cell_list.size() == 1) {
+      diamond_descriptor.cell_type_vector[i_cell] = CellType::Triangle;
     } else {
-      static_assert(Dimension == 3, "unexpected dimension");
+      Assert(primal_face_cell_list.size() == 2);
+      diamond_descriptor.cell_type_vector[i_cell] = CellType::Quadrangle;
+    }
 
+    if constexpr (Dimension == 3) {
       if (primal_face_cell_list.size() == 1) {
         diamond_descriptor.cell_type_vector[i_cell] = CellType::Pyramid;
       } else {
@@ -122,19 +84,134 @@ DiamondDualMeshBuilder::_buildDiamondConnectivityDescriptor(const Connectivity<D
 
   diamond_descriptor.cell_to_node_vector.resize(diamond_number_of_cells);
 
-  if constexpr (Dimension == 1) {
-    const auto& primal_node_to_cell_matrix = primal_connectivity.nodeToCellMatrix();
-    const size_t number_of_kept_nodes      = 2 * (diamond_number_of_nodes - diamond_number_of_cells);
-    size_t next_kept_node_id               = 0;
+  const auto& primal_face_to_node_matrix              = primal_connectivity.faceToNodeMatrix();
+  const auto& primal_face_local_number_in_their_cells = primal_connectivity.faceLocalNumbersInTheirCells();
+  const auto& cell_face_is_reversed                   = primal_connectivity.cellFaceIsReversed();
+  for (FaceId i_face = 0; i_face < primal_connectivity.numberOfFaces(); ++i_face) {
+    const size_t& i_diamond_cell      = i_face;
+    const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face];
+    const auto& primal_face_node_list = primal_face_to_node_matrix[i_face];
+    if (primal_face_cell_list.size() == 1) {
+      diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(primal_face_node_list.size() + 1);
 
-    const auto& primal_node_local_number_in_their_cells = primal_connectivity.nodeLocalNumbersInTheirCells();
+      const CellId cell_id      = primal_face_cell_list[0];
+      const auto i_face_in_cell = primal_face_local_number_in_their_cells(i_face, 0);
+
+      for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) {
+        diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node] = primal_face_node_list[i_node];
+      }
+      diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size()] =
+        primal_number_of_nodes + cell_id;
+
+      if (cell_face_is_reversed(cell_id, i_face_in_cell)) {
+        if constexpr (Dimension == 2) {
+          std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][0],
+                    diamond_descriptor.cell_to_node_vector[i_diamond_cell][1]);
+
+        } else {
+          for (size_t i_node = 0; i_node < primal_face_node_list.size() / 2; ++i_node) {
+            std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node],
+                      diamond_descriptor
+                        .cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() - 1 - i_node]);
+          }
+        }
+      }
+    } else {
+      Assert(primal_face_cell_list.size() == 2);
+      diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(primal_face_node_list.size() + 2);
+
+      const CellId cell0_id      = primal_face_cell_list[0];
+      const CellId cell1_id      = primal_face_cell_list[1];
+      const auto i_face_in_cell0 = primal_face_local_number_in_their_cells(i_face, 0);
+
+      if constexpr (Dimension == 2) {
+        Assert(primal_face_node_list.size() == 2);
+        diamond_descriptor.cell_to_node_vector[i_diamond_cell][0] = primal_number_of_nodes + cell0_id;
+        diamond_descriptor.cell_to_node_vector[i_diamond_cell][1] = primal_face_node_list[0];
+        diamond_descriptor.cell_to_node_vector[i_diamond_cell][2] = primal_number_of_nodes + cell1_id;
+        diamond_descriptor.cell_to_node_vector[i_diamond_cell][3] = primal_face_node_list[1];
+
+        if (cell_face_is_reversed(cell0_id, i_face_in_cell0)) {
+          std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][1],
+                    diamond_descriptor.cell_to_node_vector[i_diamond_cell][3]);
+        }
+      } else {
+        diamond_descriptor.cell_to_node_vector[i_diamond_cell][0] = primal_number_of_nodes + cell0_id;
+        for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) {
+          diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node + 1] = primal_face_node_list[i_node];
+        }
+        diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() + 1] =
+          primal_number_of_nodes + cell1_id;
+
+        if (cell_face_is_reversed(cell0_id, i_face_in_cell0)) {
+          std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][0],
+                    diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() + 1]);
+        }
+      }
+    }
+  }
+}
 
+template <>
+void
+DiamondDualMeshBuilder::_buildDiamondConnectivityDescriptor<1>(const Connectivity<1>& primal_connectivity,
+                                                               ConnectivityDescriptor& diamond_descriptor)
+{
+  const size_t primal_number_of_nodes = primal_connectivity.numberOfNodes();
+  const size_t primal_number_of_faces = primal_connectivity.numberOfFaces();
+  const size_t primal_number_of_cells = primal_connectivity.numberOfCells();
+
+  const size_t diamond_number_of_nodes = 2 * primal_number_of_nodes - primal_number_of_cells;
+
+  diamond_descriptor.node_number_vector.resize(diamond_number_of_nodes);
+
+  const auto& primal_node_number = primal_connectivity.nodeNumber();
+
+  const size_t diamond_number_of_cells = primal_number_of_faces;
+  const size_t number_of_kept_nodes    = 2 * (diamond_number_of_nodes - diamond_number_of_cells);
+
+  const auto& primal_node_to_cell_matrix = primal_connectivity.nodeToCellMatrix();
+  size_t next_kept_node_id               = 0;
+
+  for (NodeId node_id = 0; node_id < primal_connectivity.numberOfNodes(); ++node_id) {
+    const auto& primal_node_cell_list = primal_node_to_cell_matrix[node_id];
+    if (primal_node_cell_list.size() == 1) {
+      diamond_descriptor.node_number_vector[next_kept_node_id++] = primal_node_number[node_id];
+    }
+  }
+
+  if (number_of_kept_nodes != next_kept_node_id) {
+    throw UnexpectedError("unexpected number of kept node" + std::to_string(next_kept_node_id) +
+                          " != " + std::to_string(number_of_kept_nodes));
+  }
+
+  diamond_descriptor.cell_number_vector.resize(diamond_number_of_cells);
+
+  for (NodeId primal_node_id = 0; primal_node_id < primal_number_of_nodes; ++primal_node_id) {
+    diamond_descriptor.cell_number_vector[primal_node_id] = primal_node_number[primal_node_id];
+  }
+
+  diamond_descriptor.cell_type_vector.resize(diamond_number_of_cells);
+
+  for (NodeId node_id = 0; node_id < primal_connectivity.numberOfNodes(); ++node_id) {
+    const size_t i_cell = node_id;
+
+    diamond_descriptor.cell_type_vector[i_cell] = CellType::Line;
+  }
+
+  diamond_descriptor.cell_to_node_vector.resize(diamond_number_of_cells);
+
+  ;
+
+  const auto& primal_node_local_number_in_their_cells = primal_connectivity.nodeLocalNumbersInTheirCells();
+
+  {
+    size_t next_kept_node_id = 0;
     for (NodeId i_node = 0; i_node < primal_connectivity.numberOfNodes(); ++i_node) {
       const size_t& i_diamond_cell      = i_node;
       const auto& primal_node_cell_list = primal_node_to_cell_matrix[i_node];
       diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(2);
       if (primal_node_cell_list.size() == 1) {
-        const CellId cell_id      = primal_node_cell_list[0];
         const auto i_node_in_cell = primal_node_local_number_in_their_cells(i_node, 0);
 
         diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node_in_cell] = next_kept_node_id++;
@@ -145,75 +222,6 @@ DiamondDualMeshBuilder::_buildDiamondConnectivityDescriptor(const Connectivity<D
         diamond_descriptor.cell_to_node_vector[i_diamond_cell][1] = number_of_kept_nodes + primal_node_cell_list[1];
       }
     }
-  } else {
-    static_assert(Dimension > 1, "invalid dimension");
-
-    const auto& primal_face_to_node_matrix              = primal_connectivity.faceToNodeMatrix();
-    const auto& primal_face_local_number_in_their_cells = primal_connectivity.faceLocalNumbersInTheirCells();
-    const auto& cell_face_is_reversed                   = primal_connectivity.cellFaceIsReversed();
-    for (FaceId i_face = 0; i_face < primal_connectivity.numberOfFaces(); ++i_face) {
-      const size_t& i_diamond_cell      = i_face;
-      const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face];
-      const auto& primal_face_node_list = primal_face_to_node_matrix[i_face];
-      if (primal_face_cell_list.size() == 1) {
-        diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(primal_face_node_list.size() + 1);
-
-        const CellId cell_id      = primal_face_cell_list[0];
-        const auto i_face_in_cell = primal_face_local_number_in_their_cells(i_face, 0);
-
-        for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) {
-          diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node] = primal_face_node_list[i_node];
-        }
-        diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size()] =
-          primal_number_of_nodes + cell_id;
-
-        if (cell_face_is_reversed(cell_id, i_face_in_cell)) {
-          if constexpr (Dimension == 2) {
-            std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][0],
-                      diamond_descriptor.cell_to_node_vector[i_diamond_cell][1]);
-
-          } else {
-            for (size_t i_node = 0; i_node < primal_face_node_list.size() / 2; ++i_node) {
-              std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node],
-                        diamond_descriptor
-                          .cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() - 1 - i_node]);
-            }
-          }
-        }
-      } else {
-        Assert(primal_face_cell_list.size() == 2);
-        diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(primal_face_node_list.size() + 2);
-
-        const CellId cell0_id      = primal_face_cell_list[0];
-        const CellId cell1_id      = primal_face_cell_list[1];
-        const auto i_face_in_cell0 = primal_face_local_number_in_their_cells(i_face, 0);
-
-        if constexpr (Dimension == 2) {
-          Assert(primal_face_node_list.size() == 2);
-          diamond_descriptor.cell_to_node_vector[i_diamond_cell][0] = primal_number_of_nodes + cell0_id;
-          diamond_descriptor.cell_to_node_vector[i_diamond_cell][1] = primal_face_node_list[0];
-          diamond_descriptor.cell_to_node_vector[i_diamond_cell][2] = primal_number_of_nodes + cell1_id;
-          diamond_descriptor.cell_to_node_vector[i_diamond_cell][3] = primal_face_node_list[1];
-
-          if (cell_face_is_reversed(cell0_id, i_face_in_cell0)) {
-            std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][1],
-                      diamond_descriptor.cell_to_node_vector[i_diamond_cell][3]);
-          }
-        } else {
-          diamond_descriptor.cell_to_node_vector[i_diamond_cell][0] = primal_number_of_nodes + cell0_id;
-          for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) {
-            diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node + 1] = primal_face_node_list[i_node];
-          }
-          diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() + 1] =
-            primal_number_of_nodes + cell1_id;
-
-          if (cell_face_is_reversed(cell0_id, i_face_in_cell0)) {
-            std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][0],
-                      diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() + 1]);
-          }
-        }
-      }
-    }
   }
 }
 
@@ -252,8 +260,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh>
     for (size_t i_node_list = 0; i_node_list < primal_connectivity.template numberOfRefItemList<ItemType::node>();
          ++i_node_list) {
       const auto& primal_ref_node_list = primal_connectivity.template refItemList<ItemType::node>(i_node_list);
-      std::cout << "treating " << primal_ref_node_list.refId() << '\n';
-      const auto& primal_node_list = primal_ref_node_list.list();
+      const auto& primal_node_list     = primal_ref_node_list.list();
 
       const std::vector<NodeId> diamond_node_list = [&]() {
         std::vector<NodeId> diamond_node_list;
@@ -275,6 +282,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh>
           node_array[i] = diamond_node_list[i];
         }
         diamond_descriptor.addRefItemList(RefNodeList{primal_ref_node_list.refId(), node_array});
+        std::cout << "stored " << primal_ref_node_list.refId() << '\n';
       }
     }
   }
@@ -297,8 +305,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh>
     for (size_t i_face_list = 0; i_face_list < primal_connectivity.template numberOfRefItemList<ItemType::face>();
          ++i_face_list) {
       const auto& primal_ref_face_list = primal_connectivity.template refItemList<ItemType::face>(i_face_list);
-      std::cout << "treating " << primal_ref_face_list.refId() << '\n';
-      const auto& primal_face_list = primal_ref_face_list.list();
+      const auto& primal_face_list     = primal_ref_face_list.list();
 
       const std::vector<FaceId> diamond_face_list = [&]() {
         std::vector<FaceId> diamond_face_list;
@@ -329,6 +336,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh>
           face_array[i] = diamond_face_list[i];
         }
         diamond_descriptor.addRefItemList(RefFaceList{primal_ref_face_list.refId(), face_array});
+        std::cout << "stored " << primal_ref_face_list.refId() << '\n';
       }
     }
   }
@@ -349,8 +357,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh>
     for (size_t i_edge_list = 0; i_edge_list < primal_connectivity.template numberOfRefItemList<ItemType::edge>();
          ++i_edge_list) {
       const auto& primal_ref_edge_list = primal_connectivity.template refItemList<ItemType::edge>(i_edge_list);
-      std::cout << "treating " << primal_ref_edge_list.refId() << '\n';
-      const auto& primal_edge_list = primal_ref_edge_list.list();
+      const auto& primal_edge_list     = primal_ref_edge_list.list();
 
       const std::vector<EdgeId> diamond_edge_list = [&]() {
         std::vector<EdgeId> diamond_edge_list;
@@ -381,6 +388,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh>
           edge_array[i] = diamond_edge_list[i];
         }
         diamond_descriptor.addRefItemList(RefEdgeList{primal_ref_edge_list.refId(), edge_array});
+        std::cout << "stored " << primal_ref_edge_list.refId() << '\n';
       }
     }
   }
@@ -476,7 +484,6 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh>
   const auto primal_xj = primal_mesh_data.xj();
 
   {
-#warning define transfer functions
     if constexpr (Dimension == 1) {
       const auto& node_to_cell_matrix = primal_connectivity.nodeToCellMatrix();
       NodeId next_node_id             = 0;