diff --git a/openpnm/core/Base.py b/openpnm/core/Base.py
index d1e2840ad..7b66f3993 100644
--- a/openpnm/core/Base.py
+++ b/openpnm/core/Base.py
@@ -251,6 +251,14 @@ class Base(dict):
             raise KeyError(key)
         return vals
 
+    def __delitem__(self, key):
+        try:
+            super().__delitem__(key)
+        except KeyError as e:
+            d = self[key]  # if key is a nested dict, get all values
+            for item in d.keys():
+                super().__delitem__(item)
+
     def _set_name(self, name, validate=True):
         old_name = self.settings['name']
         if name == old_name:

diff --git a/tests/unit/core/BaseTest.py b/tests/unit/core/BaseTest.py
index f82d99875..18ed0ae18 100644
--- a/tests/unit/core/BaseTest.py
+++ b/tests/unit/core/BaseTest.py
@@ -930,6 +930,19 @@ class BaseTest:
         with pytest.raises(KeyError):
             pn.get_conduit_data('blah')
 
+    def test_del_nested_dicts(self):
+        pn = op.network.Cubic(shape=[3, 3, 3])
+        geo = op.geometry.SpheresAndCylinders(network=pn,
+                                              pores=pn.Ps,
+                                              throats=pn.Ts)
+        assert 'throat.hydraulic_size_factors.pore1' in geo.keys()
+        del geo['throat.hydraulic_size_factors']
+        assert 'throat.hydraulic_size_factors.pore1' not in geo.keys()
+        with pytest.raises(KeyError):
+            geo['throat.hydraulic_size_factors']
+        with pytest.raises(KeyError):
+            del geo['pore.blah']
+
 
 if __name__ == '__main__':
 

Add the ability to delete hirarchical dictionary keys in one go
# Intended
```python
del geo['throat.conduit_lengths']  # this currently doesn't work
```
# Current
```python
del geo['throat.conduit_lengths.pore1']
del geo['throat.conduit_lengths.pore2']
del geo['throat.conduit_lengths.throat']
```
tests/unit/core/BaseTest.py::BaseTest::test_del_nested_dicts
tests/unit/core/BaseTest.py::BaseTest::test_clear_model_data tests/unit/core/BaseTest.py::BaseTest::test_clear_model_data_when_model_returns_dictionary tests/unit/core/BaseTest.py::BaseTest::test_pores tests/unit/core/BaseTest.py::BaseTest::test_pores_one_label tests/unit/core/BaseTest.py::BaseTest::test_pores_two_labels_or tests/unit/core/BaseTest.py::BaseTest::test_pores_two_labels_xnor tests/unit/core/BaseTest.py::BaseTest::test_pores_two_labels_not_xor tests/unit/core/BaseTest.py::BaseTest::test_pores_two_labels_nor tests/unit/core/BaseTest.py::BaseTest::test_pores_two_labels_nand tests/unit/core/BaseTest.py::BaseTest::test_pores_bad_mode tests/unit/core/BaseTest.py::BaseTest::test_pores_empty_list tests/unit/core/BaseTest.py::BaseTest::test_pores_asmask tests/unit/core/BaseTest.py::BaseTest::test_pores_and_throats_with_to_global tests/unit/core/BaseTest.py::BaseTest::test_throats tests/unit/core/BaseTest.py::BaseTest::test_throats_asmask tests/unit/core/BaseTest.py::BaseTest::test_throats_one_label tests/unit/core/BaseTest.py::BaseTest::test_throats_two_labels_or tests/unit/core/BaseTest.py::BaseTest::test_throats_two_labels_xnor tests/unit/core/BaseTest.py::BaseTest::test_throats_two_labels_xor tests/unit/core/BaseTest.py::BaseTest::test_filter_by_label_pores_no_label tests/unit/core/BaseTest.py::BaseTest::test_filter_by_label_pores_one_label_as_string tests/unit/core/BaseTest.py::BaseTest::test_filter_by_label_pores_one_label_as_list tests/unit/core/BaseTest.py::BaseTest::test_filter_by_label_pores_two_labels_or tests/unit/core/BaseTest.py::BaseTest::test_filter_by_label_pores_two_labels_xnor tests/unit/core/BaseTest.py::BaseTest::test_filter_by_label_pores_two_labels_xnor_empty tests/unit/core/BaseTest.py::BaseTest::test_filter_by_label_pores_two_labels_xor tests/unit/core/BaseTest.py::BaseTest::test_filter_by_label_pores_two_labels_nor tests/unit/core/BaseTest.py::BaseTest::test_filter_by_label_empty_locations tests/unit/core/BaseTest.py::BaseTest::test_filter_by_label_pores_and_throats tests/unit/core/BaseTest.py::BaseTest::test_tomask_pores tests/unit/core/BaseTest.py::BaseTest::test_tomask_throats tests/unit/core/BaseTest.py::BaseTest::test_tomask_pores_and_throats tests/unit/core/BaseTest.py::BaseTest::test_toindices_pores tests/unit/core/BaseTest.py::BaseTest::test_toindices_throats tests/unit/core/BaseTest.py::BaseTest::test_toindices_float_mask tests/unit/core/BaseTest.py::BaseTest::test_toindices_invalid_mask tests/unit/core/BaseTest.py::BaseTest::test_toindices_wrong_mask tests/unit/core/BaseTest.py::BaseTest::test_count tests/unit/core/BaseTest.py::BaseTest::test_num_pores tests/unit/core/BaseTest.py::BaseTest::test_num_pores_one_label tests/unit/core/BaseTest.py::BaseTest::test_num_pores_two_labels_or tests/unit/core/BaseTest.py::BaseTest::test_num_pores_two_labels_xnor tests/unit/core/BaseTest.py::BaseTest::test_num_pores_two_labels_xor tests/unit/core/BaseTest.py::BaseTest::test_num_pores_two_labels_nor tests/unit/core/BaseTest.py::BaseTest::test_num_throats tests/unit/core/BaseTest.py::BaseTest::test_num_throats_one_label tests/unit/core/BaseTest.py::BaseTest::test_num_throats_two_labels_or tests/unit/core/BaseTest.py::BaseTest::test_num_throats_two_labels_xnor tests/unit/core/BaseTest.py::BaseTest::test_num_throats_two_labels_xor tests/unit/core/BaseTest.py::BaseTest::test_num_throats_two_labels_nor tests/unit/core/BaseTest.py::BaseTest::test_keys_mode_skip tests/unit/core/BaseTest.py::BaseTest::test_keys_mode_props tests/unit/core/BaseTest.py::BaseTest::test_keys_mode_labels tests/unit/core/BaseTest.py::BaseTest::test_keys_element_pores_mode_all tests/unit/core/BaseTest.py::BaseTest::test_keys_element_throats_mode_all tests/unit/core/BaseTest.py::BaseTest::test_keys_mode_props_and_labels tests/unit/core/BaseTest.py::BaseTest::test_props_all tests/unit/core/BaseTest.py::BaseTest::test_props_models tests/unit/core/BaseTest.py::BaseTest::test_props_constants tests/unit/core/BaseTest.py::BaseTest::test_props_pores_all tests/unit/core/BaseTest.py::BaseTest::test_props_pores_models tests/unit/core/BaseTest.py::BaseTest::test_props_pores_constants tests/unit/core/BaseTest.py::BaseTest::test_props_hidden_keys tests/unit/core/BaseTest.py::BaseTest::test_labels tests/unit/core/BaseTest.py::BaseTest::test_labels_on_pores tests/unit/core/BaseTest.py::BaseTest::test_labels_on_throats tests/unit/core/BaseTest.py::BaseTest::test_labels_on_pores_and_throats tests/unit/core/BaseTest.py::BaseTest::test_labels_on_foo tests/unit/core/BaseTest.py::BaseTest::test_labels_on_all_pores tests/unit/core/BaseTest.py::BaseTest::test_labels_on_all_throats tests/unit/core/BaseTest.py::BaseTest::test_labels_on_one_pore tests/unit/core/BaseTest.py::BaseTest::test_labels_on_list_of_pores tests/unit/core/BaseTest.py::BaseTest::test_labels_locations_boolean tests/unit/core/BaseTest.py::BaseTest::test_labels_pores_mode_or tests/unit/core/BaseTest.py::BaseTest::test_labels_pores_mode_and tests/unit/core/BaseTest.py::BaseTest::test_labels_pores_mode_xor tests/unit/core/BaseTest.py::BaseTest::test_labels_pores_mode_nand tests/unit/core/BaseTest.py::BaseTest::test_labels_pores_mode_xnor tests/unit/core/BaseTest.py::BaseTest::test_labels_pores_mode_nor tests/unit/core/BaseTest.py::BaseTest::test_labels_pores_mode_foo tests/unit/core/BaseTest.py::BaseTest::test_labels_hidden_key tests/unit/core/BaseTest.py::BaseTest::test_parse_indices_boolean tests/unit/core/BaseTest.py::BaseTest::test_parse_indices_None tests/unit/core/BaseTest.py::BaseTest::test_parse_indices_int tests/unit/core/BaseTest.py::BaseTest::test_parse_indices_list tests/unit/core/BaseTest.py::BaseTest::test_parse_element_None tests/unit/core/BaseTest.py::BaseTest::test_parse_element_various_strings tests/unit/core/BaseTest.py::BaseTest::test_parse_element_bad_string tests/unit/core/BaseTest.py::BaseTest::test_parse_element_duplicate tests/unit/core/BaseTest.py::BaseTest::test_parse_element_single_true tests/unit/core/BaseTest.py::BaseTest::test_parse_element_props tests/unit/core/BaseTest.py::BaseTest::test_parse_labels_none tests/unit/core/BaseTest.py::BaseTest::test_parse_labels_string tests/unit/core/BaseTest.py::BaseTest::test_parse_labels_wildcards tests/unit/core/BaseTest.py::BaseTest::test_parse_labels_duplicates tests/unit/core/BaseTest.py::BaseTest::test_parse_mode_string tests/unit/core/BaseTest.py::BaseTest::test_parse_mode_single tests/unit/core/BaseTest.py::BaseTest::test_parse_mode_allowed tests/unit/core/BaseTest.py::BaseTest::test_parse_mode_duplicate tests/unit/core/BaseTest.py::BaseTest::test_setitem_wrong_prefix tests/unit/core/BaseTest.py::BaseTest::test_setitem_wrong_length tests/unit/core/BaseTest.py::BaseTest::test_setitem_replace_all tests/unit/core/BaseTest.py::BaseTest::test_setitem_overwrite_into_all tests/unit/core/BaseTest.py::BaseTest::test_setitem_subdict_conflicts tests/unit/core/BaseTest.py::BaseTest::test_object_name_name_conflict tests/unit/core/BaseTest.py::BaseTest::test_object_name_array_conflict tests/unit/core/BaseTest.py::BaseTest::test_get_indices tests/unit/core/BaseTest.py::BaseTest::test_get_indices_wildcard tests/unit/core/BaseTest.py::BaseTest::test_write_dict tests/unit/core/BaseTest.py::BaseTest::test_map_pores tests/unit/core/BaseTest.py::BaseTest::test_map_throats tests/unit/core/BaseTest.py::BaseTest::test_map_pores_unfiltered tests/unit/core/BaseTest.py::BaseTest::test_map_pores_unfiltered_missing tests/unit/core/BaseTest.py::BaseTest::test_map_pores_reverse tests/unit/core/BaseTest.py::BaseTest::test_map_pores_missing tests/unit/core/BaseTest.py::BaseTest::test_getitem_with_no_matches tests/unit/core/BaseTest.py::BaseTest::test_interpolate_data tests/unit/core/BaseTest.py::BaseTest::test_get_no_matches tests/unit/core/BaseTest.py::BaseTest::test_get_string tests/unit/core/BaseTest.py::BaseTest::test_subdict_getitem_on_network_from_network tests/unit/core/BaseTest.py::BaseTest::test_subdict_getitem_on_network_from_one_geometry tests/unit/core/BaseTest.py::BaseTest::test_subdict_getitem_on_network_from_two_geometries tests/unit/core/BaseTest.py::BaseTest::test_subdict_getitem_on_phase_from_phase tests/unit/core/BaseTest.py::BaseTest::test_subdict_getitem_on_phase_from_one_physics tests/unit/core/BaseTest.py::BaseTest::test_subdict_getitem_on_phase_from_two_physics tests/unit/core/BaseTest.py::BaseTest::test_subdict_getitem_on_one_geometry tests/unit/core/BaseTest.py::BaseTest::test_subdict_lookup_errors tests/unit/core/BaseTest.py::BaseTest::test_set_label_add_to_pores tests/unit/core/BaseTest.py::BaseTest::test_set_label_add_to_throats tests/unit/core/BaseTest.py::BaseTest::test_set_label_overwrite_on_pores tests/unit/core/BaseTest.py::BaseTest::test_set_label_overwrite_on_throats tests/unit/core/BaseTest.py::BaseTest::test_set_label_remove_from_pores tests/unit/core/BaseTest.py::BaseTest::test_set_label_remove_from_throats tests/unit/core/BaseTest.py::BaseTest::test_set_label_purge_from_pores tests/unit/core/BaseTest.py::BaseTest::test_set_label_purge_from_throats tests/unit/core/BaseTest.py::BaseTest::test_set_label_purge_nonexistent_label tests/unit/core/BaseTest.py::BaseTest::test_renaming_to_current_name_is_allowed tests/unit/core/BaseTest.py::BaseTest::test_object_names_must_be_unique_within_project tests/unit/core/BaseTest.py::BaseTest::test_get_conduit_data