diff --git a/gdecore/database_storage.py b/gdecore/database_storage.py
index 96909c44d1a28209d97f6dc8e1efcb92704c86c0..373732e476c38825435888866150424737433174 100644
--- a/gdecore/database_storage.py
+++ b/gdecore/database_storage.py
@@ -163,7 +163,11 @@ class DatabaseStorage:
         probabilities for each of the OBM buildings in 'obm_buildings_building_classes'.
         Reference to the corresponding 'data_unit_id', 'occupancy_case' and
         'aggregated_source_id' is needed to be able (at a later stage) to retrieve attributes of
-        the building classes.
+        the building classes. All existing entries for this combination of 'data_unit_id' AND
+        'occupancy_case' AND 'aggregated_source_id' are first erased. If an entry existed for a
+        particular OSM ID and 'aggregated_source_id' but it belonged to a different
+        'data_unit_id' and/or 'occupancy_case', both 'data_unit_id' and 'occupancy_case' are
+        updated to the new values passed to this method.
 
         Args:
             data_unit_id (str):
@@ -246,6 +250,9 @@ class DatabaseStorage:
 
         sql_commands = {}
 
+        sql_commands["delete_previous"] = "DELETE FROM %s WHERE (data_unit_id='%s' AND "
+        sql_commands["delete_previous"] += "occupancy_case='%s' AND aggregated_source_id=%s);"
+
         sql_commands["query"] = "SELECT COUNT(*) FROM %s "
         sql_commands["query"] += "WHERE (osm_id=%s AND aggregated_source_id=%s);"
 
@@ -264,6 +271,13 @@ class DatabaseStorage:
         db_gde_tiles = Database(**db_gde_tiles_config)
         db_gde_tiles.create_connection_and_cursor()
 
+        # Delete all existing entries for this combination of
+        # (data_unit_id AND occupancy_case AND aggregated_source_id)
+        db_gde_tiles.cursor.execute(
+            sql_commands["delete_previous"]
+            % (db_table, data_unit_id, occupancy_case, aggregated_source_id)
+        )
+
         for osm_id in obm_buildings_building_classes.keys():
             building_classes = obm_buildings_building_classes[osm_id]
 
diff --git a/tests/data/test_database_set_up.sql b/tests/data/test_database_set_up.sql
index b86fac63df8b84aa45d1952dc6af79a1c9bb24fd..9d3d98c04dcd747c87970021cb580c38c7791686 100644
--- a/tests/data/test_database_set_up.sql
+++ b/tests/data/test_database_set_up.sql
@@ -242,10 +242,19 @@ INSERT INTO gde_buildings(osm_id,
                           building_class_names,
                           settlement_types,
                           occupancy_subtypes,
-                          probabilities)
+                          probabilities,
+                          geometry)
 VALUES (-101010, 2, 'industrial', 'ABC_10269', '333333333333333333',
         '{"CLASS/X/params/H:1", "CLASS/Y/params/H:2"}',
         '{"rural", "rural"}',
         '{"all", "all"}',
-        '{0.723, 0.277}'
-       );
+        '{0.723, 0.277}',
+        ST_GeomFromText('POLYGON((15.0491 37.4811,15.0494 37.4814,15.0495 37.4813,15.0497 37.4812,15.0495 37.4811,15.0494 37.4812,15.0492 37.4810,15.0491 37.4811))')
+       ),
+(99999999, 2, 'residential', 'ABC_10269', '333333333333333333',
+ '{"CLASS/X/params/H:1", "CLASS/Y/params/H:2"}',
+ '{"rural", "rural"}',
+ '{"all", "all"}',
+ '{0.6, 0.4}',
+ ST_GeomFromText('POLYGON((0.0 0.0,0.002 0.0,0.002 0.003,0.0 0.003,0.0 0.0))')
+);
diff --git a/tests/test_database_storage.py b/tests/test_database_storage.py
index 9b96b7cc44dbd77a626069467f746b8cc88aca0f..ca5181017f5c45b9f0842054ab7069600029bd10 100644
--- a/tests/test_database_storage.py
+++ b/tests/test_database_storage.py
@@ -132,6 +132,23 @@ def test_store_OBM_building_classes(test_db):
         os.path.join(os.path.dirname(__file__), "data", "config_for_testing_good.yml")
     )
 
+    # Check that an certain entry for this combination of 'data_unit_id' AND 'occupancy_case'
+    # AND 'aggregated_source_id' exists in the database (it should later be erased by
+    # DatabaseStorage.store_OBM_building_classes())
+    (
+        returned_occupancy_case,
+        returned_data_unit_id,
+        returned_quadkey,
+        returned_building_class_names,
+        returned_settlement_types,
+        returned_occupancy_subtypes,
+        returned_probabilities,
+        returned_geometry,
+    ) = query_OBM_building_classes(config.database_gde_tiles, 99999999, 2)
+
+    assert returned_data_unit_id == "ABC_10269"
+    assert returned_occupancy_case == "residential"
+
     obm_bdg_classes = {}
     obm_bdg_classes[11223344] = pandas.DataFrame(
         {
@@ -207,6 +224,23 @@ def test_store_OBM_building_classes(test_db):
             obm_bdg_classes[11223344]["probabilities"].to_numpy()[which], 4
         )
 
+    # Check that an existing entry for this combination of 'data_unit_id' AND 'occupancy_case'
+    # AND 'aggregated_source_id' was erased from the database by
+    # DatabaseStorage.store_OBM_building_classes()
+    (
+        returned_occupancy_case,
+        returned_data_unit_id,
+        returned_quadkey,
+        returned_building_class_names,
+        returned_settlement_types,
+        returned_occupancy_subtypes,
+        returned_probabilities,
+        returned_geometry,
+    ) = query_OBM_building_classes(config.database_gde_tiles, 99999999, 2)
+
+    assert returned_data_unit_id is None
+    assert returned_occupancy_subtypes is None
+
     obm_bdg_classes = {}
     obm_bdg_classes[-101010] = pandas.DataFrame(
         {
@@ -364,18 +398,27 @@ def query_OBM_building_classes(credentials, osm_id, aggregated_source_id):
     db_test.create_connection_and_cursor()
     db_test.cursor.execute(sql_command)
     result = db_test.cursor.fetchall()
-
-    occupancy_case = result[0][0]
-    data_unit_id = result[0][1]
-    quadkey = result[0][2]
-    building_class_names = result[0][3]
-    settlement_types = result[0][4].replace("{", "").replace("}", "").split(",")
-    occupancy_subtypes = result[0][5]
-    probabilities = result[0][6]
-    geometry = shapely.wkb.loads(result[0][7], hex=True)
-
     db_test.close_connection()
 
+    if len(result) > 0:
+        occupancy_case = result[0][0]
+        data_unit_id = result[0][1]
+        quadkey = result[0][2]
+        building_class_names = result[0][3]
+        settlement_types = result[0][4].replace("{", "").replace("}", "").split(",")
+        occupancy_subtypes = result[0][5]
+        probabilities = result[0][6]
+        geometry = shapely.wkb.loads(result[0][7], hex=True)
+    else:
+        occupancy_case = None
+        data_unit_id = None
+        quadkey = None
+        building_class_names = None
+        settlement_types = None
+        occupancy_subtypes = None
+        probabilities = None
+        geometry = None
+
     return (
         occupancy_case,
         data_unit_id,