diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp
index 7f7464879ba6c24ee855d47fe6792bef0a9bb8c8..71e36183f6af48288fa6ece099a63793d9c97d79 100644
--- a/src/language/modules/SchemeModule.cpp
+++ b/src/language/modules/SchemeModule.cpp
@@ -740,4 +740,17 @@ SchemeModule::registerCheckpointResume() const
                                           const HighFive::Group& symbol_table_group) -> EmbeddedData {
                            return readIQuadratureDescriptor(symbol_name, symbol_table_group);
                          }));
+
+  CheckpointResumeRepository::instance()
+    .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const VariableBCDescriptor>>,
+                         std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data,
+                                          HighFive::File& file, HighFive::Group& checkpoint_group,
+                                          HighFive::Group& symbol_table_group) {
+                           writeVariableBCDescriptor(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 readVariableBCDescriptor(symbol_name, symbol_table_group);
+                         }));
 }
diff --git a/src/utils/checkpointing/CheckpointUtils.cpp b/src/utils/checkpointing/CheckpointUtils.cpp
index 3db38f27756af45305722043ad29c77f2a00d974..c72f70bfce487c82429da9a27c50f3dd5f853dd1 100644
--- a/src/utils/checkpointing/CheckpointUtils.cpp
+++ b/src/utils/checkpointing/CheckpointUtils.cpp
@@ -28,6 +28,7 @@
 #include <scheme/DiscreteFunctionP0Vector.hpp>
 #include <scheme/DiscreteFunctionVariant.hpp>
 #include <scheme/IBoundaryConditionDescriptor.hpp>
+#include <scheme/VariableBCDescriptor.hpp>
 #include <utils/checkpointing/DiscreteFunctionTypeHFType.hpp>
 #include <utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp>
 #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp>
@@ -275,17 +276,9 @@ writeIBoundaryDescriptor(HighFive::Group& variable_group, const IBoundaryDescrip
 }
 
 void
-writeIBoundaryConditionDescriptor(const std::string& symbol_name,
-                                  const EmbeddedData& embedded_data,
-                                  HighFive::File&,
-                                  HighFive::Group&,
-                                  HighFive::Group& symbol_table_group)
+writeIBoundaryConditionDescriptor(HighFive::Group& variable_group,
+                                  std::shared_ptr<const IBoundaryConditionDescriptor> iboundary_condition_descriptor_p)
 {
-  HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name);
-
-  std::shared_ptr<const IBoundaryConditionDescriptor> iboundary_condition_descriptor_p =
-    dynamic_cast<const DataHandler<const IBoundaryConditionDescriptor>&>(embedded_data.get()).data_ptr();
-
   const IBoundaryConditionDescriptor& iboundary_condition_descriptor = *iboundary_condition_descriptor_p;
 
   variable_group.createAttribute("type",
@@ -365,6 +358,21 @@ writeIBoundaryConditionDescriptor(const std::string& symbol_name,
   }
 }
 
+void
+writeIBoundaryConditionDescriptor(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 IBoundaryConditionDescriptor> iboundary_condition_descriptor_p =
+    dynamic_cast<const DataHandler<const IBoundaryConditionDescriptor>&>(embedded_data.get()).data_ptr();
+
+  writeIBoundaryConditionDescriptor(variable_group, iboundary_condition_descriptor_p);
+}
+
 void
 writeIBoundaryDescriptor(const std::string& symbol_name,
                          const EmbeddedData& embedded_data,
@@ -769,3 +777,28 @@ writeOStream(const std::string& symbol_name,
   }
   }
 }
+
+void
+writeVariableBCDescriptor(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 VariableBCDescriptor> variable_bc_descriptor_p =
+    dynamic_cast<const DataHandler<const VariableBCDescriptor>&>(embedded_data.get()).data_ptr();
+
+  HighFive::Group discrete_function_group = variable_group.createGroup("discrete_function");
+  writeDiscreteFunctionVariant(discrete_function_group, variable_bc_descriptor_p->discreteFunctionVariant(), file,
+                               checkpoint_group);
+
+  const auto bc_descriptor_list            = variable_bc_descriptor_p->bcDescriptorList();
+  HighFive::Group bc_descriptor_list_group = variable_group.createGroup("bc_descriptor_list");
+  for (size_t i_bc_descriptor = 0; i_bc_descriptor < bc_descriptor_list.size(); ++i_bc_descriptor) {
+    HighFive::Group bc_descriptor_group = bc_descriptor_list_group.createGroup(std::to_string(i_bc_descriptor));
+
+    writeIBoundaryConditionDescriptor(bc_descriptor_group, bc_descriptor_list[i_bc_descriptor]);
+  }
+}
diff --git a/src/utils/checkpointing/CheckpointUtils.hpp b/src/utils/checkpointing/CheckpointUtils.hpp
index 0019d85fddbc3a32d1521ae8d95c8f028ce143c6..50fa940dc51086f9b5ad7de73b1d19e4317c8a4d 100644
--- a/src/utils/checkpointing/CheckpointUtils.hpp
+++ b/src/utils/checkpointing/CheckpointUtils.hpp
@@ -197,4 +197,10 @@ void writeOStream(const std::string& symbol_name,
                   HighFive::Group& checkpoint_group,
                   HighFive::Group& symbol_table_group);
 
+void writeVariableBCDescriptor(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/ResumeUtils.cpp b/src/utils/checkpointing/ResumeUtils.cpp
index ca2c55eec67d04c3189ebf8b65df7af24c4cfc40..3b73a3b0310fa8521f25fd9274f39f47e1e3a959 100644
--- a/src/utils/checkpointing/ResumeUtils.cpp
+++ b/src/utils/checkpointing/ResumeUtils.cpp
@@ -35,6 +35,7 @@
 #include <scheme/NeumannBoundaryConditionDescriptor.hpp>
 #include <scheme/OutflowBoundaryConditionDescriptor.hpp>
 #include <scheme/SymmetryBoundaryConditionDescriptor.hpp>
+#include <scheme/VariableBCDescriptor.hpp>
 #include <utils/checkpointing/DiscreteFunctionTypeHFType.hpp>
 #include <utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp>
 #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp>
@@ -89,10 +90,9 @@ readIBoundaryDescriptor(const HighFive::Group& iboundarydescriptor_group)
   return i_boundary_descriptor;
 }
 
-EmbeddedData
-readIBoundaryConditionDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
+std::shared_ptr<const IBoundaryConditionDescriptor>
+readIBoundaryConditionDescriptor(const HighFive::Group& iboundaryconditiondecriptor_group)
 {
-  const HighFive::Group iboundaryconditiondecriptor_group = symbol_table_group.getGroup("embedded/" + symbol_name);
   const IBoundaryConditionDescriptor::Type iboundary_condition_descriptor_type =
     iboundaryconditiondecriptor_group.getAttribute("iboundary_condition_descriptor_type")
       .read<IBoundaryConditionDescriptor::Type>();
@@ -168,6 +168,14 @@ readIBoundaryConditionDescriptor(const std::string& symbol_name, const HighFive:
   }
   }
 
+  return bc_descriptor;
+}
+
+EmbeddedData
+readIBoundaryConditionDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
+{
+  std::shared_ptr<const IBoundaryConditionDescriptor> bc_descriptor =
+    readIBoundaryConditionDescriptor(symbol_table_group.getGroup("embedded/" + symbol_name));
   return {std::make_shared<DataHandler<const IBoundaryConditionDescriptor>>(bc_descriptor)};
 }
 
@@ -649,3 +657,26 @@ readOStream(const std::string& symbol_name, const HighFive::Group& symbol_table_
 
   return {std::make_shared<DataHandler<const OStream>>(p_ostream)};
 }
+
+EmbeddedData
+readVariableBCDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group)
+{
+  const HighFive::Group variable_bc_descriptor_group = symbol_table_group.getGroup("embedded/" + symbol_name);
+
+  HighFive::Group discrete_function_group = variable_bc_descriptor_group.getGroup("discrete_function");
+
+  std::shared_ptr<const DiscreteFunctionVariant> discrete_function =
+    readDiscreteFunctionVariant(discrete_function_group);
+
+  HighFive::Group bc_descriptor_list_group = variable_bc_descriptor_group.getGroup("bc_descriptor_list");
+  std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>> bc_descriptor_list;
+  for (size_t i = 0; i < bc_descriptor_list_group.getNumberObjects(); ++i) {
+    HighFive::Group bc_descriptor_group = bc_descriptor_list_group.getGroup(std::to_string(i));
+    bc_descriptor_list.push_back(readIBoundaryConditionDescriptor(bc_descriptor_group));
+  }
+
+  std::shared_ptr<const VariableBCDescriptor> p_variable_bc_descriptor =
+    std::make_shared<const VariableBCDescriptor>(discrete_function, bc_descriptor_list);
+
+  return {std::make_shared<DataHandler<const VariableBCDescriptor>>(p_variable_bc_descriptor)};
+}
diff --git a/src/utils/checkpointing/ResumeUtils.hpp b/src/utils/checkpointing/ResumeUtils.hpp
index 50e4a67a4d7aba453d8ff8355208c08361494dce..f4ec5325dee1d417baa18a36608a340e2916a299 100644
--- a/src/utils/checkpointing/ResumeUtils.hpp
+++ b/src/utils/checkpointing/ResumeUtils.hpp
@@ -96,5 +96,6 @@ EmbeddedData readIWriter(const std::string& symbol_name, const HighFive::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);
+EmbeddedData readVariableBCDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group);
 
 #endif   // RESUME_UTILS_HPP