diff --git a/src/mesh/ItemType.hpp b/src/mesh/ItemType.hpp
index c2f2da131e417e931cce8d3c40d91fd83ad19d45..285806fe0599f66d5f70b55e0e4e2de3e5d9d919 100644
--- a/src/mesh/ItemType.hpp
+++ b/src/mesh/ItemType.hpp
@@ -59,8 +59,8 @@ struct ItemTypeId<1>
       i = 0;
       break;
     }
-    case ItemType::edge:
     case ItemType::face:
+    case ItemType::edge:
     case ItemType::node: {
       // in 1d, faces, edges and nodes are the same
       i = 1;
@@ -69,6 +69,13 @@ struct ItemTypeId<1>
     }
     return i;
   }
+
+  PUGS_INLINE
+  static constexpr size_t
+  dimension(ItemType item_type)
+  {
+    return 1 - itemTId(item_type);
+  }
 };
 
 template <ItemType item_type>
@@ -87,8 +94,8 @@ struct ItemTypeId<2>
       i = 0;
       break;
     }
-    case ItemType::edge:
-    case ItemType::face: {
+    case ItemType::face:
+    case ItemType::edge: {
       // in 2d, faces and edges are the same
       i = 1;
       break;
@@ -100,6 +107,13 @@ struct ItemTypeId<2>
     }
     return i;
   }
+
+  PUGS_INLINE
+  static constexpr size_t
+  dimension(ItemType item_type)
+  {
+    return 2 - itemTId(item_type);
+  }
 };
 
 template <ItemType item_type>
@@ -118,11 +132,11 @@ struct ItemTypeId<3>
       i = 0;
       break;
     }
-    case ItemType::edge: {
+    case ItemType::face: {
       i = 1;
       break;
     }
-    case ItemType::face: {
+    case ItemType::edge: {
       i = 2;
       break;
     }
@@ -133,6 +147,13 @@ struct ItemTypeId<3>
     }
     return i;
   }
+
+  PUGS_INLINE
+  static constexpr size_t
+  dimension(ItemType item_type)
+  {
+    return 3 - itemTId(item_type);
+  }
 };
 
 template <ItemType item_type>
diff --git a/tests/test_ItemType.cpp b/tests/test_ItemType.cpp
index d560a7098ee0e2cec80a1efb64ab599df5ef67ec..ba5d7fe603c4dfe148c2b7e209742da3e5c6cfe0 100644
--- a/tests/test_ItemType.cpp
+++ b/tests/test_ItemType.cpp
@@ -30,24 +30,39 @@ TEST_CASE("ItemType", "[connectivity]")
   SECTION("checking for item ids in 1d")
   {
     REQUIRE(ItemTypeId<1>::itemTId(cell_type) == 0);
-    REQUIRE(ItemTypeId<1>::itemTId(edge_type) == 1);
     REQUIRE(ItemTypeId<1>::itemTId(face_type) == 1);
+    REQUIRE(ItemTypeId<1>::itemTId(edge_type) == 1);
     REQUIRE(ItemTypeId<1>::itemTId(node_type) == 1);
+
+    REQUIRE(ItemTypeId<1>::dimension(cell_type) == 1);
+    REQUIRE(ItemTypeId<1>::dimension(face_type) == 0);
+    REQUIRE(ItemTypeId<1>::dimension(edge_type) == 0);
+    REQUIRE(ItemTypeId<1>::dimension(node_type) == 0);
   }
 
   SECTION("checking for item ids in 2d")
   {
     REQUIRE(ItemTypeId<2>::itemTId(cell_type) == 0);
-    REQUIRE(ItemTypeId<2>::itemTId(edge_type) == 1);
     REQUIRE(ItemTypeId<2>::itemTId(face_type) == 1);
+    REQUIRE(ItemTypeId<2>::itemTId(edge_type) == 1);
     REQUIRE(ItemTypeId<2>::itemTId(node_type) == 2);
+
+    REQUIRE(ItemTypeId<2>::dimension(cell_type) == 2);
+    REQUIRE(ItemTypeId<2>::dimension(face_type) == 1);
+    REQUIRE(ItemTypeId<2>::dimension(edge_type) == 1);
+    REQUIRE(ItemTypeId<2>::dimension(node_type) == 0);
   }
 
   SECTION("checking for item ids in 3d")
   {
     REQUIRE(ItemTypeId<3>::itemTId(cell_type) == 0);
-    REQUIRE(ItemTypeId<3>::itemTId(edge_type) == 1);
-    REQUIRE(ItemTypeId<3>::itemTId(face_type) == 2);
+    REQUIRE(ItemTypeId<3>::itemTId(face_type) == 1);
+    REQUIRE(ItemTypeId<3>::itemTId(edge_type) == 2);
     REQUIRE(ItemTypeId<3>::itemTId(node_type) == 3);
+
+    REQUIRE(ItemTypeId<3>::dimension(cell_type) == 3);
+    REQUIRE(ItemTypeId<3>::dimension(face_type) == 2);
+    REQUIRE(ItemTypeId<3>::dimension(edge_type) == 1);
+    REQUIRE(ItemTypeId<3>::dimension(node_type) == 0);
   }
 }