diff --git a/src/mesh/SubItemArrayPerItem.hpp b/src/mesh/SubItemArrayPerItem.hpp
index 7b204d2193aa6cdb450f7e8d8b23f91d0a47e2c3..e0bc1e611c10ccecb088c272c75d1d5e2c7d9d38 100644
--- a/src/mesh/SubItemArrayPerItem.hpp
+++ b/src/mesh/SubItemArrayPerItem.hpp
@@ -90,8 +90,14 @@ class SubItemArrayPerItem
     return m_values[m_host_row_map(size_t{item_id}) + i];
   }
 
-  // Following Kokkos logic, these classes are view and const view does allow
-  // changes in data
+  template <ItemType item_t>
+  Table<DataType>
+  operator[](const ItemIdT<item_t>& item_id) const noexcept(NO_ASSERT)
+  {
+    static_assert(item_t == item_type, "invalid ItemId type");
+    return this->itemTable(item_id);
+  }
+
   template <typename ArrayIndexType>
   Array<DataType>
   operator[](const ArrayIndexType& i) const noexcept(NO_ASSERT)
@@ -144,20 +150,6 @@ class SubItemArrayPerItem
     m_values.fill(data);
   }
 
-  template <typename IndexType>
-  PUGS_INLINE Table<DataType>
-  itemTable(IndexType item_id) noexcept(NO_ASSERT)
-  {
-    static_assert(std::is_same_v<IndexType, ItemId>, "index must be an ItemId");
-    Assert(this->isBuilt());
-    Assert(item_id < this->numberOfItems());
-    const auto& item_begin = m_host_row_map(size_t{item_id});
-    const auto& item_end   = m_host_row_map(size_t{item_id} + 1);
-    return subTable(m_values, item_begin, item_end - item_begin, 0, this->sizeOfArrays());
-  }
-
-  // Following Kokkos logic, these classes are view and const view does allow
-  // changes in data
   template <typename IndexType>
   PUGS_INLINE Table<DataType>
   itemTable(IndexType item_id) const noexcept(NO_ASSERT)
diff --git a/src/mesh/SubItemValuePerItem.hpp b/src/mesh/SubItemValuePerItem.hpp
index ea0e900681279b306ee82a9615e843650cfb1ea7..90ef57b2ca0221752a5890f0ede7f481a6fe4f70 100644
--- a/src/mesh/SubItemValuePerItem.hpp
+++ b/src/mesh/SubItemValuePerItem.hpp
@@ -88,8 +88,14 @@ class SubItemValuePerItem
     return m_values[m_host_row_map(size_t{item_id}) + i];
   }
 
-  // Following Kokkos logic, these classes are view and const view does allow
-  // changes in data
+  template <ItemType item_t>
+  Array<DataType>
+  operator[](const ItemIdT<item_t>& item_id) const noexcept(NO_ASSERT)
+  {
+    static_assert(item_t == item_type, "invalid ItemId type");
+    return this->itemArray(item_id);
+  }
+
   template <typename ArrayIndexType>
   DataType&
   operator[](const ArrayIndexType& i) const noexcept(NO_ASSERT)
@@ -137,21 +143,7 @@ class SubItemValuePerItem
 
   template <typename IndexType>
   PUGS_INLINE Array<DataType>
-  itemArray(IndexType item_id) noexcept(NO_ASSERT)
-  {
-    static_assert(std::is_same_v<IndexType, ItemId>, "index must be an ItemId");
-    Assert(this->isBuilt());
-    Assert(item_id < this->numberOfItems());
-    const auto& item_begin = m_host_row_map(size_t{item_id});
-    const auto& item_end   = m_host_row_map(size_t{item_id} + 1);
-    return subArray(m_values, item_begin, item_end - item_begin);
-  }
-
-  // Following Kokkos logic, these classes are view and const view does allow
-  // changes in data
-  template <typename IndexType>
-  PUGS_INLINE Array<DataType>
-  itemArray(IndexType item_id) const noexcept(NO_ASSERT)
+  itemArray(const IndexType& item_id) const noexcept(NO_ASSERT)
   {
     static_assert(std::is_same_v<IndexType, ItemId>, "index must be an ItemId");
     Assert(this->isBuilt());
diff --git a/tests/test_SubItemValuePerItem.cpp b/tests/test_SubItemValuePerItem.cpp
index dda38918acdb156f8a7c5de552d1f82319463c97..8b0e8c5f41a3c238135e5a0c88ce15236ad67b8f 100644
--- a/tests/test_SubItemValuePerItem.cpp
+++ b/tests/test_SubItemValuePerItem.cpp
@@ -517,6 +517,529 @@ TEST_CASE("SubItemValuePerItem", "[mesh]")
     }
   }
 
+  SECTION("access functions")
+  {
+    SECTION("1D")
+    {
+      std::array mesh_list = MeshDataBaseForTests::get().all1DMeshes();
+
+      for (auto named_mesh : mesh_list) {
+        SECTION(named_mesh.name())
+        {
+          auto mesh_1d = named_mesh.mesh();
+
+          const Connectivity<1>& connectivity = mesh_1d->connectivity();
+
+          SECTION("per cell")
+          {
+            {
+              NodeValuePerCell<int> node_value_per_cell{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
+                for (size_t i = 0; i < node_value_per_cell.numberOfSubValues(cell_id); ++i) {
+                  is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell.itemArray(cell_id)[i]));
+                  is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell(cell_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == node_value_per_cell.numberOfValues());
+            }
+
+            {
+              EdgeValuePerCell<int> edge_value_per_cell{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
+                for (size_t i = 0; i < edge_value_per_cell.numberOfSubValues(cell_id); ++i) {
+                  is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell.itemArray(cell_id)[i]));
+                  is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell(cell_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == edge_value_per_cell.numberOfValues());
+            }
+
+            {
+              FaceValuePerCell<int> face_value_per_cell{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
+                for (size_t i = 0; i < face_value_per_cell.numberOfSubValues(cell_id); ++i) {
+                  is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell.itemArray(cell_id)[i]));
+                  is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell(cell_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == face_value_per_cell.numberOfValues());
+            }
+          }
+
+          SECTION("per face")
+          {
+            CellValuePerFace<int> cell_value_per_face{connectivity};
+
+            bool is_valid  = true;
+            size_t counter = 0;
+            for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
+              for (size_t i = 0; i < cell_value_per_face.numberOfSubValues(face_id); ++i) {
+                is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face.itemArray(face_id)[i]));
+                is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face(face_id, i)));
+                counter++;
+              }
+            }
+            REQUIRE(is_valid);
+            REQUIRE(counter == cell_value_per_face.numberOfValues());
+          }
+
+          SECTION("per edge")
+          {
+            CellValuePerEdge<int> cell_value_per_edge{connectivity};
+
+            bool is_valid  = true;
+            size_t counter = 0;
+            for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
+              for (size_t i = 0; i < cell_value_per_edge.numberOfSubValues(edge_id); ++i) {
+                is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge.itemArray(edge_id)[i]));
+                is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge(edge_id, i)));
+                counter++;
+              }
+            }
+            REQUIRE(is_valid);
+            REQUIRE(counter == cell_value_per_edge.numberOfValues());
+          }
+
+          SECTION("per node")
+          {
+            CellValuePerNode<int> cell_value_per_node{connectivity};
+
+            bool is_valid  = true;
+            size_t counter = 0;
+            for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
+              for (size_t i = 0; i < cell_value_per_node.numberOfSubValues(node_id); ++i) {
+                is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node.itemArray(node_id)[i]));
+                is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node(node_id, i)));
+                counter++;
+              }
+            }
+            REQUIRE(is_valid);
+            REQUIRE(counter == cell_value_per_node.numberOfValues());
+          }
+        }
+      }
+    }
+
+    SECTION("2D")
+    {
+      std::array mesh_list = MeshDataBaseForTests::get().all2DMeshes();
+
+      for (auto named_mesh : mesh_list) {
+        SECTION(named_mesh.name())
+        {
+          auto mesh_2d = named_mesh.mesh();
+
+          const Connectivity<2>& connectivity = mesh_2d->connectivity();
+
+          SECTION("per cell")
+          {
+            {
+              NodeValuePerCell<int> node_value_per_cell{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
+                for (size_t i = 0; i < node_value_per_cell.numberOfSubValues(cell_id); ++i) {
+                  is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell.itemArray(cell_id)[i]));
+                  is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell(cell_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == node_value_per_cell.numberOfValues());
+            }
+
+            {
+              EdgeValuePerCell<int> edge_value_per_cell{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
+                for (size_t i = 0; i < edge_value_per_cell.numberOfSubValues(cell_id); ++i) {
+                  is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell.itemArray(cell_id)[i]));
+                  is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell(cell_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == edge_value_per_cell.numberOfValues());
+            }
+
+            {
+              FaceValuePerCell<int> face_value_per_cell{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
+                for (size_t i = 0; i < face_value_per_cell.numberOfSubValues(cell_id); ++i) {
+                  is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell.itemArray(cell_id)[i]));
+                  is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell(cell_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == face_value_per_cell.numberOfValues());
+            }
+          }
+
+          SECTION("per face")
+          {
+            {
+              NodeValuePerFace<int> node_value_per_face{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
+                for (size_t i = 0; i < node_value_per_face.numberOfSubValues(face_id); ++i) {
+                  is_valid &= (&(node_value_per_face[face_id][i]) == &(node_value_per_face.itemArray(face_id)[i]));
+                  is_valid &= (&(node_value_per_face[face_id][i]) == &(node_value_per_face(face_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == node_value_per_face.numberOfValues());
+            }
+
+            {
+              CellValuePerFace<int> cell_value_per_face{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
+                for (size_t i = 0; i < cell_value_per_face.numberOfSubValues(face_id); ++i) {
+                  is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face.itemArray(face_id)[i]));
+                  is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face(face_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == cell_value_per_face.numberOfValues());
+            }
+          }
+
+          SECTION("per edge")
+          {
+            {
+              NodeValuePerEdge<int> node_value_per_edge{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
+                for (size_t i = 0; i < node_value_per_edge.numberOfSubValues(edge_id); ++i) {
+                  is_valid &= (&(node_value_per_edge[edge_id][i]) == &(node_value_per_edge.itemArray(edge_id)[i]));
+                  is_valid &= (&(node_value_per_edge[edge_id][i]) == &(node_value_per_edge(edge_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == node_value_per_edge.numberOfValues());
+            }
+
+            {
+              CellValuePerEdge<int> cell_value_per_edge{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
+                for (size_t i = 0; i < cell_value_per_edge.numberOfSubValues(edge_id); ++i) {
+                  is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge.itemArray(edge_id)[i]));
+                  is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge(edge_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == cell_value_per_edge.numberOfValues());
+            }
+          }
+
+          SECTION("per node")
+          {
+            {
+              EdgeValuePerNode<int> edge_value_per_node{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
+                for (size_t i = 0; i < edge_value_per_node.numberOfSubValues(node_id); ++i) {
+                  is_valid &= (&(edge_value_per_node[node_id][i]) == &(edge_value_per_node.itemArray(node_id)[i]));
+                  is_valid &= (&(edge_value_per_node[node_id][i]) == &(edge_value_per_node(node_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == edge_value_per_node.numberOfValues());
+            }
+
+            {
+              FaceValuePerNode<int> face_value_per_node{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
+                for (size_t i = 0; i < face_value_per_node.numberOfSubValues(node_id); ++i) {
+                  is_valid &= (&(face_value_per_node[node_id][i]) == &(face_value_per_node.itemArray(node_id)[i]));
+                  is_valid &= (&(face_value_per_node[node_id][i]) == &(face_value_per_node(node_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == face_value_per_node.numberOfValues());
+            }
+
+            {
+              CellValuePerNode<int> cell_value_per_node{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
+                for (size_t i = 0; i < cell_value_per_node.numberOfSubValues(node_id); ++i) {
+                  is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node.itemArray(node_id)[i]));
+                  is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node(node_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == cell_value_per_node.numberOfValues());
+            }
+          }
+        }
+      }
+    }
+
+    SECTION("3D")
+    {
+      std::array mesh_list = MeshDataBaseForTests::get().all3DMeshes();
+
+      for (auto named_mesh : mesh_list) {
+        SECTION(named_mesh.name())
+        {
+          auto mesh_3d = named_mesh.mesh();
+
+          const Connectivity<3>& connectivity = mesh_3d->connectivity();
+
+          SECTION("per cell")
+          {
+            {
+              NodeValuePerCell<int> node_value_per_cell{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
+                for (size_t i = 0; i < node_value_per_cell.numberOfSubValues(cell_id); ++i) {
+                  is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell.itemArray(cell_id)[i]));
+                  is_valid &= (&(node_value_per_cell[cell_id][i]) == &(node_value_per_cell(cell_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == node_value_per_cell.numberOfValues());
+            }
+
+            {
+              EdgeValuePerCell<int> edge_value_per_cell{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
+                for (size_t i = 0; i < edge_value_per_cell.numberOfSubValues(cell_id); ++i) {
+                  is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell.itemArray(cell_id)[i]));
+                  is_valid &= (&(edge_value_per_cell[cell_id][i]) == &(edge_value_per_cell(cell_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == edge_value_per_cell.numberOfValues());
+            }
+
+            {
+              FaceValuePerCell<int> face_value_per_cell{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (CellId cell_id = 0; cell_id < connectivity.numberOfCells(); ++cell_id) {
+                for (size_t i = 0; i < face_value_per_cell.numberOfSubValues(cell_id); ++i) {
+                  is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell.itemArray(cell_id)[i]));
+                  is_valid &= (&(face_value_per_cell[cell_id][i]) == &(face_value_per_cell(cell_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == face_value_per_cell.numberOfValues());
+            }
+          }
+
+          SECTION("per face")
+          {
+            {
+              NodeValuePerFace<int> node_value_per_face{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
+                for (size_t i = 0; i < node_value_per_face.numberOfSubValues(face_id); ++i) {
+                  is_valid &= (&(node_value_per_face[face_id][i]) == &(node_value_per_face.itemArray(face_id)[i]));
+                  is_valid &= (&(node_value_per_face[face_id][i]) == &(node_value_per_face(face_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == node_value_per_face.numberOfValues());
+            }
+
+            {
+              EdgeValuePerFace<int> edge_value_per_face{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
+                for (size_t i = 0; i < edge_value_per_face.numberOfSubValues(face_id); ++i) {
+                  is_valid &= (&(edge_value_per_face[face_id][i]) == &(edge_value_per_face.itemArray(face_id)[i]));
+                  is_valid &= (&(edge_value_per_face[face_id][i]) == &(edge_value_per_face(face_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == edge_value_per_face.numberOfValues());
+            }
+
+            {
+              CellValuePerFace<int> cell_value_per_face{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (FaceId face_id = 0; face_id < connectivity.numberOfFaces(); ++face_id) {
+                for (size_t i = 0; i < cell_value_per_face.numberOfSubValues(face_id); ++i) {
+                  is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face.itemArray(face_id)[i]));
+                  is_valid &= (&(cell_value_per_face[face_id][i]) == &(cell_value_per_face(face_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == cell_value_per_face.numberOfValues());
+            }
+          }
+
+          SECTION("per edge")
+          {
+            {
+              NodeValuePerEdge<int> node_value_per_edge{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
+                for (size_t i = 0; i < node_value_per_edge.numberOfSubValues(edge_id); ++i) {
+                  is_valid &= (&(node_value_per_edge[edge_id][i]) == &(node_value_per_edge.itemArray(edge_id)[i]));
+                  is_valid &= (&(node_value_per_edge[edge_id][i]) == &(node_value_per_edge(edge_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == node_value_per_edge.numberOfValues());
+            }
+
+            {
+              FaceValuePerEdge<int> face_value_per_edge{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
+                for (size_t i = 0; i < face_value_per_edge.numberOfSubValues(edge_id); ++i) {
+                  is_valid &= (&(face_value_per_edge[edge_id][i]) == &(face_value_per_edge.itemArray(edge_id)[i]));
+                  is_valid &= (&(face_value_per_edge[edge_id][i]) == &(face_value_per_edge(edge_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == face_value_per_edge.numberOfValues());
+            }
+
+            {
+              CellValuePerEdge<int> cell_value_per_edge{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (EdgeId edge_id = 0; edge_id < connectivity.numberOfEdges(); ++edge_id) {
+                for (size_t i = 0; i < cell_value_per_edge.numberOfSubValues(edge_id); ++i) {
+                  is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge.itemArray(edge_id)[i]));
+                  is_valid &= (&(cell_value_per_edge[edge_id][i]) == &(cell_value_per_edge(edge_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == cell_value_per_edge.numberOfValues());
+            }
+          }
+
+          SECTION("per node")
+          {
+            {
+              EdgeValuePerNode<int> edge_value_per_node{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
+                for (size_t i = 0; i < edge_value_per_node.numberOfSubValues(node_id); ++i) {
+                  is_valid &= (&(edge_value_per_node[node_id][i]) == &(edge_value_per_node.itemArray(node_id)[i]));
+                  is_valid &= (&(edge_value_per_node[node_id][i]) == &(edge_value_per_node(node_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == edge_value_per_node.numberOfValues());
+            }
+
+            {
+              FaceValuePerNode<int> face_value_per_node{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
+                for (size_t i = 0; i < face_value_per_node.numberOfSubValues(node_id); ++i) {
+                  is_valid &= (&(face_value_per_node[node_id][i]) == &(face_value_per_node.itemArray(node_id)[i]));
+                  is_valid &= (&(face_value_per_node[node_id][i]) == &(face_value_per_node(node_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == face_value_per_node.numberOfValues());
+            }
+
+            {
+              CellValuePerNode<int> cell_value_per_node{connectivity};
+
+              bool is_valid  = true;
+              size_t counter = 0;
+              for (NodeId node_id = 0; node_id < connectivity.numberOfNodes(); ++node_id) {
+                for (size_t i = 0; i < cell_value_per_node.numberOfSubValues(node_id); ++i) {
+                  is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node.itemArray(node_id)[i]));
+                  is_valid &= (&(cell_value_per_node[node_id][i]) == &(cell_value_per_node(node_id, i)));
+                  counter++;
+                }
+              }
+              REQUIRE(is_valid);
+              REQUIRE(counter == cell_value_per_node.numberOfValues());
+            }
+          }
+        }
+      }
+    }
+  }
+
   SECTION("array view")
   {
     SECTION("1D")
@@ -791,6 +1314,7 @@ TEST_CASE("SubItemValuePerItem", "[mesh]")
       CellValuePerNode<int> cell_value_per_node;
       REQUIRE_THROWS_AS(cell_value_per_node[0], AssertError);
       REQUIRE_THROWS_AS(cell_value_per_node.itemArray(NodeId{0}), AssertError);
+      REQUIRE_THROWS_AS(cell_value_per_node[NodeId{0}], AssertError);
       REQUIRE_THROWS_AS(cell_value_per_node(NodeId{0}, 0), AssertError);
       REQUIRE_THROWS_AS(cell_value_per_node.numberOfValues(), AssertError);
       REQUIRE_THROWS_AS(cell_value_per_node.numberOfItems(), AssertError);
@@ -799,6 +1323,7 @@ TEST_CASE("SubItemValuePerItem", "[mesh]")
       FaceValuePerCell<int> face_value_per_cell;
       REQUIRE_THROWS_AS(face_value_per_cell[0], AssertError);
       REQUIRE_THROWS_AS(face_value_per_cell.itemArray(CellId{0}), AssertError);
+      REQUIRE_THROWS_AS(face_value_per_cell[CellId{0}], AssertError);
       REQUIRE_THROWS_AS(face_value_per_cell(CellId{0}, 0), AssertError);
       REQUIRE_THROWS_AS(face_value_per_cell.numberOfValues(), AssertError);
       REQUIRE_THROWS_AS(face_value_per_cell.numberOfItems(), AssertError);
@@ -807,6 +1332,7 @@ TEST_CASE("SubItemValuePerItem", "[mesh]")
       CellValuePerEdge<int> cell_value_per_edge;
       REQUIRE_THROWS_AS(cell_value_per_edge[0], AssertError);
       REQUIRE_THROWS_AS(cell_value_per_edge.itemArray(EdgeId{0}), AssertError);
+      REQUIRE_THROWS_AS(cell_value_per_edge[EdgeId{0}], AssertError);
       REQUIRE_THROWS_AS(cell_value_per_edge(EdgeId{0}, 0), AssertError);
       REQUIRE_THROWS_AS(cell_value_per_edge.numberOfValues(), AssertError);
       REQUIRE_THROWS_AS(cell_value_per_edge.numberOfItems(), AssertError);
@@ -815,6 +1341,7 @@ TEST_CASE("SubItemValuePerItem", "[mesh]")
       NodeValuePerFace<int> node_value_per_face;
       REQUIRE_THROWS_AS(node_value_per_face[0], AssertError);
       REQUIRE_THROWS_AS(node_value_per_face.itemArray(FaceId{0}), AssertError);
+      REQUIRE_THROWS_AS(node_value_per_face[FaceId{0}], AssertError);
       REQUIRE_THROWS_AS(node_value_per_face(FaceId{0}, 0), AssertError);
       REQUIRE_THROWS_AS(node_value_per_face.numberOfValues(), AssertError);
       REQUIRE_THROWS_AS(node_value_per_face.numberOfItems(), AssertError);
@@ -843,6 +1370,7 @@ TEST_CASE("SubItemValuePerItem", "[mesh]")
             REQUIRE_THROWS_AS(cell_value_per_face(face_id, cell_values.size()), AssertError);
             REQUIRE_THROWS_AS(cell_values[cell_values.size()], AssertError);
             REQUIRE_THROWS_AS(cell_value_per_face.itemArray(face_id)[cell_values.size()] = 2, AssertError);
+            REQUIRE_THROWS_AS(cell_value_per_face[face_id][cell_values.size()] = 2, AssertError);
           }
 
           FaceValuePerNode<int> face_value_per_node{connectivity};
@@ -856,6 +1384,7 @@ TEST_CASE("SubItemValuePerItem", "[mesh]")
             REQUIRE_THROWS_AS(face_value_per_node(node_id, face_values.size()), AssertError);
             REQUIRE_THROWS_AS(face_values[face_values.size()], AssertError);
             REQUIRE_THROWS_AS(face_value_per_node.itemArray(node_id)[face_values.size()] = 2, AssertError);
+            REQUIRE_THROWS_AS(face_value_per_node[node_id][face_values.size()] = 2, AssertError);
           }
 
           EdgeValuePerCell<int> edge_value_per_cell{connectivity};
@@ -869,6 +1398,7 @@ TEST_CASE("SubItemValuePerItem", "[mesh]")
             REQUIRE_THROWS_AS(edge_value_per_cell(cell_id, edge_values.size()), AssertError);
             REQUIRE_THROWS_AS(edge_values[edge_values.size()], AssertError);
             REQUIRE_THROWS_AS(edge_value_per_cell.itemArray(cell_id)[edge_values.size()] = 2, AssertError);
+            REQUIRE_THROWS_AS(edge_value_per_cell[cell_id][edge_values.size()] = 2, AssertError);
           }
 
           NodeValuePerEdge<int> node_value_per_edge{connectivity};
@@ -882,6 +1412,7 @@ TEST_CASE("SubItemValuePerItem", "[mesh]")
             REQUIRE_THROWS_AS(node_value_per_edge(edge_id, node_values.size()), AssertError);
             REQUIRE_THROWS_AS(node_values[node_values.size()], AssertError);
             REQUIRE_THROWS_AS(node_value_per_edge.itemArray(edge_id)[node_values.size()] = 2, AssertError);
+            REQUIRE_THROWS_AS(node_value_per_edge[edge_id][node_values.size()] = 2, AssertError);
           }
         }
       }