diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
index 4365f48f8328824344c95310da63293da6755fa7..270433a5725e896e8ded14746dc265291edfbf13 100644
--- a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
@@ -56,6 +56,26 @@ std::unique_ptr<BoundaryCondition> createBoundaryCondition(
         // is defined.
         std::vector<std::size_t> ids =
             mesh_node_searcher.getMeshNodeIDs(config.geometry);
+        // Filter out ids, which are not part of mesh subsets corresponding to
+        // the variable_id and component_id.
+        auto const& mesh_subsets =
+            dof_table.getMeshSubsets(variable_id, config.component_id);
+        auto ids_new_end_iterator = std::end(ids);
+        for (auto const& mesh_subset : mesh_subsets)
+        {
+            auto const& nodes = mesh_subset->getNodes();
+            ids_new_end_iterator = std::remove_if(std::begin(ids), ids_new_end_iterator,
+                    [&nodes](std::size_t const node_id)
+                    {
+                        return std::end(nodes) == std::find_if(
+                                std::begin(nodes), std::end(nodes),
+                                    [&node_id](MeshLib::Node* const node)
+                                    {
+                                        return node->getID() == node_id;
+                                    });
+                    });
+        }
+        ids.erase(ids_new_end_iterator, std::end(ids));
 
         return createDirichletBoundaryCondition(
             config.config, std::move(ids), dof_table, mesh.getID(), variable_id,