diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index 269ee24a496043123b7e2dcb295c8925ac3cce7f..5e1dc1b4da0860836f1e6e9b99ac6e2e293e0155 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -22,8 +22,6 @@
 #include <tuple>
 #include <algorithm>
 
-#include <IConnectivity.hpp>
-
 template <size_t Dimension>
 class Connectivity;
 
@@ -221,8 +219,7 @@ class ConnectivityFace<3>
 };
 
 template <size_t Dimension>
-class Connectivity final
-    : public IConnectivity
+class Connectivity
 {
  private:
   constexpr static auto& itemId = ItemId<Dimension>::itemId;
@@ -269,13 +266,18 @@ class Connectivity final
 
   CellValuePerNode<unsigned short> m_node_to_cell_local_node;
 
-  template <TypeOfItem SubItemType,
-            TypeOfItem ItemType>
-  const ConnectivityMatrix& itemToItemMatrix() const = delete;
+  template <TypeOfItem item_type_0,
+            TypeOfItem item_type_1>
+  const ConnectivityMatrix& itemToItemMatrix() const
+  {
+    const auto& item0_to_item1_matrix
+        = m_item_to_item_matrix[itemId(item_type_0)][itemId(item_type_1)];
+    return item0_to_item1_matrix;
+  };
 
   KOKKOS_INLINE_FUNCTION
   const ConnectivityMatrix& itemToItemMatrix(const TypeOfItem& item_type_0,
-                                             const TypeOfItem& item_type_1) const final;
+                                             const TypeOfItem& item_type_1) const;
 
 private:
   ConnectivityMatrix m_item_to_item_matrix[Dimension+1][Dimension+1];
@@ -415,241 +417,8 @@ private:
   }
 };
 
-
 using Connectivity3D = Connectivity<3>;
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<3>::itemToItemMatrix<TypeOfItem::cell,
-                                  TypeOfItem::face>() const
-{
-  const auto& cell_to_face_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)];
-  return cell_to_face_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<3>::itemToItemMatrix<TypeOfItem::cell,
-                                  TypeOfItem::node>() const
-{
-  const auto& cell_to_node_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)];
-
-  return cell_to_node_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<3>::itemToItemMatrix<TypeOfItem::face,
-                                  TypeOfItem::cell>() const
-{
-  const auto& face_to_cell_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
-
-  return face_to_cell_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<3>::itemToItemMatrix<TypeOfItem::face,
-                                  TypeOfItem::node>() const
-{
-  const auto& face_to_node_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
-  return face_to_node_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<3>::itemToItemMatrix<TypeOfItem::node,
-                                  TypeOfItem::cell>() const
-{
-  const auto& node_to_cell_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)];
-
-  return node_to_cell_matrix;
-}
-
-
 using Connectivity2D = Connectivity<2>;
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<2>::itemToItemMatrix<TypeOfItem::cell,
-                                  TypeOfItem::face>() const
-{
-  const auto& cell_to_face_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)];
-  return cell_to_face_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<2>::itemToItemMatrix<TypeOfItem::cell,
-                                  TypeOfItem::node>() const
-{
-  const auto& cell_to_node_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)];
-
-  return cell_to_node_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<2>::itemToItemMatrix<TypeOfItem::face,
-                                  TypeOfItem::cell>() const
-{
-  const auto& face_to_cell_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
-
-  return face_to_cell_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<2>::itemToItemMatrix<TypeOfItem::face,
-                                  TypeOfItem::node>() const
-{
-  const auto& face_to_node_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
-  return face_to_node_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<2>::itemToItemMatrix<TypeOfItem::node,
-                                  TypeOfItem::cell>() const
-{
-  const auto& node_to_cell_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)];
-
-  return node_to_cell_matrix;
-}
-
 using Connectivity1D = Connectivity<1>;
 
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<1>::itemToItemMatrix<TypeOfItem::cell,
-                                  TypeOfItem::node>() const
-{
-  const auto& cell_to_node_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)];
-
-  return cell_to_node_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<1>::itemToItemMatrix<TypeOfItem::cell,
-                                  TypeOfItem::face>() const
-{
-  const auto& cell_to_face_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)];
-  return cell_to_face_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<1>::itemToItemMatrix<TypeOfItem::face,
-                                  TypeOfItem::cell>() const
-{
-  const auto& face_to_cell_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
-
-  return face_to_cell_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<1>::itemToItemMatrix<TypeOfItem::face,
-                                  TypeOfItem::node>() const
-{
-#warning in 1d, faces and node are the same
-  const auto& face_to_node_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
-  return face_to_node_matrix;
-}
-
-template <>
-template <>
-inline const ConnectivityMatrix&
-Connectivity<1>::itemToItemMatrix<TypeOfItem::node,
-                                  TypeOfItem::cell>() const
-{
-  const auto& node_to_cell_matrix
-      = m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)];
-
-  return node_to_cell_matrix;
-}
-
-template <size_t Dimension>
-const ConnectivityMatrix&
-Connectivity<Dimension>::
-itemToItemMatrix(const TypeOfItem& item_type_0,
-                 const TypeOfItem& item_type_1) const
-{
-  switch (item_type_0) {
-    case TypeOfItem::cell: {
-      switch (item_type_1) {
-        case TypeOfItem::node: {
-          return itemToItemMatrix<TypeOfItem::cell, TypeOfItem::node>();
-        }
-        case TypeOfItem::face: {
-          return itemToItemMatrix<TypeOfItem::cell, TypeOfItem::face>();
-        }
-        default: {
-          std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_1) << "\n";
-          std::exit(1);
-        }
-      }
-    }
-    case TypeOfItem::face: {
-      switch (item_type_1) {
-        case TypeOfItem::cell: {
-          return itemToItemMatrix<TypeOfItem::face, TypeOfItem::cell>();
-        }
-        case TypeOfItem::node: {
-          return itemToItemMatrix<TypeOfItem::face, TypeOfItem::node>();
-        }
-        default: {
-          std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_1) << "\n";
-          std::exit(1);
-        }
-      }
-    }
-    case TypeOfItem::node: {
-      switch (item_type_1) {
-        case TypeOfItem::cell: {
-          return itemToItemMatrix<TypeOfItem::node, TypeOfItem::cell>();
-        }
-        default: {
-          std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_1) << "\n";
-          std::exit(1);
-        }
-      }
-    }
-    default: {
-      std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_0) << "\n";
-      std::exit(1);
-    }
-  }
-}
-
-
 #endif // CONNECTIVITY_HPP
diff --git a/src/mesh/ConnectivityUtils.hpp b/src/mesh/ConnectivityUtils.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..50b788a4e360a87f29df46b0d6335816ab189f90
--- /dev/null
+++ b/src/mesh/ConnectivityUtils.hpp
@@ -0,0 +1,15 @@
+#ifndef CONNECTIVITY_UTILS_HPP
+#define CONNECTIVITY_UTILS_HPP
+
+#include <TypeOfItem.hpp>
+#include <ConnectivityMatrix.hpp>
+
+template <TypeOfItem item_type_0,
+          TypeOfItem item_type_1,
+          typename ConnectivityType>
+const ConnectivityMatrix& getConnectivityMatrix(const ConnectivityType& connectivity)
+{
+  return connectivity.template itemToItemMatrix<item_type_0, item_type_1>();
+}
+
+#endif // CONNECTIVITY_UTILS_HPP
diff --git a/src/mesh/IConnectivity.hpp b/src/mesh/IConnectivity.hpp
deleted file mode 100644
index 6dc6ca4a2586f4fce344614f39c5bc82b69dd64c..0000000000000000000000000000000000000000
--- a/src/mesh/IConnectivity.hpp
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef ICONNECTIVITY_HPP
-#define ICONNECTIVITY_HPP
-
-#include <TypeOfItem.hpp>
-#include <ConnectivityMatrix.hpp>
-
-struct IConnectivity
-{
-  virtual const ConnectivityMatrix&
-  itemToItemMatrix(const TypeOfItem& item_type_0,
-                   const TypeOfItem& item_type_1) const = 0;
-
-  IConnectivity() = default;
-  IConnectivity(const IConnectivity&) = delete;
-  virtual ~IConnectivity() = default;
-};
-
-#endif // ICONNECTIVITY_HPP
diff --git a/src/mesh/SubItemValuePerItem.hpp b/src/mesh/SubItemValuePerItem.hpp
index a8016d0a5ee327797f18494b485ea77e9e009cf9..126c11f52b2f64f0b6cbee899578a581915836ba 100644
--- a/src/mesh/SubItemValuePerItem.hpp
+++ b/src/mesh/SubItemValuePerItem.hpp
@@ -6,7 +6,7 @@
 #include <PastisAssert.hpp>
 
 #include <ConnectivityMatrix.hpp>
-#include <IConnectivity.hpp>
+#include <ConnectivityUtils.hpp>
 
 template <typename DataType,
           TypeOfItem SubItemType,
@@ -130,10 +130,12 @@ class SubItemValuePerItem
 
   SubItemValuePerItem() = default;
 
-  SubItemValuePerItem(const IConnectivity& connectivity)
+  template <typename ConnectivityType>
+  SubItemValuePerItem(const ConnectivityType& connectivity)
   {
     ConnectivityMatrix connectivity_matrix
-        = connectivity.itemToItemMatrix(ItemType,SubItemType);
+        = getConnectivityMatrix<ItemType,SubItemType>(connectivity);
+
     m_host_row_map = connectivity_matrix.rowsMap();
     m_values = Kokkos::View<DataType*>("values", connectivity_matrix.numEntries());
   }