diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp
index d4d26979451127cacf44b0719b62588d7ee108e7..32628a2ebecd9a42a5b11db2cf8239c23ca1259b 100644
--- a/src/language/modules/SchemeModule.cpp
+++ b/src/language/modules/SchemeModule.cpp
@@ -37,8 +37,11 @@
 #include <scheme/HyperelasticSolver.hpp>
 #include <scheme/IBoundaryConditionDescriptor.hpp>
 #include <scheme/IDiscreteFunctionDescriptor.hpp>
+#include <scheme/InflowBoundaryConditionDescriptor.hpp>
 #include <scheme/NeumannBoundaryConditionDescriptor.hpp>
+#include <scheme/OutflowBoundaryConditionDescriptor.hpp>
 #include <scheme/SymmetryBoundaryConditionDescriptor.hpp>
+#include <scheme/VariableBCDescriptor.hpp>
 #include <utils/Socket.hpp>
 
 #include <memory>
@@ -50,6 +53,7 @@ SchemeModule::SchemeModule()
   this->_addTypeDescriptor(ast_node_data_type_from<std::shared_ptr<const IQuadratureDescriptor>>);
 
   this->_addTypeDescriptor(ast_node_data_type_from<std::shared_ptr<const IBoundaryConditionDescriptor>>);
+  this->_addTypeDescriptor(ast_node_data_type_from<std::shared_ptr<const VariableBCDescriptor>>);
 
   this->_addBuiltinFunction("P0", std::function(
 
@@ -75,6 +79,16 @@ SchemeModule::SchemeModule()
 
                                        ));
 
+  this->_addBuiltinFunction("variable_bc", std::function(
+
+                                             [](const std::shared_ptr<const DiscreteFunctionVariant>& v,
+                                                const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
+                                                  bc_descriptor_list) -> std::shared_ptr<const VariableBCDescriptor> {
+                                               return std::make_shared<VariableBCDescriptor>(v, bc_descriptor_list);
+                                             }
+
+                                             ));
+
   this->_addBuiltinFunction("GaussLobatto", std::function(
 
                                               [](uint64_t degree) -> std::shared_ptr<const IQuadratureDescriptor> {
@@ -367,6 +381,26 @@ SchemeModule::SchemeModule()
 
                               ));
 
+  this->_addBuiltinFunction("inflow", std::function(
+
+                                        [](std::shared_ptr<const IBoundaryDescriptor> boundary,
+                                           const FunctionSymbolId& function_id)
+                                          -> std::shared_ptr<const IBoundaryConditionDescriptor> {
+                                          return std::make_shared<InflowBoundaryConditionDescriptor>(boundary,
+                                                                                                     function_id);
+                                        }
+
+                                        ));
+
+  this->_addBuiltinFunction("outflow", std::function(
+
+                                         [](std::shared_ptr<const IBoundaryDescriptor> boundary)
+                                           -> std::shared_ptr<const IBoundaryConditionDescriptor> {
+                                           return std::make_shared<OutflowBoundaryConditionDescriptor>(boundary);
+                                         }
+
+                                         ));
+
   this->_addBuiltinFunction("glace_fluxes", std::function(
 
                                               [](const std::shared_ptr<const DiscreteFunctionVariant>& rho,
diff --git a/src/language/modules/SchemeModule.hpp b/src/language/modules/SchemeModule.hpp
index d56a5ec74069bd23d8169f25ff8a829c7c4a53ff..68cffcf18dc9438cfa5607bdf70739bf223a175d 100644
--- a/src/language/modules/SchemeModule.hpp
+++ b/src/language/modules/SchemeModule.hpp
@@ -10,6 +10,11 @@ template <>
 inline ASTNodeDataType ast_node_data_type_from<std::shared_ptr<const IBoundaryConditionDescriptor>> =
   ASTNodeDataType::build<ASTNodeDataType::type_id_t>("boundary_condition");
 
+class VariableBCDescriptor;
+template <>
+inline ASTNodeDataType ast_node_data_type_from<std::shared_ptr<const VariableBCDescriptor>> =
+  ASTNodeDataType::build<ASTNodeDataType::type_id_t>("variable_boundary_condition");
+
 class DiscreteFunctionVariant;
 template <>
 inline ASTNodeDataType ast_node_data_type_from<std::shared_ptr<const DiscreteFunctionVariant>> =
diff --git a/src/scheme/VariableBCDescriptor.hpp b/src/scheme/VariableBCDescriptor.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..18b35925433bc98148a87485e97e8edddfa20fbc
--- /dev/null
+++ b/src/scheme/VariableBCDescriptor.hpp
@@ -0,0 +1,41 @@
+#ifndef VARIABLE_BC_DESCRIPTOR_HPP
+#define VARIABLE_BC_DESCRIPTOR_HPP
+
+class DiscreteFunctionVariant;
+class IBoundaryConditionDescriptor;
+
+#include <memory>
+#include <vector>
+
+class VariableBCDescriptor
+{
+ private:
+  std::shared_ptr<const DiscreteFunctionVariant> m_discrete_function_variant;
+  std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>> m_bc_descriptor_list;
+
+ public:
+  const std::shared_ptr<const DiscreteFunctionVariant>&
+  discreteFunctionVariant() const
+  {
+    return m_discrete_function_variant;
+  }
+
+  const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>&
+  bcDescriptorList() const
+  {
+    return m_bc_descriptor_list;
+  }
+
+  VariableBCDescriptor(const std::shared_ptr<const DiscreteFunctionVariant>& discrete_function_variant,
+                       const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list)
+    : m_discrete_function_variant{discrete_function_variant}, m_bc_descriptor_list{bc_descriptor_list}
+  {}
+
+  VariableBCDescriptor(const VariableBCDescriptor&) = default;
+  VariableBCDescriptor(VariableBCDescriptor&&)      = default;
+
+  VariableBCDescriptor()  = default;
+  ~VariableBCDescriptor() = default;
+};
+
+#endif   // VARIABLE_BC_DESCRIPTOR_HPP