diff --git a/src/language/modules/MeshModule.cpp b/src/language/modules/MeshModule.cpp
index 40d5d2304596a988c91b1d139d0f6552eae0acc7..94fe342c8b25971e2fd03d78423df1b1e7682c23 100644
--- a/src/language/modules/MeshModule.cpp
+++ b/src/language/modules/MeshModule.cpp
@@ -329,4 +329,30 @@ MeshModule::registerCheckpointResume() const
                                           const HighFive::Group& symbol_table_group) -> EmbeddedData {
                            return readIBoundaryDescriptor(symbol_name, symbol_table_group);
                          }));
+
+  CheckpointResumeRepository::instance()
+    .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const IInterfaceDescriptor>>,
+                         std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data,
+                                          HighFive::File& file, HighFive::Group& checkpoint_group,
+                                          HighFive::Group& symbol_table_group) {
+                           writeIInterfaceDescriptor(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 readIInterfaceDescriptor(symbol_name, symbol_table_group);
+                         }));
+
+  CheckpointResumeRepository::instance()
+    .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const IZoneDescriptor>>,
+                         std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data,
+                                          HighFive::File& file, HighFive::Group& checkpoint_group,
+                                          HighFive::Group& symbol_table_group) {
+                           writeIZoneDescriptor(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 readIZoneDescriptor(symbol_name, symbol_table_group);
+                         }));
+
 }
diff --git a/src/mesh/NamedInterfaceDescriptor.hpp b/src/mesh/NamedInterfaceDescriptor.hpp
index 0b6a0e996c4753ee2f33e69f482820520886ad19..a7b94ae81cc5bae9953fa7870f89ce4cbd430172 100644
--- a/src/mesh/NamedInterfaceDescriptor.hpp
+++ b/src/mesh/NamedInterfaceDescriptor.hpp
@@ -25,6 +25,12 @@ class NamedInterfaceDescriptor final : public IInterfaceDescriptor
     return m_name == ref_id.tagName();
   }
 
+  [[nodiscard]] const std::string&
+  name() const
+  {
+    return m_name;
+  }
+
   [[nodiscard]] Type
   type() const final
   {
diff --git a/src/mesh/NamedZoneDescriptor.hpp b/src/mesh/NamedZoneDescriptor.hpp
index 0fbe101421f7f5048019f945622ad4263e8d3e39..f69e2b21c08cf192fa21b2ccf720641f75811fa5 100644
--- a/src/mesh/NamedZoneDescriptor.hpp
+++ b/src/mesh/NamedZoneDescriptor.hpp
@@ -25,7 +25,13 @@ class NamedZoneDescriptor final : public IZoneDescriptor
     return m_name == ref_id.tagName();
   }
 
-  Type
+  [[nodiscard]] const std::string&
+  name() const
+  {
+    return m_name;
+  }
+
+  [[nodiscard]] Type
   type() const final
   {
     return Type::named;
diff --git a/src/mesh/NumberedInterfaceDescriptor.hpp b/src/mesh/NumberedInterfaceDescriptor.hpp
index d72197221f5811a22836871e89f601479d480123..95ce579744ae4874463bfd034d66b1d4d4203320 100644
--- a/src/mesh/NumberedInterfaceDescriptor.hpp
+++ b/src/mesh/NumberedInterfaceDescriptor.hpp
@@ -24,6 +24,12 @@ class NumberedInterfaceDescriptor final : public IInterfaceDescriptor
   }
 
  public:
+  [[nodiscard]] unsigned int
+  number() const
+  {
+    return m_number;
+  }
+
   [[nodiscard]] Type
   type() const final
   {
diff --git a/src/mesh/NumberedZoneDescriptor.hpp b/src/mesh/NumberedZoneDescriptor.hpp
index 7e72521d2c69346c4fc46edc82dd0bbedd99e20a..3d4ef7d2b28885a6db96871199f369bb41f85488 100644
--- a/src/mesh/NumberedZoneDescriptor.hpp
+++ b/src/mesh/NumberedZoneDescriptor.hpp
@@ -24,7 +24,13 @@ class NumberedZoneDescriptor final : public IZoneDescriptor
   }
 
  public:
-  Type
+  [[nodiscard]] unsigned int
+  number() const
+  {
+    return m_number;
+  }
+
+  [[nodiscard]] Type
   type() const final
   {
     return Type::numbered;
diff --git a/src/utils/checkpointing/CheckpointUtils.cpp b/src/utils/checkpointing/CheckpointUtils.cpp
index 338ceee96dbda839e00f1e4b2bdd4f651bac43c3..4335ee10022911ee8122ec7eb05528de992c428a 100644
--- a/src/utils/checkpointing/CheckpointUtils.cpp
+++ b/src/utils/checkpointing/CheckpointUtils.cpp
@@ -5,12 +5,17 @@
 #include <language/utils/DataHandler.hpp>
 #include <mesh/MeshVariant.hpp>
 #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp>
+#include <utils/checkpointing/IInterfaceDescriptorHFType.hpp>
+#include <utils/checkpointing/IZoneDescriptorHFType.hpp>
 #include <utils/checkpointing/RefItemListHFType.hpp>
 
-#include <mesh/IBoundaryDescriptor.hpp>
 #include <mesh/Mesh.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>
 
 template <ItemType item_type, size_t Dimension>
 void
@@ -215,3 +220,68 @@ writeIBoundaryDescriptor(const std::string& symbol_name,
   }
   }
 }
+
+void
+writeIInterfaceDescriptor(const std::string& symbol_name,
+                          const EmbeddedData& embedded_data,
+                          HighFive::File&,
+                          HighFive::Group&,
+                          HighFive::Group& symbol_table_group)
+{
+  HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name);
+
+  std::shared_ptr<const IInterfaceDescriptor> iinterface_descriptor_p =
+    dynamic_cast<const DataHandler<const IInterfaceDescriptor>&>(embedded_data.get()).data_ptr();
+
+  const IInterfaceDescriptor& iinterface_descriptor = *iinterface_descriptor_p;
+
+  variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(iinterface_descriptor_p)>));
+  variable_group.createAttribute("iinterface_descriptor_type", iinterface_descriptor.type());
+
+  switch (iinterface_descriptor.type()) {
+  case IInterfaceDescriptor::Type::named: {
+    const NamedInterfaceDescriptor& named_interface_descriptor =
+      dynamic_cast<const NamedInterfaceDescriptor&>(iinterface_descriptor);
+    variable_group.createAttribute("name", named_interface_descriptor.name());
+    break;
+  }
+  case IInterfaceDescriptor::Type::numbered: {
+    const NumberedInterfaceDescriptor& numbered_boundary_descriptor =
+      dynamic_cast<const NumberedInterfaceDescriptor&>(iinterface_descriptor);
+    variable_group.createAttribute("number", numbered_boundary_descriptor.number());
+    break;
+  }
+  }
+}
+
+void
+writeIZoneDescriptor(const std::string& symbol_name,
+                     const EmbeddedData& embedded_data,
+                     HighFive::File&,
+                     HighFive::Group&,
+                     HighFive::Group& symbol_table_group)
+{
+  HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name);
+
+  std::shared_ptr<const IZoneDescriptor> izone_descriptor_p =
+    dynamic_cast<const DataHandler<const IZoneDescriptor>&>(embedded_data.get()).data_ptr();
+
+  const IZoneDescriptor& izone_descriptor = *izone_descriptor_p;
+
+  variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(izone_descriptor_p)>));
+  variable_group.createAttribute("izone_descriptor_type", izone_descriptor.type());
+
+  switch (izone_descriptor.type()) {
+  case IZoneDescriptor::Type::named: {
+    const NamedZoneDescriptor& named_zone_descriptor = dynamic_cast<const NamedZoneDescriptor&>(izone_descriptor);
+    variable_group.createAttribute("name", named_zone_descriptor.name());
+    break;
+  }
+  case IZoneDescriptor::Type::numbered: {
+    const NumberedZoneDescriptor& numbered_boundary_descriptor =
+      dynamic_cast<const NumberedZoneDescriptor&>(izone_descriptor);
+    variable_group.createAttribute("number", numbered_boundary_descriptor.number());
+    break;
+  }
+  }
+}
diff --git a/src/utils/checkpointing/CheckpointUtils.hpp b/src/utils/checkpointing/CheckpointUtils.hpp
index e9b7167960ed8b0004c522388a28b03edc6363d8..5cfeb0d4729f0a300816890fcb898fe8faee7bb2 100644
--- a/src/utils/checkpointing/CheckpointUtils.hpp
+++ b/src/utils/checkpointing/CheckpointUtils.hpp
@@ -54,4 +54,16 @@ void writeIBoundaryDescriptor(const std::string& symbol_name,
                               HighFive::Group& checkpoint_group,
                               HighFive::Group& symbol_table_group);
 
+void writeIInterfaceDescriptor(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,
+                          HighFive::Group& checkpoint_group,
+                          HighFive::Group& symbol_table_group);
+
 #endif   // CHECKPOINT_UTILS_HPP
diff --git a/src/utils/checkpointing/IInterfaceDescriptorHFType.hpp b/src/utils/checkpointing/IInterfaceDescriptorHFType.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..d099f2bb0511f0ecb4f5a7eecfeb33e484570b8a
--- /dev/null
+++ b/src/utils/checkpointing/IInterfaceDescriptorHFType.hpp
@@ -0,0 +1,14 @@
+#ifndef I_INTERFACE_DESCRIPTOR_HF_TYPE_HPP
+#define I_INTERFACE_DESCRIPTOR_HF_TYPE_HPP
+
+#include <mesh/IInterfaceDescriptor.hpp>
+#include <utils/checkpointing/CheckpointUtils.hpp>
+
+HighFive::EnumType<IInterfaceDescriptor::Type> PUGS_INLINE
+create_enum_i_interface_descriptor_type()
+{
+  return {{"named", IInterfaceDescriptor::Type::named}, {"numbered", IInterfaceDescriptor::Type::numbered}};
+}
+HIGHFIVE_REGISTER_TYPE(IInterfaceDescriptor::Type, create_enum_i_interface_descriptor_type);
+
+#endif   // I_INTERFACE_DESCRIPTOR_HF_TYPE_HPP
diff --git a/src/utils/checkpointing/IZoneDescriptorHFType.hpp b/src/utils/checkpointing/IZoneDescriptorHFType.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..0b491aa922df3bbeef555c4cafe1f8d02d28d120
--- /dev/null
+++ b/src/utils/checkpointing/IZoneDescriptorHFType.hpp
@@ -0,0 +1,14 @@
+#ifndef I_ZONE_DESCRIPTOR_HF_TYPE_HPP
+#define I_ZONE_DESCRIPTOR_HF_TYPE_HPP
+
+#include <mesh/IZoneDescriptor.hpp>
+#include <utils/checkpointing/CheckpointUtils.hpp>
+
+HighFive::EnumType<IZoneDescriptor::Type> PUGS_INLINE
+create_enum_i_zone_descriptor_type()
+{
+  return {{"named", IZoneDescriptor::Type::named}, {"numbered", IZoneDescriptor::Type::numbered}};
+}
+HIGHFIVE_REGISTER_TYPE(IZoneDescriptor::Type, create_enum_i_zone_descriptor_type);
+
+#endif   // I_ZONE_DESCRIPTOR_HF_TYPE_HPP
diff --git a/src/utils/checkpointing/ResumeUtils.cpp b/src/utils/checkpointing/ResumeUtils.cpp
index 32317896c8d2a59778650e5e430a04c934fee8ee..d320f9616971941eec38189781b4a2055a1b98b9 100644
--- a/src/utils/checkpointing/ResumeUtils.cpp
+++ b/src/utils/checkpointing/ResumeUtils.cpp
@@ -3,8 +3,14 @@
 #include <language/utils/DataHandler.hpp>
 #include <language/utils/SymbolTable.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 <utils/checkpointing/IBoundaryDescriptorHFType.hpp>
+#include <utils/checkpointing/IInterfaceDescriptorHFType.hpp>
+#include <utils/checkpointing/IZoneDescriptorHFType.hpp>
 #include <utils/checkpointing/ResumingData.hpp>
 
 EmbeddedData
@@ -45,3 +51,61 @@ readIBoundaryDescriptor(const std::string& symbol_name, const HighFive::Group& s
 
   return embedded_data;
 }
+
+EmbeddedData
+readIInterfaceDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
+{
+  const HighFive::Group iinterfacedecriptor_group = symbol_table_group.getGroup("embedded/" + symbol_name);
+  const IInterfaceDescriptor::Type iinterface_descriptor_type =
+    iinterfacedecriptor_group.getAttribute("iinterface_descriptor_type").read<IInterfaceDescriptor::Type>();
+
+  EmbeddedData embedded_data;
+
+  switch (iinterface_descriptor_type) {
+  case IInterfaceDescriptor::Type::named: {
+    const std::string name = iinterfacedecriptor_group.getAttribute("name").read<std::string>();
+
+    embedded_data = {std::make_shared<DataHandler<const IInterfaceDescriptor>>(
+      std::make_shared<const NamedInterfaceDescriptor>(name))};
+    break;
+  }
+  case IInterfaceDescriptor::Type::numbered: {
+    const unsigned int number = iinterfacedecriptor_group.getAttribute("number").read<unsigned int>();
+
+    embedded_data = {std::make_shared<DataHandler<const IInterfaceDescriptor>>(
+      std::make_shared<const NumberedInterfaceDescriptor>(number))};
+    break;
+  }
+  }
+
+  return embedded_data;
+}
+
+EmbeddedData
+readIZoneDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
+{
+  const HighFive::Group izonedecriptor_group = symbol_table_group.getGroup("embedded/" + symbol_name);
+  const IZoneDescriptor::Type izone_descriptor_type =
+    izonedecriptor_group.getAttribute("izone_descriptor_type").read<IZoneDescriptor::Type>();
+
+  EmbeddedData embedded_data;
+
+  switch (izone_descriptor_type) {
+  case IZoneDescriptor::Type::named: {
+    const std::string name = izonedecriptor_group.getAttribute("name").read<std::string>();
+
+    embedded_data = {
+      std::make_shared<DataHandler<const IZoneDescriptor>>(std::make_shared<const NamedZoneDescriptor>(name))};
+    break;
+  }
+  case IZoneDescriptor::Type::numbered: {
+    const unsigned int number = izonedecriptor_group.getAttribute("number").read<unsigned int>();
+
+    embedded_data = {
+      std::make_shared<DataHandler<const IZoneDescriptor>>(std::make_shared<const NumberedZoneDescriptor>(number))};
+    break;
+  }
+  }
+
+  return embedded_data;
+}
diff --git a/src/utils/checkpointing/ResumeUtils.hpp b/src/utils/checkpointing/ResumeUtils.hpp
index ce2423256eaae440b6c0c044918a21bbf2cb2e09..8ac1ffcf22e00a3b5a87c516ae7f78d363cea02a 100644
--- a/src/utils/checkpointing/ResumeUtils.hpp
+++ b/src/utils/checkpointing/ResumeUtils.hpp
@@ -30,5 +30,7 @@ read(const HighFive::Group& group, const std::string& name)
 
 EmbeddedData readMesh(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 EmbeddedData readIBoundaryDescriptor(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 readIZoneDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 
 #endif   // RESUME_UTILS_HPP