diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index f0e250c4d2aa2e3de12c6132640086e657231e94..f1e8c9f2dcc9e883987fde4fc69baed16971dbd0 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -134,42 +134,42 @@ class Connectivity final : public IConnectivity
 
  public:
   PUGS_INLINE
-  const auto&
+  CellValue<const CellType>
   cellType() const
   {
     return m_cell_type;
   }
 
   PUGS_INLINE
-  const auto&
+  CellValue<const int>
   cellNumber() const
   {
     return m_cell_number;
   }
 
   PUGS_INLINE
-  const auto&
+  FaceValue<const int>
   faceNumber() const
   {
     return m_face_number;
   }
 
   PUGS_INLINE
-  const auto&
+  EdgeValue<const int>
   edgeNumber() const
   {
     return m_edge_number;
   }
 
   PUGS_INLINE
-  const auto&
+  NodeValue<const int>
   nodeNumber() const
   {
     return m_node_number;
   }
 
   template <ItemType item_type>
-  PUGS_INLINE const auto&
+  PUGS_INLINE auto
   number() const
   {
     if constexpr (item_type == ItemType::cell) {
@@ -186,28 +186,28 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  const auto&
+  CellValue<const int>
   cellOwner() const
   {
     return m_cell_owner;
   }
 
   PUGS_INLINE
-  const auto&
+  FaceValue<const int>
   faceOwner() const
   {
     return m_face_owner;
   }
 
   PUGS_INLINE
-  const auto&
+  EdgeValue<const int>
   edgeOwner() const
   {
     return m_edge_owner;
   }
 
   PUGS_INLINE
-  const auto&
+  NodeValue<const int>
   nodeOwner() const
   {
     return m_node_owner;
@@ -231,35 +231,35 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  const auto&
+  CellValue<const bool>
   cellIsOwned() const
   {
     return m_cell_is_owned;
   }
 
   PUGS_INLINE
-  const auto&
+  FaceValue<const bool>
   faceIsOwned() const
   {
     return m_face_is_owned;
   }
 
   PUGS_INLINE
-  const auto&
+  EdgeValue<const bool>
   edgeIsOwned() const
   {
     return m_edge_is_owned;
   }
 
   PUGS_INLINE
-  const auto&
+  NodeValue<const bool>
   nodeIsOwned() const
   {
     return m_node_is_owned;
   }
 
   template <ItemType item_type>
-  PUGS_INLINE const auto&
+  PUGS_INLINE auto
   isOwned() const
   {
     if constexpr (item_type == ItemType::cell) {
@@ -276,7 +276,7 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  const auto&
+  FaceValue<const bool>
   isBoundaryFace() const
   {
     if (not m_is_boundary_face.isBuilt()) {
@@ -286,7 +286,7 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  const auto&
+  EdgeValue<const bool>
   isBoundaryEdge() const
   {
     if (not m_is_boundary_edge.isBuilt()) {
@@ -296,7 +296,7 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  const auto&
+  NodeValue<const bool>
   isBoundaryNode() const
   {
     if (not m_is_boundary_node.isBuilt()) {
@@ -306,7 +306,7 @@ class Connectivity final : public IConnectivity
   }
 
   template <ItemType item_type>
-  PUGS_INLINE const auto&
+  PUGS_INLINE auto
   isBoundary() const
   {
     if constexpr (item_type == ItemType::face) {
@@ -328,43 +328,44 @@ class Connectivity final : public IConnectivity
     const ConnectivityMatrix& connectivity_matrix = m_item_to_item_matrix[itemTId(item_type_0)][itemTId(item_type_1)];
     return connectivity_matrix.isBuilt();
   }
+
   template <ItemType source_item_type, ItemType target_item_type>
-  PUGS_INLINE auto
+  PUGS_INLINE ItemToItemMatrix<source_item_type, target_item_type>
   getItemToItemMatrix() const
   {
     return ItemToItemMatrix<source_item_type, target_item_type>(_getMatrix(source_item_type, target_item_type));
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::cell, ItemType::face>
   cellToFaceMatrix() const
   {
     return this->template getItemToItemMatrix<ItemType::cell, ItemType::face>();
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::cell, ItemType::edge>
   cellToEdgeMatrix() const
   {
     return this->template getItemToItemMatrix<ItemType::cell, ItemType::edge>();
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::cell, ItemType::node>
   cellToNodeMatrix() const
   {
     return this->template getItemToItemMatrix<ItemType::cell, ItemType::node>();
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::face, ItemType::cell>
   faceToCellMatrix() const
   {
     return this->template getItemToItemMatrix<ItemType::face, ItemType::cell>();
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::face, ItemType::edge>
   faceToEdgeMatrix() const
   {
     static_assert(Dimension > 2, "face to edge matrix makes sense in dimension > 2");
@@ -372,7 +373,7 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::face, ItemType::node>
   faceToNodeMatrix() const
   {
     static_assert(Dimension > 1, "face to node matrix makes sense in dimension > 1");
@@ -380,14 +381,14 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::edge, ItemType::cell>
   edgeToCellMatrix() const
   {
     return this->template getItemToItemMatrix<ItemType::edge, ItemType::cell>();
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::edge, ItemType::face>
   edgeToFaceMatrix() const
   {
     static_assert(Dimension > 2, "edge to face matrix makes sense in dimension > 2");
@@ -395,7 +396,7 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::edge, ItemType::node>
   edgeToNodeMatrix() const
   {
     static_assert(Dimension > 1, "edge to node matrix makes sense in dimension > 1");
@@ -403,14 +404,14 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::node, ItemType::cell>
   nodeToCellMatrix() const
   {
     return this->template getItemToItemMatrix<ItemType::node, ItemType::cell>();
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::node, ItemType::face>
   nodeToFaceMatrix() const
   {
     static_assert(Dimension > 1, "node to face matrix makes sense in dimension > 1");
@@ -418,7 +419,7 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  auto
+  ItemToItemMatrix<ItemType::node, ItemType::edge>
   nodeToEdgeMatrix() const
   {
     static_assert(Dimension > 1, "node to edge matrix makes sense in dimension > 1");
@@ -426,7 +427,7 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  const auto&
+  FaceValuePerCell<const bool>
   cellFaceIsReversed() const
   {
     static_assert(Dimension > 1, "reversed faces makes no sense in dimension 1");
@@ -434,7 +435,7 @@ class Connectivity final : public IConnectivity
   }
 
   PUGS_INLINE
-  const auto&
+  EdgeValuePerFace<const bool>
   faceEdgeIsReversed() const
   {
     static_assert(Dimension > 2, "reversed edges makes no sense in dimension 1 or 2");