diff --git a/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp
index 0766abc63371ebf994dce48e57230b3fb96f9d18..4a665b0526ba67ae29d57082530d9ba170882226 100644
--- a/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/CreateBoundaryCondition.cpp
@@ -123,11 +123,27 @@ std::unique_ptr<BoundaryCondition> createBoundaryCondition(
     }
     if (type == "NormalTraction")
     {
-        return ProcessLib::NormalTractionBoundaryCondition::
-            createNormalTractionBoundaryCondition(
-                config.config, config.boundary_mesh, dof_table, variable_id,
-                integration_order, shapefunction_order,
-                bulk_mesh.getDimension(), parameters);
+        switch (bulk_mesh.getDimension())
+        {
+            case 2:
+                return ProcessLib::NormalTractionBoundaryCondition::
+                    createNormalTractionBoundaryCondition<2>(
+                        config.config, config.boundary_mesh, dof_table,
+                        variable_id, integration_order, shapefunction_order,
+                        parameters);
+            case 3:
+                return ProcessLib::NormalTractionBoundaryCondition::
+                    createNormalTractionBoundaryCondition<3>(
+                        config.config, config.boundary_mesh, dof_table,
+                        variable_id, integration_order, shapefunction_order,
+                        parameters);
+            default:
+                OGS_FATAL(
+                    "NormalTractionBoundaryCondition can not be instantiated "
+                    "for mesh dimensions other than two or three. "
+                    "{}-dimensional mesh was given.",
+                    bulk_mesh.getDimension());
+        }
     }
     if (type == "PhaseFieldIrreversibleDamageOracleBoundaryCondition")
     {
diff --git a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h
index b9e114b60a9a017137905078cd9f8a5d31aa17f7..bbb047ecf80a2050489f795d29de2e755481b1fb 100644
--- a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h
+++ b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h
@@ -22,14 +22,13 @@ namespace ProcessLib
 {
 namespace NormalTractionBoundaryCondition
 {
-template <template <typename, typename, unsigned>
-          class LocalAssemblerImplementation>
-NormalTractionBoundaryCondition<LocalAssemblerImplementation>::
+template <int GlobalDim, template <typename, typename, unsigned>
+                         class LocalAssemblerImplementation>
+NormalTractionBoundaryCondition<GlobalDim, LocalAssemblerImplementation>::
     NormalTractionBoundaryCondition(
         unsigned const integration_order, unsigned const shapefunction_order,
         NumLib::LocalToGlobalIndexMap const& dof_table_bulk,
-        int const variable_id, unsigned const global_dim,
-        MeshLib::Mesh const& bc_mesh,
+        int const variable_id, MeshLib::Mesh const& bc_mesh,
         ParameterLib::Parameter<double> const& pressure)
     : _bc_mesh(bc_mesh),
       _integration_order(integration_order),
@@ -53,15 +52,15 @@ NormalTractionBoundaryCondition<LocalAssemblerImplementation>::
     _dof_table_boundary.reset(dof_table_bulk.deriveBoundaryConstrainedMap(
         variable_id, component_ids, std::move(bc_mesh_subset)));
 
-    createLocalAssemblers<LocalAssemblerImplementation>(
-        global_dim, _bc_mesh.getElements(), *_dof_table_boundary,
-        shapefunction_order, _local_assemblers, _bc_mesh.isAxiallySymmetric(),
-        _integration_order, _pressure);
+    createLocalAssemblers<GlobalDim, LocalAssemblerImplementation>(
+        *_dof_table_boundary, shapefunction_order, _bc_mesh.getElements(),
+        _local_assemblers, _bc_mesh.isAxiallySymmetric(), _integration_order,
+        _pressure);
 }
 
-template <template <typename, typename, unsigned>
-          class LocalAssemblerImplementation>
-void NormalTractionBoundaryCondition<LocalAssemblerImplementation>::
+template <int GlobalDim, template <typename, typename, unsigned>
+                         class LocalAssemblerImplementation>
+void NormalTractionBoundaryCondition<GlobalDim, LocalAssemblerImplementation>::
     applyNaturalBC(const double t, std::vector<GlobalVector*> const& x,
                    int const /*process_id*/, GlobalMatrix& K, GlobalVector& b,
                    GlobalMatrix* Jac)
@@ -71,13 +70,13 @@ void NormalTractionBoundaryCondition<LocalAssemblerImplementation>::
         _local_assemblers, *_dof_table_boundary, t, x, K, b, Jac);
 }
 
+template <int GlobalDim>
 std::unique_ptr<NormalTractionBoundaryCondition<
-    NormalTractionBoundaryConditionLocalAssembler>>
+    GlobalDim, NormalTractionBoundaryConditionLocalAssembler>>
 createNormalTractionBoundaryCondition(
     BaseLib::ConfigTree const& config, MeshLib::Mesh const& bc_mesh,
     NumLib::LocalToGlobalIndexMap const& dof_table, int const variable_id,
     unsigned const integration_order, unsigned const shapefunction_order,
-    unsigned const global_dim,
     std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters)
 {
     DBUG("Constructing NormalTractionBoundaryCondition from config.");
@@ -92,9 +91,9 @@ createNormalTractionBoundaryCondition(
     auto const& pressure = ParameterLib::findParameter<double>(
         parameter_name, parameters, 1, &bc_mesh);
     return std::make_unique<NormalTractionBoundaryCondition<
-        NormalTractionBoundaryConditionLocalAssembler>>(
-        integration_order, shapefunction_order, dof_table, variable_id,
-        global_dim, bc_mesh, pressure);
+        GlobalDim, NormalTractionBoundaryConditionLocalAssembler>>(
+        integration_order, shapefunction_order, dof_table, variable_id, bc_mesh,
+        pressure);
 }
 
 }  // namespace NormalTractionBoundaryCondition
diff --git a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h
index 346f579add809dd88cfe959afd86d8bc48934bbd..423ab2c6ff939f4c1cb13de39d19b551be34deb4 100644
--- a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h
@@ -27,8 +27,8 @@ class NormalTractionBoundaryConditionLocalAssemblerInterface;
 ///      \bar{t} := \sigma \mathbf{n} = p \mathbf{n},
 /// \f]
 /// where \f$p\f$ is the value on the boundary given by the parameter tag.
-template <template <typename, typename, unsigned>
-          class LocalAssemblerImplementation>
+template <int GlobalDim, template <typename, typename, unsigned>
+                         class LocalAssemblerImplementation>
 class NormalTractionBoundaryCondition final : public BoundaryCondition
 {
 public:
@@ -38,8 +38,7 @@ public:
     NormalTractionBoundaryCondition(
         unsigned const integration_order, unsigned const shapefunction_order,
         NumLib::LocalToGlobalIndexMap const& dof_table_bulk,
-        int const variable_id, unsigned const global_dim,
-        MeshLib::Mesh const& bc_mesh,
+        int const variable_id, MeshLib::Mesh const& bc_mesh,
         ParameterLib::Parameter<double> const& pressure);
 
     /// Calls local assemblers which calculate their contributions to the global
@@ -72,13 +71,13 @@ private:
     ParameterLib::Parameter<double> const& _pressure;
 };
 
+template <int GlobalDim>
 std::unique_ptr<NormalTractionBoundaryCondition<
-    NormalTractionBoundaryConditionLocalAssembler>>
+    GlobalDim, NormalTractionBoundaryConditionLocalAssembler>>
 createNormalTractionBoundaryCondition(
     BaseLib::ConfigTree const& config, MeshLib::Mesh const& bc_mesh,
     NumLib::LocalToGlobalIndexMap const& dof_table, int const variable_id,
     unsigned const integration_order, unsigned const shapefunction_order,
-    unsigned const global_dim,
     std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const&
         parameters);