diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index 6647cecb9f0b6348a942bd8ddf649f02425097d8..96433d7d796f1ff66827435dade86b202be724a7 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -236,16 +236,20 @@ class Connectivity final
   FaceValuePerCell<const bool> m_cell_face_is_reversed;
 
   NodeValuePerCell<const unsigned short> m_cell_local_numbers_in_their_nodes;
+  EdgeValuePerCell<const unsigned short> m_cell_local_numbers_in_their_edges;
+  FaceValuePerCell<const unsigned short> m_cell_local_numbers_in_their_faces;
 
   CellValuePerFace<const unsigned short> m_face_local_numbers_in_their_cells;
+  EdgeValuePerFace<const unsigned short> m_face_local_numbers_in_their_edges;
+  NodeValuePerFace<const unsigned short> m_face_local_numbers_in_their_nodes;
 
-  CellValuePerNode<const unsigned short> m_node_local_numbers_in_their_cells;
+  CellValuePerEdge<const unsigned short> m_edge_local_numbers_in_their_cells;
+  FaceValuePerEdge<const unsigned short> m_edge_local_numbers_in_their_faces;
+  NodeValuePerEdge<const unsigned short> m_edge_local_numbers_in_their_nodes;
 
-  // not plugged ...
-#warning remaining def
-  NodeValuePerFace<unsigned short> m_node_local_numbers_in_their_faces;
-  FaceValuePerNode<unsigned short> m_face_local_numbers_in_their_nodes;
-  // ... not plugged
+  CellValuePerNode<const unsigned short> m_node_local_numbers_in_their_cells;
+  EdgeValuePerNode<const unsigned short> m_node_local_numbers_in_their_edges;
+  FaceValuePerNode<const unsigned short> m_node_local_numbers_in_their_faces;
 
   ConnectivityComputer m_connectivity_computer;
 
@@ -300,34 +304,104 @@ class Connectivity final
     return connectivity_matrix;
   }
 
+  KOKKOS_INLINE_FUNCTION
   const auto& cellFaceIsReversed() const
   {
     static_assert(dimension>1, "reversed faces makes no sense in dimension 1");
     return m_cell_face_is_reversed;
   }
 
+  KOKKOS_INLINE_FUNCTION
   const auto& cellLocalNumbersInTheirNodes() const
   {
     return _lazzyBuildItemNumberInTheirChild(m_cell_local_numbers_in_their_nodes);
   }
 
-  const auto& nodeLocalNumbersInTheirCells() const
+  KOKKOS_INLINE_FUNCTION
+  const auto& cellLocalNumbersInTheirEdges() const
   {
-    return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_cells);
+    if constexpr (dimension>2) {
+      return _lazzyBuildItemNumberInTheirChild(m_cell_local_numbers_in_their_edges);
+    } else {
+      return cellLocalNumbersInTheirFaces();
+    }
   }
 
+  KOKKOS_INLINE_FUNCTION
+  const auto& cellLocalNumbersInTheirFaces() const
+  {
+    if constexpr (dimension>1) {
+      return _lazzyBuildItemNumberInTheirChild(m_cell_local_numbers_in_their_faces);
+    } else {
+      return cellLocalNumbersInTheirNodes();
+    }
+  }
+
+  KOKKOS_INLINE_FUNCTION
   const auto& faceLocalNumbersInTheirCells() const
   {
     if constexpr(dimension>1) {
       return _lazzyBuildItemNumberInTheirChild(m_face_local_numbers_in_their_cells);
     } else {
-      return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_cells);
+      return nodeLocalNumbersInTheirCells();
     }
   }
 
+  KOKKOS_INLINE_FUNCTION
+  const auto& faceLocalNumbersInTheirEdges() const
+  {
+    static_assert(dimension>2,"this function has no meaning in 1d or 2d");
+    return _lazzyBuildItemNumberInTheirChild(m_face_local_numbers_in_their_edges);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& faceLocalNumbersInTheirNodes() const
+  {
+    static_assert(dimension>1,"this function has no meaning in 1d");
+    return _lazzyBuildItemNumberInTheirChild(m_face_local_numbers_in_their_nodes);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& edgeLocalNumbersInTheirCells() const
+  {
+    if constexpr (dimension>2) {
+      return _lazzyBuildItemNumberInTheirChild(m_edge_local_numbers_in_their_cells);
+    } else {
+      return faceLocalNumbersInTheirCells();
+    }
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& edgeLocalNumbersInTheirFaces() const
+  {
+    static_assert(dimension>2, "this function has no meaning in 1d or 2d");
+    return _lazzyBuildItemNumberInTheirChild(m_edge_local_numbers_in_their_faces);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& edgeLocalNumbersInTheirNodes() const
+  {
+    static_assert(dimension>2, "this function has no meaning in 1d or 2d");
+    return _lazzyBuildItemNumberInTheirChild(m_edge_local_numbers_in_their_nodes);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& nodeLocalNumbersInTheirCells() const
+  {
+    return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_cells);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& nodeLocalNumbersInTheirEdges() const
+  {
+    static_assert(dimension>2, "this function has no meaning in 1d or 2d");
+    return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_edges);
+  }
+
+  KOKKOS_INLINE_FUNCTION
   const auto& nodeLocalNumbersInTheirFaces() const
   {
-    static_assert(Dimension==1,"this function has no meaning in 1d");
+    static_assert(dimension>1,"this function has no meaning in 1d");
     return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_faces);
   }
 
diff --git a/src/mesh/SubItemValuePerItem.hpp b/src/mesh/SubItemValuePerItem.hpp
index 3ab0ac48718747a01c68dbf12d330cde6593e052..5778fc73989ca547130288d1737bf9b1d767c2ef 100644
--- a/src/mesh/SubItemValuePerItem.hpp
+++ b/src/mesh/SubItemValuePerItem.hpp
@@ -202,21 +202,47 @@ class SubItemValuePerItem<DataType,
   ~SubItemValuePerItem() = default;
 };
 
+// Item values at nodes
+
 template <typename DataType>
-using NodeValuePerCell = SubItemValuePerItem<DataType, ItemType::node, ItemType::cell>;
+using NodeValuePerEdge = SubItemValuePerItem<DataType, ItemType::node, ItemType::edge>;
 
 template <typename DataType>
 using NodeValuePerFace = SubItemValuePerItem<DataType, ItemType::node, ItemType::face>;
 
+template <typename DataType>
+using NodeValuePerCell = SubItemValuePerItem<DataType, ItemType::node, ItemType::cell>;
+
+// Item values at edges
+
+template <typename DataType>
+using EdgeValuePerNode = SubItemValuePerItem<DataType, ItemType::edge, ItemType::node>;
+
+template <typename DataType>
+using EdgeValuePerFace = SubItemValuePerItem<DataType, ItemType::edge, ItemType::face>;
+
+template <typename DataType>
+using EdgeValuePerCell = SubItemValuePerItem<DataType, ItemType::edge, ItemType::cell>;
+
+// Item values at faces
+
 template <typename DataType>
 using FaceValuePerNode = SubItemValuePerItem<DataType, ItemType::face, ItemType::node>;
 
+template <typename DataType>
+using FaceValuePerEdge = SubItemValuePerItem<DataType, ItemType::face, ItemType::edge>;
+
 template <typename DataType>
 using FaceValuePerCell = SubItemValuePerItem<DataType, ItemType::face, ItemType::cell>;
 
+// Item values at cells
+
 template <typename DataType>
 using CellValuePerNode = SubItemValuePerItem<DataType, ItemType::cell, ItemType::node>;
 
+template <typename DataType>
+using CellValuePerEdge = SubItemValuePerItem<DataType, ItemType::cell, ItemType::edge>;
+
 template <typename DataType>
 using CellValuePerFace = SubItemValuePerItem<DataType, ItemType::cell, ItemType::face>;