diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp
index c52dab2062ad14637fbeb435f90b3277d9173c66..fedd337467e4418f70a1ec87a9547f433bff0672 100644
--- a/src/mesh/Connectivity.cpp
+++ b/src/mesh/Connectivity.cpp
@@ -9,7 +9,7 @@ void Connectivity<3>::_computeFaceCellConnectivities()
   typedef std::tuple<unsigned int, unsigned short, bool> CellFaceInfo;
 
   const auto& cell_to_node_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)];
+      = m_item_to_item_matrix[itemId(ItemType::cell)][itemId(ItemType::node)];
 
   std::map<Face, std::vector<CellFaceInfo>> face_cells_map;
   for (unsigned int j=0; j<this->numberOfCells(); ++j) {
@@ -98,7 +98,7 @@ void Connectivity<3>::_computeFaceCellConnectivities()
 
   {
     auto& cell_to_face_matrix
-        = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)];
+        = m_item_to_item_matrix[itemId(ItemType::cell)][itemId(ItemType::face)];
     std::vector<std::vector<unsigned int>> cell_to_face_vector(this->numberOfCells());
     for (size_t j=0; j<cell_to_face_vector.size(); ++j) {
       cell_to_face_vector[j].resize(cell_nb_faces[j]);
@@ -130,7 +130,7 @@ void Connectivity<3>::_computeFaceCellConnectivities()
 
   {
     auto& face_to_node_matrix
-        = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+        = m_item_to_item_matrix[itemId(ItemType::face)][itemId(ItemType::node)];
 
     std::vector<std::vector<unsigned int>> face_to_node_vector(face_cells_map.size());
     int l=0;
@@ -152,18 +152,18 @@ void Connectivity<3>::_computeFaceCellConnectivities()
   }
 
   const auto& cell_to_face_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)];
+      = m_item_to_item_matrix[itemId(ItemType::cell)][itemId(ItemType::face)];
   auto& face_to_cell_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
+      = m_item_to_item_matrix[itemId(ItemType::face)][itemId(ItemType::cell)];
   m_connectivity_computer.computeInverseConnectivityMatrix(cell_to_face_matrix,
                                                            face_to_cell_matrix);
 
   m_face_to_cell_local_face
-      = m_connectivity_computer.computeLocalItemNumberInChildItem<TypeOfItem::face,
-                                                                  TypeOfItem::cell>(*this);
+      = m_connectivity_computer.computeLocalItemNumberInChildItem<ItemType::face,
+                                                                  ItemType::cell>(*this);
 
   const auto& face_to_node_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+      = m_item_to_item_matrix[itemId(ItemType::face)][itemId(ItemType::node)];
 
 #warning check that the number of cell per faces is <=2
   std::unordered_map<unsigned int, std::vector<unsigned int>> node_faces_map;
@@ -197,7 +197,7 @@ template<>
 void Connectivity<2>::_computeFaceCellConnectivities()
 {
   const auto& cell_to_node_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)];
+      = m_item_to_item_matrix[itemId(ItemType::cell)][itemId(ItemType::node)];
 
   // In 2D faces are simply define
   typedef std::pair<unsigned int, unsigned short> CellFaceId;
@@ -232,7 +232,7 @@ void Connectivity<2>::_computeFaceCellConnectivities()
       ++l;
     }
     auto& face_to_node_matrix
-        = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+        = m_item_to_item_matrix[itemId(ItemType::face)][itemId(ItemType::node)];
     face_to_node_matrix = face_to_node_vector;
   }
 
@@ -247,7 +247,7 @@ void Connectivity<2>::_computeFaceCellConnectivities()
       ++l;
     }
     auto& face_to_cell_matrix
-        = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
+        = m_item_to_item_matrix[itemId(ItemType::face)][itemId(ItemType::cell)];
     face_to_cell_matrix = face_to_cell_vector;
   }
 }
@@ -258,7 +258,7 @@ Connectivity<Dimension>::
 Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector)
 {
   auto& cell_to_node_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)];
+      = m_item_to_item_matrix[itemId(ItemType::cell)][itemId(ItemType::node)];
   cell_to_node_matrix = cell_by_node_vector;
 
   Assert(this->numberOfCells()>0);
@@ -273,16 +273,16 @@ Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector)
   }
 
   auto& node_to_cell_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)];
+      = m_item_to_item_matrix[itemId(ItemType::node)][itemId(ItemType::cell)];
 
   m_connectivity_computer.computeInverseConnectivityMatrix(cell_to_node_matrix,
                                                            node_to_cell_matrix);
 
   m_node_to_cell_local_node
-      = m_connectivity_computer.computeLocalItemNumberInChildItem<TypeOfItem::node, TypeOfItem::cell>(*this);
+      = m_connectivity_computer.computeLocalItemNumberInChildItem<ItemType::node, ItemType::cell>(*this);
 
   m_cell_to_node_local_cell
-      = m_connectivity_computer.computeLocalItemNumberInChildItem<TypeOfItem::cell, TypeOfItem::node>(*this);
+      = m_connectivity_computer.computeLocalItemNumberInChildItem<ItemType::cell, ItemType::node>(*this);
 
   if constexpr (Dimension>1) {
     this->_computeFaceCellConnectivities();
diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index dc30bf95076f8d9fe685e9bc82b7c215860f2356..0bb4501ca3d9b45065dd6000273629c1b077ef11 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -17,7 +17,7 @@
 #include <algorithm>
 
 #include <RefId.hpp>
-#include <TypeOfItem.hpp>
+#include <ItemType.hpp>
 #include <RefNodeList.hpp>
 #include <RefFaceList.hpp>
 
@@ -230,14 +230,14 @@ class Connectivity final
  public:
   static constexpr size_t dimension = Dimension;
 
-  template <TypeOfItem item_type_0, TypeOfItem item_type_1>
+  template <ItemType item_type_0, ItemType item_type_1>
   const ConnectivityMatrix& itemToItemMatrix() const
   {
     return m_item_to_item_matrix[itemId(item_type_0)][itemId(item_type_1)];
   };
 
-  const ConnectivityMatrix& getMatrix(const TypeOfItem& item_type_0,
-                                      const TypeOfItem& item_type_1) const
+  const ConnectivityMatrix& getMatrix(const ItemType& item_type_0,
+                                      const ItemType& item_type_1) const
   {
     return m_item_to_item_matrix[itemId(item_type_0)][itemId(item_type_1)];
   }
@@ -343,7 +343,7 @@ private:
   size_t numberOfNodes() const
   {
     const auto& node_to_cell_matrix
-        = m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)];
+        = m_item_to_item_matrix[itemId(ItemType::node)][itemId(ItemType::cell)];
     return node_to_cell_matrix.numRows();
   }
 
@@ -351,7 +351,7 @@ private:
   size_t numberOfFaces() const
   {
     const auto& face_to_node_matrix
-        = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+        = m_item_to_item_matrix[itemId(ItemType::face)][itemId(ItemType::node)];
     return face_to_node_matrix.numRows();
   }
 
@@ -359,7 +359,7 @@ private:
   size_t numberOfCells() const
   {
     const auto& cell_to_node_matrix
-        = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)];
+        = m_item_to_item_matrix[itemId(ItemType::cell)][itemId(ItemType::node)];
     return cell_to_node_matrix.numRows();
   }
 
diff --git a/src/mesh/ConnectivityComputer.cpp b/src/mesh/ConnectivityComputer.cpp
index fea44f9e4ee6b8067b922d2d581c3dfc2ae48773..91965f3f911958f0838707312fc4025150fbd677 100644
--- a/src/mesh/ConnectivityComputer.cpp
+++ b/src/mesh/ConnectivityComputer.cpp
@@ -36,8 +36,8 @@ computeInverseConnectivityMatrix(const ConnectivityMatrix& item_to_child_item_ma
   child_item_to_item_matrix = child_item_to_items_vector;
 }
 
-template <TypeOfItem child_item_type,
-          TypeOfItem item_type,
+template <ItemType child_item_type,
+          ItemType item_type,
           typename ConnectivityType>
 SubItemValuePerItem<const unsigned short, item_type, child_item_type>
 ConnectivityComputer::computeLocalItemNumberInChildItem(const ConnectivityType& connectivity) const
@@ -69,52 +69,52 @@ ConnectivityComputer::computeLocalItemNumberInChildItem(const ConnectivityType&
 
 // 1D
 
-template SubItemValuePerItem<const unsigned short, TypeOfItem::cell, TypeOfItem::node>
+template SubItemValuePerItem<const unsigned short, ItemType::cell, ItemType::node>
 ConnectivityComputer::
-computeLocalItemNumberInChildItem<TypeOfItem::node,
-                                  TypeOfItem::cell>(const Connectivity1D& connectivity) const;
+computeLocalItemNumberInChildItem<ItemType::node,
+                                  ItemType::cell>(const Connectivity1D& connectivity) const;
 
-template SubItemValuePerItem<const unsigned short, TypeOfItem::cell, TypeOfItem::face>
+template SubItemValuePerItem<const unsigned short, ItemType::cell, ItemType::face>
 ConnectivityComputer::
-computeLocalItemNumberInChildItem<TypeOfItem::face,
-                                  TypeOfItem::cell>(const Connectivity1D& connectivity) const;
+computeLocalItemNumberInChildItem<ItemType::face,
+                                  ItemType::cell>(const Connectivity1D& connectivity) const;
 
-template SubItemValuePerItem<const unsigned short, TypeOfItem::node, TypeOfItem::cell>
+template SubItemValuePerItem<const unsigned short, ItemType::node, ItemType::cell>
 ConnectivityComputer::
-computeLocalItemNumberInChildItem<TypeOfItem::cell,
-                                  TypeOfItem::node>(const Connectivity1D& connectivity) const;
+computeLocalItemNumberInChildItem<ItemType::cell,
+                                  ItemType::node>(const Connectivity1D& connectivity) const;
 
 // 2D
 
-template SubItemValuePerItem<const unsigned short, TypeOfItem::cell, TypeOfItem::node>
+template SubItemValuePerItem<const unsigned short, ItemType::cell, ItemType::node>
 ConnectivityComputer::
-computeLocalItemNumberInChildItem<TypeOfItem::node,
-                                  TypeOfItem::cell>(const Connectivity2D& connectivity) const;
+computeLocalItemNumberInChildItem<ItemType::node,
+                                  ItemType::cell>(const Connectivity2D& connectivity) const;
 
-template SubItemValuePerItem<const unsigned short, TypeOfItem::cell, TypeOfItem::face>
+template SubItemValuePerItem<const unsigned short, ItemType::cell, ItemType::face>
 ConnectivityComputer::
-computeLocalItemNumberInChildItem<TypeOfItem::face,
-                                  TypeOfItem::cell>(const Connectivity2D& connectivity) const;
+computeLocalItemNumberInChildItem<ItemType::face,
+                                  ItemType::cell>(const Connectivity2D& connectivity) const;
 
-template SubItemValuePerItem<const unsigned short, TypeOfItem::node, TypeOfItem::cell>
+template SubItemValuePerItem<const unsigned short, ItemType::node, ItemType::cell>
 ConnectivityComputer::
-computeLocalItemNumberInChildItem<TypeOfItem::cell,
-                                  TypeOfItem::node>(const Connectivity2D& connectivity) const;
+computeLocalItemNumberInChildItem<ItemType::cell,
+                                  ItemType::node>(const Connectivity2D& connectivity) const;
 
 // 3D
 
-template SubItemValuePerItem<const unsigned short, TypeOfItem::cell, TypeOfItem::node>
+template SubItemValuePerItem<const unsigned short, ItemType::cell, ItemType::node>
 ConnectivityComputer::
-computeLocalItemNumberInChildItem<TypeOfItem::node,
-                                  TypeOfItem::cell>(const Connectivity3D& connectivity) const;
+computeLocalItemNumberInChildItem<ItemType::node,
+                                  ItemType::cell>(const Connectivity3D& connectivity) const;
 
 
-template SubItemValuePerItem<const unsigned short, TypeOfItem::cell, TypeOfItem::face>
+template SubItemValuePerItem<const unsigned short, ItemType::cell, ItemType::face>
 ConnectivityComputer::
-computeLocalItemNumberInChildItem<TypeOfItem::face,
-                                  TypeOfItem::cell>(const Connectivity3D& connectivity) const;
+computeLocalItemNumberInChildItem<ItemType::face,
+                                  ItemType::cell>(const Connectivity3D& connectivity) const;
 
-template SubItemValuePerItem<const unsigned short, TypeOfItem::node, TypeOfItem::cell>
+template SubItemValuePerItem<const unsigned short, ItemType::node, ItemType::cell>
 ConnectivityComputer::
-computeLocalItemNumberInChildItem<TypeOfItem::cell,
-                                  TypeOfItem::node>(const Connectivity3D& connectivity) const;
+computeLocalItemNumberInChildItem<ItemType::cell,
+                                  ItemType::node>(const Connectivity3D& connectivity) const;
diff --git a/src/mesh/ConnectivityComputer.hpp b/src/mesh/ConnectivityComputer.hpp
index 87dcc06727d034114879e15d8de2b3bcf0ec6560..cfdf1272708b2bb2ef6c2c5e557097c0c407cc29 100644
--- a/src/mesh/ConnectivityComputer.hpp
+++ b/src/mesh/ConnectivityComputer.hpp
@@ -9,8 +9,8 @@ struct ConnectivityComputer
   void computeInverseConnectivityMatrix(const ConnectivityMatrix& item_to_child_item_matrix,
                                         ConnectivityMatrix& child_item_to_item_matrix) const;
 
-  template <TypeOfItem child_item_type,
-            TypeOfItem item_type,
+  template <ItemType child_item_type,
+            ItemType item_type,
             typename ConnectivityType>
   SubItemValuePerItem<const unsigned short, item_type, child_item_type>
   computeLocalItemNumberInChildItem(const ConnectivityType& c) const;
diff --git a/src/mesh/ConnectivityUtils.hpp b/src/mesh/ConnectivityUtils.hpp
index b5fcbb9ac78d1acf72b52a66d6740a3a006119e1..e073d552132019c4172c5cb1b6920ca4f199f428 100644
--- a/src/mesh/ConnectivityUtils.hpp
+++ b/src/mesh/ConnectivityUtils.hpp
@@ -1,11 +1,11 @@
 #ifndef CONNECTIVITY_UTILS_HPP
 #define CONNECTIVITY_UTILS_HPP
 
-#include <TypeOfItem.hpp>
+#include <ItemType.hpp>
 #include <ConnectivityMatrix.hpp>
 
-template <TypeOfItem item_type_0,
-          TypeOfItem item_type_1,
+template <ItemType item_type_0,
+          ItemType item_type_1,
           typename ConnectivityType>
 inline
 const ConnectivityMatrix& getConnectivityMatrix(const ConnectivityType& connectivity)
diff --git a/src/mesh/IConnectivity.hpp b/src/mesh/IConnectivity.hpp
index 40843d70a75b8264c652a48cabba644351c962b9..49432fdea276d770c993960a2ffb48da2f7407b0 100644
--- a/src/mesh/IConnectivity.hpp
+++ b/src/mesh/IConnectivity.hpp
@@ -1,14 +1,14 @@
 #ifndef ICONNECTIVITY_HPP
 #define ICONNECTIVITY_HPP
 
-#include <TypeOfItem.hpp>
+#include <ItemType.hpp>
 #include <ConnectivityMatrix.hpp>
 
 struct IConnectivity
 {
   virtual const ConnectivityMatrix&
-  getMatrix(const TypeOfItem& item_type_0,
-            const TypeOfItem& item_type_1) const = 0;
+  getMatrix(const ItemType& item_type_0,
+            const ItemType& item_type_1) const = 0;
 
   IConnectivity() = default;
   IConnectivity(const IConnectivity&) = delete;
diff --git a/src/mesh/ItemType.hpp b/src/mesh/ItemType.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..56d35de3f4eff519f633b26c0a444e98d62a6e01
--- /dev/null
+++ b/src/mesh/ItemType.hpp
@@ -0,0 +1,92 @@
+#ifndef ITEM_TYPE_HPP
+#define ITEM_TYPE_HPP
+
+#include <utility>
+#include <limits>
+
+enum class ItemType
+{
+  node = 0,
+  edge = 1,
+  face = 2,
+  cell = 3
+};
+
+template <size_t Dimension>
+struct ItemId {};
+
+template <>
+struct ItemId<1>
+{
+  inline static constexpr size_t itemId(const ItemType& item_type) {
+    size_t i = std::numeric_limits<size_t>::max();
+    switch(item_type) {
+      case ItemType::cell: {
+        i=0;
+        break;
+      }
+      case ItemType::face:
+      case ItemType::edge:
+      case ItemType::node: {
+        // in 1d, faces, edges and nodes are the same
+        i=1;
+        break;
+      }
+    }
+    return i;
+  }
+};
+
+template <>
+struct ItemId<2>
+{
+  inline static constexpr size_t itemId(const ItemType& item_type) {
+    size_t i = std::numeric_limits<size_t>::max();
+    switch(item_type) {
+      case ItemType::cell: {
+        i=0;
+        break;
+      }
+      case ItemType::face:
+      case ItemType::edge: {
+        // in 2d, faces and edges are the same
+        i=1;
+        break;
+      }
+      case ItemType::node: {
+        i=2;
+        break;
+      }
+    }
+    return i;
+  }
+};
+
+template <>
+struct ItemId<3>
+{
+  inline static constexpr size_t itemId(const ItemType& item_type) {
+    size_t i = std::numeric_limits<size_t>::max();
+    switch(item_type) {
+      case ItemType::cell: {
+        i=0;
+        break;
+      }
+      case ItemType::face: {
+        i=1;
+        break;
+      }
+      case ItemType::edge: {
+        i=2;
+        break;
+      }
+      case ItemType::node: {
+        i=3;
+        break;
+      }
+    }
+    return i;
+  }
+};
+
+#endif // ITEM_TYPE_HPP
diff --git a/src/mesh/MeshData.hpp b/src/mesh/MeshData.hpp
index fc7bcf66f7072cc7b9cfa3acc3d6dd0339096cb5..66ba3626a0458ad0660e0184a2e0304e52def5c4 100644
--- a/src/mesh/MeshData.hpp
+++ b/src/mesh/MeshData.hpp
@@ -36,8 +36,8 @@ class MeshData
       const Kokkos::View<const Rd*> xr = m_mesh.xr();
 
       const auto& cell_to_node_matrix
-        = getConnectivityMatrix<TypeOfItem::cell,
-                                TypeOfItem::node>(m_mesh.connectivity());
+        = getConnectivityMatrix<ItemType::cell,
+                                ItemType::node>(m_mesh.connectivity());
 
       Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j){
           const auto& cell_nodes = cell_to_node_matrix.rowConst(j);
@@ -49,8 +49,8 @@ class MeshData
           = m_mesh.connectivity().invCellNbNodes();
 
       const auto& cell_to_node_matrix
-          = getConnectivityMatrix<TypeOfItem::cell,
-                                  TypeOfItem::node>(m_mesh.connectivity());
+          = getConnectivityMatrix<ItemType::cell,
+                                  ItemType::node>(m_mesh.connectivity());
 
       Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j){
           Rd X = zero;
@@ -68,8 +68,8 @@ class MeshData
   {
     const Kokkos::View<const Rd*> xr = m_mesh.xr();
     const auto& cell_to_node_matrix
-        = getConnectivityMatrix<TypeOfItem::cell,
-                                TypeOfItem::node>(m_mesh.connectivity());
+        = getConnectivityMatrix<ItemType::cell,
+                                ItemType::node>(m_mesh.connectivity());
 
     Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j){
         double sum_cjr_xr = 0;
@@ -90,8 +90,8 @@ class MeshData
     else if constexpr (dimension == 2) {
       const Kokkos::View<const Rd*> xr = m_mesh.xr();
       const auto& cell_to_node_matrix
-          = getConnectivityMatrix<TypeOfItem::cell,
-                                  TypeOfItem::node>(m_mesh.connectivity());
+          = getConnectivityMatrix<ItemType::cell,
+                                  ItemType::node>(m_mesh.connectivity());
 
       Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j){
           const auto& cell_nodes = cell_to_node_matrix.rowConst(j);
@@ -118,8 +118,8 @@ class MeshData
 
       NodeValuePerFace<Rd> Nlr(m_mesh.connectivity());
       const auto& face_to_node_matrix
-          = getConnectivityMatrix<TypeOfItem::face,
-                                  TypeOfItem::node>(m_mesh.connectivity());
+          = getConnectivityMatrix<ItemType::face,
+                                  ItemType::node>(m_mesh.connectivity());
 
       Kokkos::parallel_for(m_mesh.numberOfFaces(), KOKKOS_LAMBDA(const int& l) {
           const auto& face_nodes = face_to_node_matrix.rowConst(l);
@@ -146,12 +146,12 @@ class MeshData
         });
 
       const auto& cell_to_node_matrix
-          = getConnectivityMatrix<TypeOfItem::cell,
-                                  TypeOfItem::node>(m_mesh.connectivity());
+          = getConnectivityMatrix<ItemType::cell,
+                                  ItemType::node>(m_mesh.connectivity());
 
       const auto& cell_to_face_matrix
-          = getConnectivityMatrix<TypeOfItem::cell,
-                                  TypeOfItem::face>(m_mesh.connectivity());
+          = getConnectivityMatrix<ItemType::cell,
+                                  ItemType::face>(m_mesh.connectivity());
 
       const auto& cell_face_is_reversed = m_mesh.connectivity().cellFaceIsReversed();
       Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) {
diff --git a/src/mesh/MeshNodeBoundary.hpp b/src/mesh/MeshNodeBoundary.hpp
index a1e3e9562df266fff75d0f25a6ed2b0bb90fdd99..cf9df04f0b92112e7b8d907652bc78be06890c2a 100644
--- a/src/mesh/MeshNodeBoundary.hpp
+++ b/src/mesh/MeshNodeBoundary.hpp
@@ -32,8 +32,8 @@ class MeshNodeBoundary
   {
     static_assert(dimension == MeshType::dimension);
     const auto& face_to_cell_matrix
-        = getConnectivityMatrix<TypeOfItem::face,
-                                TypeOfItem::cell>(mesh.connectivity());
+        = getConnectivityMatrix<ItemType::face,
+                                ItemType::cell>(mesh.connectivity());
 
     const Kokkos::View<const unsigned int*>& face_list = ref_face_list.faceList();
     Kokkos::parallel_for(face_list.extent(0), KOKKOS_LAMBDA(const int& l){
@@ -48,8 +48,8 @@ class MeshNodeBoundary
     // not enough but should reduce significantly the number of resizing
     node_ids.reserve(dimension*face_list.extent(0));
     const auto& face_to_node_matrix
-        = getConnectivityMatrix<TypeOfItem::face,
-                                TypeOfItem::node>(mesh.connectivity());
+        = getConnectivityMatrix<ItemType::face,
+                                ItemType::node>(mesh.connectivity());
 
     for (size_t l=0; l<face_list.extent(0); ++l) {
       const size_t face_number = face_list[l];
@@ -317,12 +317,12 @@ _getOutgoingNormal(const MeshType& mesh)
 
   const Kokkos::View<const R*>& xr = mesh.xr();
   const auto& cell_to_node_matrix
-      = getConnectivityMatrix<TypeOfItem::cell,
-                              TypeOfItem::node>(mesh.connectivity());
+      = getConnectivityMatrix<ItemType::cell,
+                              ItemType::node>(mesh.connectivity());
 
   const auto& node_to_cell_matrix
-          = getConnectivityMatrix<TypeOfItem::node,
-                                  TypeOfItem::cell>(mesh.connectivity());
+          = getConnectivityMatrix<ItemType::node,
+                                  ItemType::cell>(mesh.connectivity());
 
   const size_t r0 = m_node_list[0];
   const size_t j0 = node_to_cell_matrix.rowConst(r0)(0);
@@ -354,12 +354,12 @@ _getOutgoingNormal(const MeshType& mesh)
 
   const Kokkos::View<const R2*>& xr = mesh.xr();
   const auto& cell_to_node_matrix
-      = getConnectivityMatrix<TypeOfItem::cell,
-                              TypeOfItem::node>(mesh.connectivity());
+      = getConnectivityMatrix<ItemType::cell,
+                              ItemType::node>(mesh.connectivity());
 
   const auto& node_to_cell_matrix
-          = getConnectivityMatrix<TypeOfItem::node,
-                                  TypeOfItem::cell>(mesh.connectivity());
+          = getConnectivityMatrix<ItemType::node,
+                                  ItemType::cell>(mesh.connectivity());
 
   const size_t r0 = m_node_list[0];
   const size_t j0 = node_to_cell_matrix.rowConst(r0)(0);
@@ -391,12 +391,12 @@ _getOutgoingNormal(const MeshType& mesh)
 
   const Kokkos::View<const R3*>& xr = mesh.xr();
   const auto& cell_to_node_matrix
-      = getConnectivityMatrix<TypeOfItem::cell,
-                              TypeOfItem::node>(mesh.connectivity());
+      = getConnectivityMatrix<ItemType::cell,
+                              ItemType::node>(mesh.connectivity());
 
   const auto& node_to_cell_matrix
-          = getConnectivityMatrix<TypeOfItem::node,
-                                  TypeOfItem::cell>(mesh.connectivity());
+          = getConnectivityMatrix<ItemType::node,
+                                  ItemType::cell>(mesh.connectivity());
 
   const size_t r0 = m_node_list[0];
   const size_t j0 = node_to_cell_matrix.rowConst(r0)(0);
diff --git a/src/mesh/SubItemValuePerItem.hpp b/src/mesh/SubItemValuePerItem.hpp
index c578306284185c7c481f2f825f19e74838a9887e..c2669e95b647f8f57c2ae498d61ed2020504675f 100644
--- a/src/mesh/SubItemValuePerItem.hpp
+++ b/src/mesh/SubItemValuePerItem.hpp
@@ -2,7 +2,7 @@
 #define SUBITEM_VALUE_PER_ITEM_HPP
 
 #include <Kokkos_StaticCrsGraph.hpp>
-#include <TypeOfItem.hpp>
+#include <ItemType.hpp>
 #include <PastisAssert.hpp>
 
 #include <ConnectivityMatrix.hpp>
@@ -10,8 +10,8 @@
 #include <ConnectivityUtils.hpp>
 
 template <typename DataType,
-          TypeOfItem SubItemType,
-          TypeOfItem ItemType>
+          ItemType SubItemType,
+          ItemType ItemType>
 class SubItemValuePerItem
 {
  private:
@@ -168,21 +168,21 @@ class SubItemValuePerItem
 };
 
 template <typename DataType>
-using NodeValuePerCell = SubItemValuePerItem<DataType, TypeOfItem::node, TypeOfItem::cell>;
+using NodeValuePerCell = SubItemValuePerItem<DataType, ItemType::node, ItemType::cell>;
 
 template <typename DataType>
-using NodeValuePerFace = SubItemValuePerItem<DataType, TypeOfItem::node, TypeOfItem::face>;
+using NodeValuePerFace = SubItemValuePerItem<DataType, ItemType::node, ItemType::face>;
 
 template <typename DataType>
-using FaceValuePerNode = SubItemValuePerItem<DataType, TypeOfItem::face, TypeOfItem::node>;
+using FaceValuePerNode = SubItemValuePerItem<DataType, ItemType::face, ItemType::node>;
 
 template <typename DataType>
-using FaceValuePerCell = SubItemValuePerItem<DataType, TypeOfItem::face, TypeOfItem::cell>;
+using FaceValuePerCell = SubItemValuePerItem<DataType, ItemType::face, ItemType::cell>;
 
 template <typename DataType>
-using CellValuePerNode = SubItemValuePerItem<DataType, TypeOfItem::cell, TypeOfItem::node>;
+using CellValuePerNode = SubItemValuePerItem<DataType, ItemType::cell, ItemType::node>;
 
 template <typename DataType>
-using CellValuePerFace = SubItemValuePerItem<DataType, TypeOfItem::cell, TypeOfItem::face>;
+using CellValuePerFace = SubItemValuePerItem<DataType, ItemType::cell, ItemType::face>;
 
 #endif // SUBITEM_VALUE_PER_ITEM_HPP
diff --git a/src/mesh/TypeOfItem.hpp b/src/mesh/TypeOfItem.hpp
deleted file mode 100644
index 10ff8c1680d510a580960984a541b3a6d8bdc2dc..0000000000000000000000000000000000000000
--- a/src/mesh/TypeOfItem.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef TYPE_OF_ITEM_HPP
-#define TYPE_OF_ITEM_HPP
-
-#include <utility>
-
-enum class TypeOfItem {
-  node = 0,
-  edge = 1,
-  face = 2,
-  cell = 3
-};
-
-template <size_t Dimension>
-struct ItemId {};
-
-template <>
-struct ItemId<1>
-{
-  inline static constexpr size_t itemId(const TypeOfItem& item_type) {
-    switch(item_type) {
-      case TypeOfItem::cell: {
-        return 0;
-      }
-      case TypeOfItem::face:
-      case TypeOfItem::edge:
-      case TypeOfItem::node: {
-        // in 1d, faces, edges and nodes are the same
-        return 1;
-      }
-    }
-  }
-};
-
-template <>
-struct ItemId<2>
-{
-  inline static constexpr size_t itemId(const TypeOfItem& item_type) {
-    switch(item_type) {
-      case TypeOfItem::cell: {
-        return 0;
-      }
-      case TypeOfItem::face:
-      case TypeOfItem::edge: {
-        // in 2d, faces and edges are the same
-        return 1;
-      }
-      case TypeOfItem::node: {
-        return 2;
-      }
-    }
-  }
-};
-
-template <>
-struct ItemId<3>
-{
-  inline static constexpr size_t itemId(const TypeOfItem& item_type) {
-    switch(item_type) {
-      case TypeOfItem::cell: {
-        return 0;
-      }
-      case TypeOfItem::face: {
-        return 1;
-      }
-      case TypeOfItem::edge: {
-        // in 2d, faces and edges are the same
-        return 2;
-      }
-      case TypeOfItem::node: {
-        return 3;
-      }
-    }
-  }
-};
-
-#endif // TYPE_OF_ITEM_HPP
diff --git a/src/output/VTKWriter.hpp b/src/output/VTKWriter.hpp
index 623576e67ee329d0a353062a9d323b8a98046a4f..a2454cb0fc2b375c71267ff622a79e9dca381bc4 100644
--- a/src/output/VTKWriter.hpp
+++ b/src/output/VTKWriter.hpp
@@ -72,8 +72,8 @@ class VTKWriter
     fout << "<DataArray type=\"Int32\" Name=\"connectivity\" NumberOfComponents=\"1\" format=\"ascii\">\n";
 
     const auto& cell_to_node_matrix
-        = getConnectivityMatrix<TypeOfItem::cell,
-                                TypeOfItem::node>(mesh.connectivity());
+        = getConnectivityMatrix<ItemType::cell,
+                                ItemType::node>(mesh.connectivity());
 
     for (unsigned int j=0; j<mesh.numberOfCells(); ++j) {
       const auto& cell_nodes = cell_to_node_matrix.rowConst(j);
diff --git a/src/scheme/AcousticSolver.hpp b/src/scheme/AcousticSolver.hpp
index fc7baf549411f5ebc171c921037db9b4c26e5999..52a3905c1746d90f71a1946c9a0b4fb982213eab 100644
--- a/src/scheme/AcousticSolver.hpp
+++ b/src/scheme/AcousticSolver.hpp
@@ -99,8 +99,8 @@ class AcousticSolver
   const Kokkos::View<const Rdd*>
   computeAr(const NodeValuePerCell<Rdd>& Ajr) {
     const auto& node_to_cell_matrix
-        = getConnectivityMatrix<TypeOfItem::node,
-                                TypeOfItem::cell>(m_connectivity);
+        = getConnectivityMatrix<ItemType::node,
+                                ItemType::cell>(m_connectivity);
     const auto& node_to_cell_local_node = m_connectivity.nodeToCellLocalNode();
     Kokkos::parallel_for(m_mesh.numberOfNodes(), KOKKOS_LAMBDA(const int& r) {
         Rdd sum = zero;
@@ -124,8 +124,8 @@ class AcousticSolver
             const Kokkos::View<const Rd*>& uj,
             const Kokkos::View<const double*>& pj) {
     const auto& node_to_cell_matrix
-        = getConnectivityMatrix<TypeOfItem::node,
-                                TypeOfItem::cell>(m_connectivity);
+        = getConnectivityMatrix<ItemType::node,
+                                ItemType::cell>(m_connectivity);
     const auto& node_to_cell_local_node = m_connectivity.nodeToCellLocalNode();
     Kokkos::parallel_for(m_mesh.numberOfNodes(), KOKKOS_LAMBDA(const int& r) {
         Rd& br = m_br(r);
@@ -205,8 +205,8 @@ class AcousticSolver
              const Kokkos::View<const double*>& pj)
   {
     const auto& cell_to_node_matrix
-        = getConnectivityMatrix<TypeOfItem::cell,
-                                TypeOfItem::node>(m_mesh.connectivity());
+        = getConnectivityMatrix<ItemType::cell,
+                                ItemType::node>(m_mesh.connectivity());
 
     Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) {
         const auto& cell_nodes = cell_to_node_matrix.rowConst(j);
@@ -284,8 +284,8 @@ class AcousticSolver
   {
     const NodeValuePerCell<double>& ljr = m_mesh_data.ljr();
     const auto& cell_to_node_matrix
-        = getConnectivityMatrix<TypeOfItem::cell,
-                                TypeOfItem::node>(m_mesh.connectivity());
+        = getConnectivityMatrix<ItemType::cell,
+                                ItemType::node>(m_mesh.connectivity());
 
     Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j){
         const auto& cell_nodes = cell_to_node_matrix.rowConst(j);
@@ -328,8 +328,8 @@ class AcousticSolver
     const NodeValuePerCell<Rd>& Fjr = m_Fjr;
     const Kokkos::View<const Rd*> ur = m_ur;
     const auto& cell_to_node_matrix
-        = getConnectivityMatrix<TypeOfItem::cell,
-                                TypeOfItem::node>(m_mesh.connectivity());
+        = getConnectivityMatrix<ItemType::cell,
+                                ItemType::node>(m_mesh.connectivity());
 
     const Kokkos::View<const double*> inv_mj = unknowns.invMj();
     Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) {