diff --git a/src/utils/checkpointing/CheckpointUtils.cpp b/src/utils/checkpointing/CheckpointUtils.cpp
index 5fdeb7793276ee39e882ab1dbd85c1164cceaad9..8649a2f5d1564ecf951dbb8fdabf459a3f055b3a 100644
--- a/src/utils/checkpointing/CheckpointUtils.cpp
+++ b/src/utils/checkpointing/CheckpointUtils.cpp
@@ -434,6 +434,16 @@ writeIInterfaceDescriptor(const std::string& symbol_name,
   }
 }
 
+void writeItemArrayVariant(HighFive::Group& variable_group,
+                           std::shared_ptr<const ItemArrayVariant> item_array_variant_v,
+                           HighFive::File& file,
+                           HighFive::Group& checkpoint_group);
+
+void writeItemValueVariant(HighFive::Group& variable_group,
+                           std::shared_ptr<const ItemValueVariant> item_value_variant_v,
+                           HighFive::File& file,
+                           HighFive::Group& checkpoint_group);
+
 void
 writeINamedDiscreteData(const std::string& symbol_name,
                         const EmbeddedData& embedded_data,
@@ -465,15 +475,17 @@ writeINamedDiscreteData(const std::string& symbol_name,
   case INamedDiscreteData::Type::item_array: {
     const NamedItemArrayVariant& named_item_array_v = dynamic_cast<const NamedItemArrayVariant&>(inamed_discrete_data);
 
-    throw NotImplementedError("INamedDiscreteData::Type::item_array");
-#warning NOT IMPLEMENTED
+    HighFive::Group item_array_group = variable_group.createGroup("item_array_variant");
+
+    writeItemArrayVariant(item_array_group, named_item_array_v.itemArrayVariant(), file, checkpoint_group);
     break;
   }
   case INamedDiscreteData::Type::item_value: {
     const NamedItemValueVariant& named_item_value_v = dynamic_cast<const NamedItemValueVariant&>(inamed_discrete_data);
 
-    throw NotImplementedError("INamedDiscreteData::Type::item_value");
-#warning NOT IMPLEMENTED
+    HighFive::Group item_value_group = variable_group.createGroup("item_value_variant");
+
+    writeItemValueVariant(item_value_group, named_item_value_v.itemValueVariant(), file, checkpoint_group);
     break;
   }
   }
diff --git a/src/utils/checkpointing/ResumeUtils.cpp b/src/utils/checkpointing/ResumeUtils.cpp
index 15c557d678c127df6fc4fdace33ccb5a3749ed63..0b5c21f5bcc7aed622939908e54f7689af13de10 100644
--- a/src/utils/checkpointing/ResumeUtils.cpp
+++ b/src/utils/checkpointing/ResumeUtils.cpp
@@ -15,6 +15,8 @@
 #include <mesh/NumberedInterfaceDescriptor.hpp>
 #include <mesh/NumberedZoneDescriptor.hpp>
 #include <output/NamedDiscreteFunction.hpp>
+#include <output/NamedItemArrayVariant.hpp>
+#include <output/NamedItemValueVariant.hpp>
 #include <scheme/AxisBoundaryConditionDescriptor.hpp>
 #include <scheme/DirichletBoundaryConditionDescriptor.hpp>
 #include <scheme/DiscreteFunctionDescriptorP0.hpp>
@@ -41,6 +43,8 @@
 #include <utils/checkpointing/QuadratureTypeHFType.hpp>
 #include <utils/checkpointing/ResumingData.hpp>
 
+std::shared_ptr<ItemArrayVariant> readItemArrayVariant(const HighFive::Group& item_array_variant_group);
+std::shared_ptr<ItemValueVariant> readItemValueVariant(const HighFive::Group& item_value_variant_group);
 std::shared_ptr<DiscreteFunctionVariant> readDiscreteFunctionVariant(const HighFive::Group& discrete_function_group);
 
 template <typename T, ItemType item_type>
@@ -238,11 +242,13 @@ readINamedDiscreteData(const std::string& symbol_name, const HighFive::Group& sy
     break;
   }
   case INamedDiscreteData::Type::item_array: {
-    throw NotImplementedError("readINamedDiscreteData");
+    HighFive::Group item_array_group = inamed_discrete_data_group.getGroup("item_array_variant");
+    inamed_discrete_data = std::make_shared<const NamedItemArrayVariant>(readItemArrayVariant(item_array_group), name);
     break;
   }
   case INamedDiscreteData::Type::item_value: {
-    throw NotImplementedError("readINamedDiscreteData");
+    HighFive::Group item_value_group = inamed_discrete_data_group.getGroup("item_value_variant");
+    inamed_discrete_data = std::make_shared<const NamedItemValueVariant>(readItemValueVariant(item_value_group), name);
     break;
   }
   }
@@ -279,7 +285,7 @@ readIQuadratureDescriptor(const std::string& symbol_name, const HighFive::Group&
 }
 
 template <ItemType item_type>
-EmbeddedData
+std::shared_ptr<ItemArrayVariant>
 readItemArrayVariant(const HighFive::Group& item_array_variant_group)
 {
   const std::string data_type  = item_array_variant_group.getAttribute("data_type").read<std::string>();
@@ -322,43 +328,43 @@ readItemArrayVariant(const HighFive::Group& item_array_variant_group)
   } else {
     throw UnexpectedError("unexpected discrete function data type: " + data_type);
   }
-  return {std::make_shared<DataHandler<const ItemArrayVariant>>(p_item_array)};
+  return p_item_array;
 }
 
-EmbeddedData
+std::shared_ptr<ItemArrayVariant>
 readItemArrayVariant(const HighFive::Group& item_array_variant_group)
 {
   const ItemType item_type = item_array_variant_group.getAttribute("item_type").read<ItemType>();
 
-  EmbeddedData embedded_data;
+  std::shared_ptr<ItemArrayVariant> p_item_array;
 
   switch (item_type) {
   case ItemType::cell: {
-    embedded_data = readItemArrayVariant<ItemType::cell>(item_array_variant_group);
+    p_item_array = readItemArrayVariant<ItemType::cell>(item_array_variant_group);
     break;
   }
   case ItemType::face: {
-    embedded_data = readItemArrayVariant<ItemType::face>(item_array_variant_group);
+    p_item_array = readItemArrayVariant<ItemType::face>(item_array_variant_group);
     break;
   }
   case ItemType::edge: {
-    embedded_data = readItemArrayVariant<ItemType::edge>(item_array_variant_group);
+    p_item_array = readItemArrayVariant<ItemType::edge>(item_array_variant_group);
     break;
   }
   case ItemType::node: {
-    embedded_data = readItemArrayVariant<ItemType::node>(item_array_variant_group);
+    p_item_array = readItemArrayVariant<ItemType::node>(item_array_variant_group);
     break;
   }
   }
 
-  return embedded_data;
+  return p_item_array;
 }
 
 EmbeddedData
 readItemArrayVariant(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
 {
   const HighFive::Group item_array_variant_group = symbol_table_group.getGroup("embedded/" + symbol_name);
-  return readItemArrayVariant(item_array_variant_group);
+  return {std::make_shared<DataHandler<const ItemArrayVariant>>(readItemArrayVariant(item_array_variant_group))};
 }
 
 EmbeddedData
@@ -371,7 +377,7 @@ readItemType(const std::string& symbol_name, const HighFive::Group& symbol_table
 }
 
 template <ItemType item_type>
-EmbeddedData
+std::shared_ptr<ItemValueVariant>
 readItemValueVariant(const HighFive::Group& item_value_variant_group)
 {
   const std::string data_type  = item_value_variant_group.getAttribute("data_type").read<std::string>();
@@ -414,43 +420,43 @@ readItemValueVariant(const HighFive::Group& item_value_variant_group)
   } else {
     throw UnexpectedError("unexpected discrete function data type: " + data_type);
   }
-  return {std::make_shared<DataHandler<const ItemValueVariant>>(p_item_value)};
+  return p_item_value;
 }
 
-EmbeddedData
+std::shared_ptr<ItemValueVariant>
 readItemValueVariant(const HighFive::Group& item_value_variant_group)
 {
   const ItemType item_type = item_value_variant_group.getAttribute("item_type").read<ItemType>();
 
-  EmbeddedData embedded_data;
+  std::shared_ptr<ItemValueVariant> p_item_value;
 
   switch (item_type) {
   case ItemType::cell: {
-    embedded_data = readItemValueVariant<ItemType::cell>(item_value_variant_group);
+    p_item_value = readItemValueVariant<ItemType::cell>(item_value_variant_group);
     break;
   }
   case ItemType::face: {
-    embedded_data = readItemValueVariant<ItemType::face>(item_value_variant_group);
+    p_item_value = readItemValueVariant<ItemType::face>(item_value_variant_group);
     break;
   }
   case ItemType::edge: {
-    embedded_data = readItemValueVariant<ItemType::edge>(item_value_variant_group);
+    p_item_value = readItemValueVariant<ItemType::edge>(item_value_variant_group);
     break;
   }
   case ItemType::node: {
-    embedded_data = readItemValueVariant<ItemType::node>(item_value_variant_group);
+    p_item_value = readItemValueVariant<ItemType::node>(item_value_variant_group);
     break;
   }
   }
 
-  return embedded_data;
+  return p_item_value;
 }
 
 EmbeddedData
 readItemValueVariant(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
 {
   const HighFive::Group item_value_variant_group = symbol_table_group.getGroup("embedded/" + symbol_name);
-  return readItemValueVariant(item_value_variant_group);
+  return {std::make_shared<DataHandler<const ItemValueVariant>>(readItemValueVariant(item_value_variant_group))};
 }
 
 EmbeddedData