diff --git a/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp
index 980ba2471d57a38aecc255230e5338b284f32805..938b6663d0a458c082e3c07abfb51e376198729a 100644
--- a/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp
@@ -12,11 +12,68 @@
 #include <algorithm>
 #include <logog/include/logog.hpp>
 #include <vector>
+
+#include "BaseLib/ConfigTree.h"
+#include "NumLib/IndexValueVector.h"
+#include "NumLib/DOF/LocalToGlobalIndexMap.h"
+#include "ProcessLib/Parameter/Parameter.h"
 #include "ProcessLib/Utils/ProcessUtils.h"
 
 namespace ProcessLib
 {
+DirichletBoundaryCondition::DirichletBoundaryCondition(
+    Parameter<double> const& parameter, MeshLib::Mesh const& bc_mesh,
+    NumLib::LocalToGlobalIndexMap const& dof_table_bulk, int const variable_id,
+    int const component_id)
+    : _parameter(parameter),
+      _bc_mesh(bc_mesh),
+      _variable_id(variable_id),
+      _component_id(component_id)
+{
+    if (variable_id >=
+            static_cast<int>(dof_table_bulk.getNumberOfVariables()) ||
+        component_id >=
+            dof_table_bulk.getNumberOfVariableComponents(variable_id))
+    {
+        OGS_FATAL(
+            "Variable id or component id too high. Actual values: (%d, "
+            "%d), maximum values: (%d, %d).",
+            variable_id, component_id, dof_table_bulk.getNumberOfVariables(),
+            dof_table_bulk.getNumberOfVariableComponents(variable_id));
+    }
+
+    if (!_bc_mesh.getProperties().existsPropertyVector<std::size_t>(
+            "bulk_node_ids"))
+    {
+        OGS_FATAL(
+            "The required bulk node ids map does not exist in the boundary "
+            "mesh '%s'.",
+            _bc_mesh.getName().c_str());
+    }
+
+    std::vector<MeshLib::Node*> const& bc_nodes = _bc_mesh.getNodes();
+    DBUG(
+        "Found %d nodes for Dirichlet BCs for the variable %d and "
+        "component "
+        "%d",
+        bc_nodes.size(), variable_id, component_id);
+
+    MeshLib::MeshSubset bc_mesh_subset(_bc_mesh, bc_nodes);
+
+    // Create local DOF table from the BC mesh subset for the given variable
+    // and component id.
+    _dof_table_boundary.reset(dof_table_bulk.deriveBoundaryConstrainedMap(
+        variable_id, {component_id}, std::move(bc_mesh_subset)));
+}
+
 void DirichletBoundaryCondition::getEssentialBCValues(
+    const double t, GlobalVector const& x,
+    NumLib::IndexValueVector<GlobalIndexType>& bc_values) const
+{
+    return getEssentialBCValuesLocal(t, x, bc_values);
+}
+
+void DirichletBoundaryCondition::getEssentialBCValuesLocal(
     const double t, GlobalVector const& /*x*/,
     NumLib::IndexValueVector<GlobalIndexType>& bc_values) const
 {
diff --git a/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.h b/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.h
index 0d6ce172b6f1dfdff237730875ba030739880014..b913ca62694434540082e0f79a84cce6203b7116 100644
--- a/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.h
@@ -9,77 +9,46 @@
 
 #pragma once
 
-#include "NumLib/DOF/LocalToGlobalIndexMap.h"
-#include "NumLib/IndexValueVector.h"
-#include "ProcessLib/Parameter/Parameter.h"
 #include "BoundaryCondition.h"
 
+namespace BaseLib
+{
+class ConfigTree;
+}
+
 namespace ProcessLib
 {
+template <typename T> struct Parameter;
+
 // TODO docu
 /// The DirichletBoundaryCondition class describes a constant in space
 /// and time Dirichlet boundary condition.
 /// The expected parameter in the passed configuration is "value" which, when
 /// not present defaults to zero.
-class DirichletBoundaryCondition final : public BoundaryCondition
+class DirichletBoundaryCondition  : public BoundaryCondition
 {
 public:
     DirichletBoundaryCondition(
         Parameter<double> const& parameter, MeshLib::Mesh const& bc_mesh,
         NumLib::LocalToGlobalIndexMap const& dof_table_bulk,
-        int const variable_id, int const component_id)
-        : _parameter(parameter),
-          _bc_mesh(bc_mesh),
-          _variable_id(variable_id),
-          _component_id(component_id)
-    {
-        if (variable_id >=
-                static_cast<int>(dof_table_bulk.getNumberOfVariables()) ||
-            component_id >=
-                dof_table_bulk.getNumberOfVariableComponents(variable_id))
-        {
-            OGS_FATAL(
-                "Variable id or component id too high. Actual values: (%d, "
-                "%d), maximum values: (%d, %d).",
-                variable_id, component_id,
-                dof_table_bulk.getNumberOfVariables(),
-                dof_table_bulk.getNumberOfVariableComponents(variable_id));
-        }
-
-        if (!_bc_mesh.getProperties().existsPropertyVector<std::size_t>(
-                "bulk_node_ids"))
-        {
-            OGS_FATAL(
-                "The required bulk node ids map does not exist in the boundary "
-                "mesh '%s'.", _bc_mesh.getName().c_str());
-        }
-
-        std::vector<MeshLib::Node*> const& bc_nodes = _bc_mesh.getNodes();
-        DBUG(
-            "Found %d nodes for Dirichlet BCs for the variable %d and "
-            "component "
-            "%d",
-            bc_nodes.size(), variable_id, component_id);
-
-        MeshLib::MeshSubset bc_mesh_subset(_bc_mesh, bc_nodes);
-
-        // Create local DOF table from the BC mesh subset for the given variable
-        // and component id.
-        _dof_table_boundary.reset(dof_table_bulk.deriveBoundaryConstrainedMap(
-            variable_id, {component_id}, std::move(bc_mesh_subset)));
-    }
+        int const variable_id, int const component_id);
 
     void getEssentialBCValues(
         const double t, GlobalVector const& x,
         NumLib::IndexValueVector<GlobalIndexType>& bc_values) const override;
 
-private:
+protected:
     Parameter<double> const& _parameter;
 
     MeshLib::Mesh const& _bc_mesh;
     std::unique_ptr<NumLib::LocalToGlobalIndexMap const> _dof_table_boundary;
     int const _variable_id;
     int const _component_id;
+
+    void getEssentialBCValuesLocal(
+        const double t, GlobalVector const& x,
+        NumLib::IndexValueVector<GlobalIndexType>& bc_values) const;
+
 };
 
 std::unique_ptr<DirichletBoundaryCondition> createDirichletBoundaryCondition(