diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
index 270433a5725e896e8ded14746dc265291edfbf13..311377ea6df090f0d537575ac2b1eba796fea326 100644
--- a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
@@ -33,13 +33,12 @@ static std::vector<MeshLib::Element*> getClonedElements(
 
 namespace ProcessLib
 {
-std::unique_ptr<BoundaryCondition> createBoundaryCondition(
+
+std::unique_ptr<BoundaryCondition> BoundaryConditionBuilder::createBoundaryCondition(
     const BoundaryConditionConfig& config,
-    const NumLib::LocalToGlobalIndexMap& dof_table,
-    const MeshLib::Mesh& mesh,
-    const int variable_id,
-    const unsigned integration_order,
-    std::vector<std::unique_ptr<ParameterBase>> const& parameters)
+    const NumLib::LocalToGlobalIndexMap& dof_table, const MeshLib::Mesh& mesh,
+    const int variable_id, const unsigned integration_order,
+    const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters)
 {
     MeshGeoToolsLib::MeshNodeSearcher& mesh_node_searcher =
         MeshGeoToolsLib::MeshNodeSearcher::getMeshNodeSearcher(mesh);
@@ -102,4 +101,5 @@ std::unique_ptr<BoundaryCondition> createBoundaryCondition(
     }
 }
 
+
 }  // ProcessLib
diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.h b/ProcessLib/BoundaryCondition/BoundaryCondition.h
index 678225250f7c7ac6a8b52e61b8237aa313248cdd..71286bad329d1efd08b92c41e1ef1ea742210804 100644
--- a/ProcessLib/BoundaryCondition/BoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/BoundaryCondition.h
@@ -55,11 +55,17 @@ public:
     virtual ~BoundaryCondition() = default;
 };
 
-std::unique_ptr<BoundaryCondition> createBoundaryCondition(
-    const BoundaryConditionConfig& config,
-    const NumLib::LocalToGlobalIndexMap& dof_table, const MeshLib::Mesh& mesh,
-    const int variable_id, const unsigned integration_order,
-    const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters);
+class BoundaryConditionBuilder
+{
+public:
+    virtual ~BoundaryConditionBuilder() {}
+
+    virtual std::unique_ptr<BoundaryCondition> createBoundaryCondition(
+        const BoundaryConditionConfig& config,
+        const NumLib::LocalToGlobalIndexMap& dof_table, const MeshLib::Mesh& mesh,
+        const int variable_id, const unsigned integration_order,
+        const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters);
+};
 
 }  // ProcessLib
 
diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp
index 9ec3550201849ce563af204bf89e2fd5f16597ec..a53c7d6d2f946aefbe7138630b9ba0296fe660df 100644
--- a/ProcessLib/ProcessVariable.cpp
+++ b/ProcessLib/ProcessVariable.cpp
@@ -30,7 +30,8 @@ ProcessVariable::ProcessVariable(
       _initial_condition(findParameter<double>(
           //! \ogs_file_param{prj__process_variables__process_variable__initial_condition}
           config.getConfigParameter<std::string>("initial_condition"),
-          parameters, _n_components))
+          parameters, _n_components)),
+      _bc_builder(new BoundaryConditionBuilder())
 {
     DBUG("Constructing process variable %s", _name.c_str());
 
@@ -95,7 +96,8 @@ ProcessVariable::ProcessVariable(ProcessVariable&& other)
       _mesh(other._mesh),
       _n_components(other._n_components),
       _initial_condition(std::move(other._initial_condition)),
-      _bc_configs(std::move(other._bc_configs))
+      _bc_configs(std::move(other._bc_configs)),
+      _bc_builder(std::move(other._bc_builder))
 {
 }
 
@@ -139,7 +141,7 @@ ProcessVariable::createBoundaryConditions(
     std::vector<std::unique_ptr<BoundaryCondition>> bcs;
 
     for (auto& config : _bc_configs)
-        bcs.emplace_back(createBoundaryCondition(
+        bcs.emplace_back(_bc_builder->createBoundaryCondition(
             config, dof_table, _mesh, variable_id, integration_order, parameters));
 
     return bcs;
diff --git a/ProcessLib/ProcessVariable.h b/ProcessLib/ProcessVariable.h
index f722056647948abf92949eba77f084b54d9c762a..db444a2fa60d43b51f1a998224fad1c7e1156a1d 100644
--- a/ProcessLib/ProcessVariable.h
+++ b/ProcessLib/ProcessVariable.h
@@ -22,6 +22,8 @@ template <typename T> class PropertyVector;
 
 namespace ProcessLib
 {
+class BoundaryConditionBuilder;
+
 /// A named process variable. Its properties includes the mesh, and the initial
 /// and boundary conditions.
 class ProcessVariable
@@ -42,6 +44,11 @@ public:
     /// Returns the number of components of the process variable.
     int getNumberOfComponents() const { return _n_components; }
 
+    void setBoundaryConditionBuilder(std::unique_ptr<BoundaryConditionBuilder> bc_builder)
+    {
+        _bc_builder = std::move(bc_builder);
+    }
+
     std::vector<std::unique_ptr<BoundaryCondition>> createBoundaryConditions(
         const NumLib::LocalToGlobalIndexMap& dof_table, const int variable_id,
         unsigned const integration_order,
@@ -64,6 +71,7 @@ private:
     Parameter<double> const& _initial_condition;
 
     std::vector<BoundaryConditionConfig> _bc_configs;
+    std::unique_ptr<BoundaryConditionBuilder> _bc_builder;
 };
 
 }  // namespace ProcessLib