diff --git a/src/language/modules/MeshModule.cpp b/src/language/modules/MeshModule.cpp
index e3464e3753b9c07380d5ee38679bc788502f79c4..395400f28ae73ee34af06c2769b414ebf93bdafa 100644
--- a/src/language/modules/MeshModule.cpp
+++ b/src/language/modules/MeshModule.cpp
@@ -364,4 +364,17 @@ MeshModule::registerCheckpointResume() const
                          }),
                          std::function([](const std::string& symbol_name, const HighFive::Group& symbol_table_group)
                                          -> EmbeddedData { return readItemType(symbol_name, symbol_table_group); }));
+
+  CheckpointResumeRepository::instance()
+    .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const ItemValueVariant>>,
+                         std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data,
+                                          HighFive::File& file, HighFive::Group& checkpoint_group,
+                                          HighFive::Group& symbol_table_group) {
+                           writeItemValueVariant(symbol_name, embedded_data, file, checkpoint_group,
+                                                 symbol_table_group);
+                         }),
+                         std::function([](const std::string& symbol_name,
+                                          const HighFive::Group& symbol_table_group) -> EmbeddedData {
+                           return readItemValueVariant(symbol_name, symbol_table_group);
+                         }));
 }
diff --git a/src/language/modules/WriterModule.cpp b/src/language/modules/WriterModule.cpp
index ad48be7f92fd73614af8d0ba7e21697729f07520..fbfcbfd62f6aec2213b0c005b6cc0f4f58412ce3 100644
--- a/src/language/modules/WriterModule.cpp
+++ b/src/language/modules/WriterModule.cpp
@@ -1,6 +1,9 @@
 #include <language/modules/WriterModule.hpp>
 
+#include <language/modules/MeshModule.hpp>
+#include <language/modules/SchemeModule.hpp>
 #include <language/utils/BuiltinFunctionEmbedder.hpp>
+#include <language/utils/CheckpointResumeRepository.hpp>
 #include <language/utils/TypeDescriptor.hpp>
 #include <mesh/Connectivity.hpp>
 #include <mesh/GmshReader.hpp>
@@ -15,9 +18,8 @@
 #include <output/NamedItemValueVariant.hpp>
 #include <output/VTKWriter.hpp>
 #include <scheme/DiscreteFunctionVariant.hpp>
-
-#include <language/modules/MeshModule.hpp>
-#include <language/modules/SchemeModule.hpp>
+#include <utils/checkpointing/CheckpointUtils.hpp>
+#include <utils/checkpointing/ResumeUtils.hpp>
 
 WriterModule::WriterModule()
 {
@@ -189,5 +191,16 @@ WriterModule::registerOperators() const
 void
 WriterModule::registerCheckpointResume() const
 {
-  throw NotImplementedError("registerCheckpointResume()");
+  CheckpointResumeRepository::instance()
+    .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const INamedDiscreteData>>,
+                         std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data,
+                                          HighFive::File& file, HighFive::Group& checkpoint_group,
+                                          HighFive::Group& symbol_table_group) {
+                           writeINamedDiscreteData(symbol_name, embedded_data, file, checkpoint_group,
+                                                   symbol_table_group);
+                         }),
+                         std::function([](const std::string& symbol_name,
+                                          const HighFive::Group& symbol_table_group) -> EmbeddedData {
+                           return readINamedDiscreteData(symbol_name, symbol_table_group);
+                         }));
 }
diff --git a/src/utils/checkpointing/CheckpointUtils.cpp b/src/utils/checkpointing/CheckpointUtils.cpp
index 4d77a25fa58ec05042dd1892981b56a1b6510328..bb370b7fa7e7f84debbf3a730eaa0fb64ffe4e48 100644
--- a/src/utils/checkpointing/CheckpointUtils.cpp
+++ b/src/utils/checkpointing/CheckpointUtils.cpp
@@ -3,11 +3,13 @@
 #include <analysis/IQuadratureDescriptor.hpp>
 #include <language/modules/MeshModuleTypes.hpp>
 #include <language/modules/SchemeModuleTypes.hpp>
+#include <language/modules/WriterModuleTypes.hpp>
 #include <language/utils/ASTNodeDataTypeTraits.hpp>
 #include <language/utils/DataHandler.hpp>
 #include <language/utils/OFStream.hpp>
 #include <language/utils/OStream.hpp>
 #include <mesh/ItemType.hpp>
+#include <mesh/ItemValueVariant.hpp>
 #include <mesh/Mesh.hpp>
 #include <mesh/MeshVariant.hpp>
 #include <mesh/NamedBoundaryDescriptor.hpp>
@@ -16,6 +18,10 @@
 #include <mesh/NumberedBoundaryDescriptor.hpp>
 #include <mesh/NumberedInterfaceDescriptor.hpp>
 #include <mesh/NumberedZoneDescriptor.hpp>
+#include <output/INamedDiscreteData.hpp>
+#include <output/NamedDiscreteFunction.hpp>
+#include <output/NamedItemArrayVariant.hpp>
+#include <output/NamedItemValueVariant.hpp>
 #include <scheme/DiscreteFunctionP0.hpp>
 #include <scheme/DiscreteFunctionP0Vector.hpp>
 #include <scheme/DiscreteFunctionVariant.hpp>
@@ -24,6 +30,7 @@
 #include <utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp>
 #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp>
 #include <utils/checkpointing/IInterfaceDescriptorHFType.hpp>
+#include <utils/checkpointing/INamedDiscreteDataHF.hpp>
 #include <utils/checkpointing/IZoneDescriptorHFType.hpp>
 #include <utils/checkpointing/ItemTypeHFType.hpp>
 #include <utils/checkpointing/OStreamTypeHFType.hpp>
@@ -41,6 +48,26 @@
 #include <scheme/OutflowBoundaryConditionDescriptor.hpp>
 #include <scheme/SymmetryBoundaryConditionDescriptor.hpp>
 
+void writeMesh(std::shared_ptr<const MeshVariant> mesh_v, HighFive::File& file, HighFive::Group& checkpoint_group);
+
+template <typename DataType, ItemType item_type, typename ConnectivityPtr>
+void
+write(HighFive::Group& group,
+      const std::string& name,
+      const ItemValue<DataType, item_type, ConnectivityPtr>& item_value)
+{
+  write(group, name, item_value.arrayView());
+}
+
+template <typename DataType, ItemType item_type, typename ConnectivityPtr>
+void
+write(HighFive::Group& group,
+      const std::string& name,
+      const ItemArray<DataType, item_type, ConnectivityPtr>& item_array)
+{
+  write(group, name, item_array.tableView());
+}
+
 template <ItemType item_type, size_t Dimension>
 void
 writeRefItemList(const Connectivity<Dimension>& connectivity, HighFive::Group& connectivity_group)
@@ -157,6 +184,72 @@ writeConnectivity(const Connectivity<Dimension>& connectivity, HighFive::File& f
   }
 }
 
+void
+writeConnectivity(const IConnectivity& connectivity, HighFive::File& file, HighFive::Group& checkpoint_group)
+{
+  switch (connectivity.dimension()) {
+  case 1: {
+    writeConnectivity(dynamic_cast<const Connectivity<1>&>(connectivity), file, checkpoint_group);
+    break;
+  }
+  case 2: {
+    writeConnectivity(dynamic_cast<const Connectivity<2>&>(connectivity), file, checkpoint_group);
+    break;
+  }
+  case 3: {
+    writeConnectivity(dynamic_cast<const Connectivity<3>&>(connectivity), file, checkpoint_group);
+    break;
+  }
+  default: {
+    throw UnexpectedError("invalid connectivity dimension");
+  }
+  }
+}
+
+void
+writeDiscreteFunctionVariant(HighFive::Group& variable_group,
+                             std::shared_ptr<const DiscreteFunctionVariant> discrete_function_v,
+                             HighFive::File& file,
+                             HighFive::Group& checkpoint_group)
+{
+  variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(discrete_function_v)>));
+
+  std::visit(
+    [&](auto&& discrete_function) {
+      auto mesh_v  = discrete_function.meshVariant();
+      using DFType = std::decay_t<decltype(discrete_function)>;
+      variable_group.createAttribute("Vh_type", discrete_function.descriptor().type());
+
+      variable_group.createAttribute("mesh_id", mesh_v->id());
+      writeMesh(mesh_v, file, checkpoint_group);
+      if constexpr (is_discrete_function_P0_v<DFType>) {
+        using data_type = std::decay_t<typename DFType::data_type>;
+        variable_group.createAttribute("data_type", dataTypeName(ast_node_data_type_from<data_type>));
+        write(variable_group, "values", discrete_function.cellValues());
+      } else if constexpr (is_discrete_function_P0_vector_v<DFType>) {
+        using data_type = std::decay_t<typename DFType::data_type>;
+        variable_group.createAttribute("data_type", dataTypeName(ast_node_data_type_from<data_type>));
+        write(variable_group, "values", discrete_function.cellArrays());
+      }
+    },
+    discrete_function_v->discreteFunction());
+}
+
+void
+writeDiscreteFunctionVariant(const std::string& symbol_name,
+                             const EmbeddedData& embedded_data,
+                             HighFive::File& file,
+                             HighFive::Group& checkpoint_group,
+                             HighFive::Group& symbol_table_group)
+{
+  HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name);
+
+  std::shared_ptr<const DiscreteFunctionVariant> discrete_function_p =
+    dynamic_cast<const DataHandler<const DiscreteFunctionVariant>&>(embedded_data.get()).data_ptr();
+
+  writeDiscreteFunctionVariant(variable_group, discrete_function_p, file, checkpoint_group);
+}
+
 void
 writeIBoundaryDescriptor(HighFive::Group& variable_group, const IBoundaryDescriptor& iboundary_descriptor)
 {
@@ -340,6 +433,51 @@ writeIInterfaceDescriptor(const std::string& symbol_name,
   }
 }
 
+void
+writeINamedDiscreteData(const std::string& symbol_name,
+                        const EmbeddedData& embedded_data,
+                        HighFive::File& file,
+                        HighFive::Group& checkpoint_group,
+                        HighFive::Group& symbol_table_group)
+{
+  HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name);
+
+  std::shared_ptr<const INamedDiscreteData> inamed_discrete_data_p =
+    dynamic_cast<const DataHandler<const INamedDiscreteData>&>(embedded_data.get()).data_ptr();
+
+  const INamedDiscreteData& inamed_discrete_data = *inamed_discrete_data_p;
+
+  variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(inamed_discrete_data_p)>));
+  variable_group.createAttribute("named_discrete_data_type", inamed_discrete_data.type());
+  variable_group.createAttribute("named_discrete_data_name", inamed_discrete_data.name());
+
+  switch (inamed_discrete_data.type()) {
+  case INamedDiscreteData::Type::discrete_function: {
+    const NamedDiscreteFunction& named_discrete_function =
+      dynamic_cast<const NamedDiscreteFunction&>(inamed_discrete_data);
+
+    HighFive::Group discrete_function_group = variable_group.createGroup("discrete_function_variant");
+    writeDiscreteFunctionVariant(discrete_function_group, named_discrete_function.discreteFunctionVariant(), file,
+                                 checkpoint_group);
+    break;
+  }
+  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
+    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
+    break;
+  }
+  }
+}
+
 void
 writeIQuadratureDescriptor(const std::string& symbol_name,
                            const EmbeddedData& embedded_data,
@@ -377,6 +515,46 @@ writeItemType(const std::string& symbol_name,
   variable_group.createAttribute("item_type", item_type);
 }
 
+void
+writeItemValueVariant(HighFive::Group& variable_group,
+                      std::shared_ptr<const ItemValueVariant> item_value_variant_v,
+                      HighFive::File& file,
+                      HighFive::Group& checkpoint_group)
+{
+  variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(item_value_variant_v)>));
+
+  std::visit(
+    [&](auto&& item_value) {
+      using ItemValueT = std::decay_t<decltype(item_value)>;
+
+      variable_group.createAttribute("item_type", ItemValueT::item_t);
+      using data_type = std::decay_t<typename ItemValueT::data_type>;
+      variable_group.createAttribute("data_type", dataTypeName(ast_node_data_type_from<data_type>));
+
+      const IConnectivity& connectivity = *item_value.connectivity_ptr();
+      variable_group.createAttribute("connectivity_id", connectivity.id());
+      writeConnectivity(connectivity, file, checkpoint_group);
+
+      write(variable_group, "values", item_value);
+    },
+    item_value_variant_v->itemValue());
+}
+
+void
+writeItemValueVariant(const std::string& symbol_name,
+                      const EmbeddedData& embedded_data,
+                      HighFive::File& file,
+                      HighFive::Group& checkpoint_group,
+                      HighFive::Group& symbol_table_group)
+{
+  HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name);
+
+  std::shared_ptr<const ItemValueVariant> item_value_variant_p =
+    dynamic_cast<const DataHandler<const ItemValueVariant>&>(embedded_data.get()).data_ptr();
+
+  writeItemValueVariant(variable_group, item_value_variant_p, file, checkpoint_group);
+}
+
 void
 writeIZoneDescriptor(const std::string& symbol_name,
                      const EmbeddedData& embedded_data,
@@ -470,41 +648,6 @@ writeMesh(const std::string& symbol_name,
   writeMesh(mesh_v, file, checkpoint_group);
 }
 
-void
-writeDiscreteFunctionVariant(const std::string& symbol_name,
-                             const EmbeddedData& embedded_data,
-                             HighFive::File& file,
-                             HighFive::Group& checkpoint_group,
-                             HighFive::Group& symbol_table_group)
-{
-  HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name);
-
-  std::shared_ptr<const DiscreteFunctionVariant> discrete_function_v =
-    dynamic_cast<const DataHandler<const DiscreteFunctionVariant>&>(embedded_data.get()).data_ptr();
-
-  variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(discrete_function_v)>));
-
-  std::visit(
-    [&](auto&& discrete_function) {
-      auto mesh_v  = discrete_function.meshVariant();
-      using DFType = std::decay_t<decltype(discrete_function)>;
-      variable_group.createAttribute("Vh_type", discrete_function.descriptor().type());
-
-      variable_group.createAttribute("mesh_id", mesh_v->id());
-      writeMesh(mesh_v, file, checkpoint_group);
-      if constexpr (is_discrete_function_P0_v<DFType>) {
-        using data_type = std::decay_t<typename DFType::data_type>;
-        variable_group.createAttribute("data_type", dataTypeName(ast_node_data_type_from<data_type>));
-        write(variable_group, "values", discrete_function.cellValues());
-      } else if constexpr (is_discrete_function_P0_vector_v<DFType>) {
-        using data_type = std::decay_t<typename DFType::data_type>;
-        variable_group.createAttribute("data_type", dataTypeName(ast_node_data_type_from<data_type>));
-        write(variable_group, "values", discrete_function.cellArrays());
-      }
-    },
-    discrete_function_v->discreteFunction());
-}
-
 void
 writeOStream(const std::string& symbol_name,
              const EmbeddedData& embedded_data,
diff --git a/src/utils/checkpointing/CheckpointUtils.hpp b/src/utils/checkpointing/CheckpointUtils.hpp
index 491d95386fa982c4f51c03e5160933f5fe3f8270..7edee7b2c6b361249da4946acc900f19fdbba12e 100644
--- a/src/utils/checkpointing/CheckpointUtils.hpp
+++ b/src/utils/checkpointing/CheckpointUtils.hpp
@@ -104,22 +104,14 @@ write(HighFive::Group& group, const std::string& name, const Table<DataType>& ta
 }
 
 template <typename DataType, ItemType item_type, typename ConnectivityPtr>
-PUGS_INLINE void
-write(HighFive::Group& group,
-      const std::string& name,
-      const ItemValue<DataType, item_type, ConnectivityPtr>& item_value)
-{
-  write(group, name, item_value.arrayView());
-}
+void write(HighFive::Group& group,
+           const std::string& name,
+           const ItemValue<DataType, item_type, ConnectivityPtr>& item_value);
 
 template <typename DataType, ItemType item_type, typename ConnectivityPtr>
-PUGS_INLINE void
-write(HighFive::Group& group,
-      const std::string& name,
-      const ItemArray<DataType, item_type, ConnectivityPtr>& item_array)
-{
-  write(group, name, item_array.tableView());
-}
+void write(HighFive::Group& group,
+           const std::string& name,
+           const ItemArray<DataType, item_type, ConnectivityPtr>& item_array);
 
 void writeDiscreteFunctionVariant(const std::string& symbol_name,
                                   const EmbeddedData& embedded_data,
@@ -151,6 +143,12 @@ void writeIInterfaceDescriptor(const std::string& symbol_name,
                                HighFive::Group& checkpoint_group,
                                HighFive::Group& symbol_table_group);
 
+void writeINamedDiscreteData(const std::string& symbol_name,
+                             const EmbeddedData& embedded_data,
+                             HighFive::File& file,
+                             HighFive::Group& checkpoint_group,
+                             HighFive::Group& symbol_table_group);
+
 void writeIQuadratureDescriptor(const std::string& symbol_name,
                                 const EmbeddedData& embedded_data,
                                 HighFive::File& file,
@@ -163,6 +161,12 @@ void writeItemType(const std::string& symbol_name,
                    HighFive::Group& checkpoint_group,
                    HighFive::Group& symbol_table_group);
 
+void writeItemValueVariant(const std::string& symbol_name,
+                           const EmbeddedData& embedded_data,
+                           HighFive::File& file,
+                           HighFive::Group& checkpoint_group,
+                           HighFive::Group& symbol_table_group);
+
 void writeIZoneDescriptor(const std::string& symbol_name,
                           const EmbeddedData& embedded_data,
                           HighFive::File& file,
diff --git a/src/utils/checkpointing/INamedDiscreteDataHF.hpp b/src/utils/checkpointing/INamedDiscreteDataHF.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..9d775e5ea24e1f13fa7eb0afc6c4f600bd3390d7
--- /dev/null
+++ b/src/utils/checkpointing/INamedDiscreteDataHF.hpp
@@ -0,0 +1,16 @@
+#ifndef I_NAMED_DISCRETE_DATA_HF_HPP
+#define I_NAMED_DISCRETE_DATA_HF_HPP
+
+#include <output/INamedDiscreteData.hpp>
+#include <utils/checkpointing/CheckpointUtils.hpp>
+
+HighFive::EnumType<INamedDiscreteData::Type> PUGS_INLINE
+create_enum_i_named_discrete_data_type()
+{
+  return {{"discrete_function", INamedDiscreteData::Type::discrete_function},
+          {"item_array", INamedDiscreteData::Type::item_array},
+          {"item_value", INamedDiscreteData::Type::item_value}};
+}
+HIGHFIVE_REGISTER_TYPE(INamedDiscreteData::Type, create_enum_i_named_discrete_data_type);
+
+#endif   // I_NAMED_DISCRETE_DATA_HF_HPP
diff --git a/src/utils/checkpointing/ResumeUtils.cpp b/src/utils/checkpointing/ResumeUtils.cpp
index 367372bd4ba3469847f6db88b60320279ee223d1..d0726277925055b4cb2a3a7268fab4e587095155 100644
--- a/src/utils/checkpointing/ResumeUtils.cpp
+++ b/src/utils/checkpointing/ResumeUtils.cpp
@@ -6,12 +6,14 @@
 #include <language/utils/DataHandler.hpp>
 #include <language/utils/OFStream.hpp>
 #include <language/utils/SymbolTable.hpp>
+#include <mesh/ItemValueVariant.hpp>
 #include <mesh/NamedBoundaryDescriptor.hpp>
 #include <mesh/NamedInterfaceDescriptor.hpp>
 #include <mesh/NamedZoneDescriptor.hpp>
 #include <mesh/NumberedBoundaryDescriptor.hpp>
 #include <mesh/NumberedInterfaceDescriptor.hpp>
 #include <mesh/NumberedZoneDescriptor.hpp>
+#include <output/NamedDiscreteFunction.hpp>
 #include <scheme/AxisBoundaryConditionDescriptor.hpp>
 #include <scheme/DirichletBoundaryConditionDescriptor.hpp>
 #include <scheme/DiscreteFunctionDescriptorP0.hpp>
@@ -31,12 +33,15 @@
 #include <utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp>
 #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp>
 #include <utils/checkpointing/IInterfaceDescriptorHFType.hpp>
+#include <utils/checkpointing/INamedDiscreteDataHF.hpp>
 #include <utils/checkpointing/IZoneDescriptorHFType.hpp>
 #include <utils/checkpointing/ItemTypeHFType.hpp>
 #include <utils/checkpointing/OStreamTypeHFType.hpp>
 #include <utils/checkpointing/QuadratureTypeHFType.hpp>
 #include <utils/checkpointing/ResumingData.hpp>
 
+std::shared_ptr<DiscreteFunctionVariant> readDiscreteFunctionVariant(const HighFive::Group& discrete_function_group);
+
 template <typename T, ItemType item_type>
 ItemValue<T, item_type>
 readItemValue(const HighFive::Group& group, const std::string& name, const IConnectivity& connectivity)
@@ -212,6 +217,38 @@ readIInterfaceDescriptor(const std::string& symbol_name, const HighFive::Group&
   return {std::make_shared<DataHandler<const IInterfaceDescriptor>>(iinterface_descriptor)};
 }
 
+EmbeddedData
+readINamedDiscreteData(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
+{
+  const HighFive::Group inamed_discrete_data_group = symbol_table_group.getGroup("embedded/" + symbol_name);
+
+  const INamedDiscreteData::Type& type =
+    inamed_discrete_data_group.getAttribute("named_discrete_data_type").read<INamedDiscreteData::Type>();
+
+  const std::string name = inamed_discrete_data_group.getAttribute("named_discrete_data_name").read<std::string>();
+
+  std::shared_ptr<const INamedDiscreteData> inamed_discrete_data;
+
+  switch (type) {
+  case INamedDiscreteData::Type::discrete_function: {
+    HighFive::Group discrete_function_group = inamed_discrete_data_group.getGroup("discrete_function_variant");
+    inamed_discrete_data =
+      std::make_shared<const NamedDiscreteFunction>(readDiscreteFunctionVariant(discrete_function_group), name);
+    break;
+  }
+  case INamedDiscreteData::Type::item_array: {
+    throw NotImplementedError("readINamedDiscreteData");
+    break;
+  }
+  case INamedDiscreteData::Type::item_value: {
+    throw NotImplementedError("readINamedDiscreteData");
+    break;
+  }
+  }
+
+  return {std::make_shared<DataHandler<const INamedDiscreteData>>(inamed_discrete_data)};
+}
+
 EmbeddedData
 readIQuadratureDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
 {
@@ -249,6 +286,89 @@ readItemType(const std::string& symbol_name, const HighFive::Group& symbol_table
   return {std::make_shared<DataHandler<const ItemType>>(std::make_shared<const ItemType>(item_type))};
 }
 
+template <ItemType item_type>
+EmbeddedData
+readItemValueVariant(const HighFive::Group& item_value_variant_group)
+{
+  const std::string data_type  = item_value_variant_group.getAttribute("data_type").read<std::string>();
+  const size_t connectivity_id = item_value_variant_group.getAttribute("connectivity_id").read<size_t>();
+
+  const IConnectivity& connectivity = *ResumingData::instance().iConnectivity(connectivity_id);
+
+  std::shared_ptr<ItemValueVariant> p_item_value;
+
+  if (data_type == dataTypeName(ast_node_data_type_from<bool>)) {
+    p_item_value = std::make_shared<ItemValueVariant>(
+      readItemValue<bool, item_type>(item_value_variant_group, "values", connectivity));
+  } else if (data_type == dataTypeName(ast_node_data_type_from<long int>)) {
+    p_item_value = std::make_shared<ItemValueVariant>(
+      readItemValue<long int, item_type>(item_value_variant_group, "values", connectivity));
+  } else if (data_type == dataTypeName(ast_node_data_type_from<unsigned long int>)) {
+    p_item_value = std::make_shared<ItemValueVariant>(
+      readItemValue<unsigned long int, item_type>(item_value_variant_group, "values", connectivity));
+  } else if (data_type == dataTypeName(ast_node_data_type_from<double>)) {
+    p_item_value = std::make_shared<ItemValueVariant>(
+      readItemValue<double, item_type>(item_value_variant_group, "values", connectivity));
+  } else if (data_type == dataTypeName(ast_node_data_type_from<TinyVector<1>>)) {
+    p_item_value = std::make_shared<ItemValueVariant>(
+      readItemValue<TinyVector<1>, item_type>(item_value_variant_group, "values", connectivity));
+  } else if (data_type == dataTypeName(ast_node_data_type_from<TinyVector<2>>)) {
+    p_item_value = std::make_shared<ItemValueVariant>(
+      readItemValue<TinyVector<2>, item_type>(item_value_variant_group, "values", connectivity));
+  } else if (data_type == dataTypeName(ast_node_data_type_from<TinyVector<3>>)) {
+    p_item_value = std::make_shared<ItemValueVariant>(
+      readItemValue<TinyVector<3>, item_type>(item_value_variant_group, "values", connectivity));
+  } else if (data_type == dataTypeName(ast_node_data_type_from<TinyMatrix<1>>)) {
+    p_item_value = std::make_shared<ItemValueVariant>(
+      readItemValue<TinyMatrix<1>, item_type>(item_value_variant_group, "values", connectivity));
+  } else if (data_type == dataTypeName(ast_node_data_type_from<TinyMatrix<2>>)) {
+    p_item_value = std::make_shared<ItemValueVariant>(
+      readItemValue<TinyMatrix<2>, item_type>(item_value_variant_group, "values", connectivity));
+  } else if (data_type == dataTypeName(ast_node_data_type_from<TinyMatrix<3>>)) {
+    p_item_value = std::make_shared<ItemValueVariant>(
+      readItemValue<TinyMatrix<3>, item_type>(item_value_variant_group, "values", connectivity));
+  } else {
+    throw UnexpectedError("unexpected discrete function data type: " + data_type);
+  }
+  return {std::make_shared<DataHandler<const ItemValueVariant>>(p_item_value)};
+}
+
+EmbeddedData
+readItemValueVariant(const HighFive::Group& item_value_variant_group)
+{
+  const ItemType item_type = item_value_variant_group.getAttribute("item_type").read<ItemType>();
+
+  EmbeddedData embedded_data;
+
+  switch (item_type) {
+  case ItemType::cell: {
+    embedded_data = readItemValueVariant<ItemType::cell>(item_value_variant_group);
+    break;
+  }
+  case ItemType::face: {
+    embedded_data = readItemValueVariant<ItemType::face>(item_value_variant_group);
+    break;
+  }
+  case ItemType::edge: {
+    embedded_data = readItemValueVariant<ItemType::edge>(item_value_variant_group);
+    break;
+  }
+  case ItemType::node: {
+    embedded_data = readItemValueVariant<ItemType::node>(item_value_variant_group);
+    break;
+  }
+  }
+
+  return embedded_data;
+}
+
+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);
+}
+
 EmbeddedData
 readIZoneDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
 {
@@ -284,10 +404,9 @@ readMesh(const std::string& symbol_name, const HighFive::Group& symbol_table_gro
   return {std::make_shared<DataHandler<const MeshVariant>>(ResumingData::instance().meshVariant(mesh_id))};
 }
 
-EmbeddedData
-readDiscreteFunctionVariant(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
+std::shared_ptr<DiscreteFunctionVariant>
+readDiscreteFunctionVariant(const HighFive::Group& discrete_function_group)
 {
-  const HighFive::Group discrete_function_group = symbol_table_group.getGroup("embedded/" + symbol_name);
   DiscreteFunctionType type = discrete_function_group.getAttribute("Vh_type").read<DiscreteFunctionType>();
   size_t mesh_id            = discrete_function_group.getAttribute("mesh_id").read<size_t>();
 
@@ -356,6 +475,16 @@ readDiscreteFunctionVariant(const std::string& symbol_name, const HighFive::Grou
     break;
   }
   }
+  return p_discrete_function;
+}
+
+EmbeddedData
+readDiscreteFunctionVariant(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
+{
+  const HighFive::Group discrete_function_group = symbol_table_group.getGroup("embedded/" + symbol_name);
+
+  std::shared_ptr<DiscreteFunctionVariant> p_discrete_function = readDiscreteFunctionVariant(discrete_function_group);
+
   return {std::make_shared<DataHandler<const DiscreteFunctionVariant>>(p_discrete_function)};
 }
 
diff --git a/src/utils/checkpointing/ResumeUtils.hpp b/src/utils/checkpointing/ResumeUtils.hpp
index 2e4fb05d62c47c9b7a0919904210dc1dcc6a4f67..419751f5b03bfb5ff909da546838888cb777555d 100644
--- a/src/utils/checkpointing/ResumeUtils.hpp
+++ b/src/utils/checkpointing/ResumeUtils.hpp
@@ -87,8 +87,10 @@ EmbeddedData readIBoundaryConditionDescriptor(const std::string& symbol_name,
 EmbeddedData readIBoundaryDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 EmbeddedData readIDiscreteFunctionDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 EmbeddedData readIInterfaceDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
+EmbeddedData readINamedDiscreteData(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 EmbeddedData readIQuadratureDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 EmbeddedData readItemType(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
+EmbeddedData readItemValueVariant(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 EmbeddedData readIZoneDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 EmbeddedData readMesh(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 EmbeddedData readOStream(const std::string& symbol_name, const HighFive::Group& symbol_table_group);