diff --git a/src/OpenFOAM/db/IOobjectList/IOobjectListTemplates.C b/src/OpenFOAM/db/IOobjectList/IOobjectListTemplates.C
index d3f5e9a9bd1c08db6754c85792b46abb7bc2b01f..2731784119bf7c24e694c616e76fb65464758faa 100644
--- a/src/OpenFOAM/db/IOobjectList/IOobjectListTemplates.C
+++ b/src/OpenFOAM/db/IOobjectList/IOobjectListTemplates.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -622,11 +622,16 @@ Foam::label Foam::IOobjectList::filterClasses
     const bool pruning
 )
 {
-//    return HashPtrTable<IOobject>::filterValues
-//    (
-//        [&](const IOobject* io){ return pred(io->headerClassName()); },
-//        pruning
-//    );
+// This is like
+// return HashPtrTable<IOobject>::filterValues
+// (
+//     [&](const IOobject* io){ return pred(io->headerClassName()); },
+//     pruning
+// );
+// which is really
+// return HashTable<IOobject*>::filterValues
+//
+// except that it does not leak
 
     label changed = 0;
 
@@ -654,7 +659,29 @@ Foam::label Foam::IOobjectList::filterObjects
     const bool pruning
 )
 {
-    return HashPtrTable<IOobject>::filterKeys(pred, pruning);
+// This is like
+// return HashPtrTable<IOobject>::filterKeys(pred, pruning);
+// which is really
+// return HashTable<IOobject*>::filterKeys(pred, pruning);
+//
+// except that it does not leak
+
+    label changed = 0;
+
+    for (iterator iter = begin(); iter != end(); ++iter)
+    {
+        // Matches? either prune (pruning) or keep (!pruning)
+        if
+        (
+            (pred(iter.key()) ? pruning : !pruning)
+         && erase(iter)
+        )
+        {
+            ++changed;
+        }
+    }
+
+    return changed;
 }