diff --git a/patches/patch20240127-8.0-SNAPSHOT/patch.sql b/patches/patch20240127-8.0-SNAPSHOT/patch.sql
index 18f1b3e22dce7470c0ccbf2fa29d908dad0efcc9..02faf660a17973a333034a4007c521969da4b0b5 100644
--- a/patches/patch20240127-8.0-SNAPSHOT/patch.sql
+++ b/patches/patch20240127-8.0-SNAPSHOT/patch.sql
@@ -40,7 +40,7 @@ ALTER TABLE archive_files DROP COLUMN hash;
 
 -- Add new fields to files table...
 ALTER TABLE files ADD COLUMN IF NOT EXISTS (
-    hash_algorithm VARBINARY(255) NULL DEFAULT NULL,
+    hash_algorithm VARBINARY(255) NULL DEFAULT 'SHA-512',
     parent_directory INT UNSIGNED DEFAULT NULL,
     mimetype VARBINARY(255) DEFAULT NULL,
     file_storage_id VARBINARY(255) NOT NULL DEFAULT "DEFAULT",
@@ -50,7 +50,7 @@ ALTER TABLE files ADD COLUMN IF NOT EXISTS (
 -- ... and to the corresponding archive_files table.
 ALTER TABLE archive_files ADD COLUMN IF NOT EXISTS (
     checked_timestamp BIGINT NOT NULL DEFAULT 0,
-    hash_algorithm VARBINARY(255) NULL DEFAULT NULL,
+    hash_algorithm VARBINARY(255) NULL DEFAULT 'SHA-512',
     parent_directory INT UNSIGNED DEFAULT NULL,
     mimetype VARBINARY(255) DEFAULT NULL,
     file_storage_id VARBINARY(255) NOT NULL DEFAULT "DEFAULT",
@@ -64,7 +64,7 @@ ALTER TABLE files ADD FOREIGN KEY (parent_directory) REFERENCES entities (id);
 ALTER TABLE archive_files ADD FOREIGN KEY (parent_directory) REFERENCES entities (id) ON DELETE CASCADE;
 
 
-ALTER TABLE entities MODIFY COLUMN `role` enum('RECORDTYPE','RECORD','FILE','DOMAIN','PROPERTY','DATATYPE','ROLE','QUERYTEMPLATE', 'DIRECTORY') COLLATE utf8_unicode_ci NOT NULL;
+ALTER TABLE entities MODIFY COLUMN `role` enum('RECORDTYPE','RECORD','FILE','_REPLACEMENT','PROPERTY','DATATYPE','ROLE','QUERYTEMPLATE', 'DIRECTORY') COLLATE utf8_unicode_ci NOT NULL;
 
 -- Add a new special role "DIRECTORY"
 INSERT IGNORE INTO entities (id, description, role, acl) VALUES (9, "The directory role.", "ROLE", 0);
@@ -146,9 +146,7 @@ BEGIN
                 -- this is the case when all parent directories of the current file have been processed.
                 SET dir_exists = FALSE;
                 SET done = FALSE;
-                LEAVE loop2;
-            END IF;
-
+                LEAVE loop2; END IF;
             -- remove the trailing slash for convenience.
             SET dir_path_no_trailing_slash = LEFT(dir_path, CHAR_LENGTH(dir_path)-1);
 
diff --git a/tests/test_autotap.sql b/tests/test_autotap.sql
index 117c9a63ebb6fcf53d7e5fc4a7968f9aa9a733b9..ea575acf1372b25a900bc8fc9a3e473e39cdc572 100644
--- a/tests/test_autotap.sql
+++ b/tests/test_autotap.sql
@@ -724,7 +724,7 @@ SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entities','description'
 -- COLUMN entities.role
 
 SELECT tap.has_column('_caosdb_schema_unit_tests','entities','role','');
-SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entities','role','enum(\'RECORDTYPE\',\'RECORD\',\'FILE\',\'_REPLACEMENT\',\'PROPERTY\',\'DATATYPE\',\'ROLE\',\'QUERYTEMPLATE\')','');
+SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entities','role','enum(\'RECORDTYPE\',\'RECORD\',\'FILE\',\'_REPLACEMENT\',\'PROPERTY\',\'DATATYPE\',\'ROLE\',\'QUERYTEMPLATE\',\'DIRECTORY\')','');
 SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entities','role','','');
 SELECT tap.col_default_is('_caosdb_schema_unit_tests','entities','role',NULL,'');
 SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entities','role','utf8','');
@@ -909,15 +909,15 @@ SELECT tap.table_collation_is('_caosdb_schema_unit_tests','files','utf8_unicode_
 SELECT tap.table_engine_is('_caosdb_schema_unit_tests','files','InnoDB','');
 
 -- COLUMNS
-SELECT tap.columns_are('_caosdb_schema_unit_tests','files','`file_id`,`path`,`size`,`hash`,`hash_algorithm`,`checked_timestamp`,`mimetype`,`file_storage_id`,`file_key`','');
+SELECT tap.columns_are('_caosdb_schema_unit_tests','files','`file_id`,`path`,`size`,`hash`,`hash_algorithm`,`checked_timestamp`,`mimetype`,`file_storage_id`,`file_key`,`parent_directory`','');
 
----- TODO COLUMN files.parent_directory
---SELECT tap.has_column('_caosdb_schema_unit_tests','files','parent_directory','');
---SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','parent_directory','int(10) unsigned','');
---SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','parent_directory','','');
---SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','parent_directory','NULL','');
---SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','parent_directory',NULL,'');
---SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','parent_directory',NULL,'');
+-- TODO COLUMN files.parent_directory
+SELECT tap.has_column('_caosdb_schema_unit_tests','files','parent_directory','');
+SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','parent_directory','int(10) unsigned','');
+SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','parent_directory','','');
+SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','parent_directory','NULL','');
+SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','parent_directory',NULL,'');
+SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','parent_directory',NULL,'');
 
 -- TODO COLUMN files.hash_algorithm
 SELECT tap.has_column('_caosdb_schema_unit_tests','files','hash_algorithm','');
@@ -974,7 +974,7 @@ SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','path','utf8_uni
 SELECT tap.has_column('_caosdb_schema_unit_tests','files','size','');
 SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','size','bigint(20) unsigned','');
 SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','size','','');
-SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','size',NULL,'');
+SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','size','NULL','');
 SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','size',NULL,'');
 SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','size',NULL,'');
 
@@ -997,7 +997,7 @@ SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','checked_timestamp
 SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','checked_timestamp',NULL,'');
 
 -- CONSTRAINTS
-SELECT tap.constraints_are('_caosdb_schema_unit_tests','files','`PRIMARY`,`fil_file_id_entity`,`path`','');
+SELECT tap.constraints_are('_caosdb_schema_unit_tests','files','`PRIMARY`,`fil_file_id_entity`,`path`,`files_ibfk_1`','');
 
 -- CONSTRAINT files.fil_file_id_entity
 
@@ -1006,6 +1006,12 @@ SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','files','fil_file_id_e
 SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','files','fil_file_id_entity','RESTRICT','');
 SELECT tap.fk_on_update('_caosdb_schema_unit_tests','files','fil_file_id_entity','RESTRICT','');
 
+-- CONSTRAINT files.files_ibfk_1
+
+SELECT tap.has_constraint('_caosdb_schema_unit_tests','files','files_ibfk_1','');
+SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','files','files_ibfk_1','FOREIGN KEY','');
+SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','files','files_ibfk_1','RESTRICT','');
+SELECT tap.fk_on_update('_caosdb_schema_unit_tests','files','files_ibfk_1','RESTRICT','');
 -- CONSTRAINT files.PRIMARY
 
 SELECT tap.has_constraint('_caosdb_schema_unit_tests','files','PRIMARY','');
diff --git a/tests/test_directory_patch.sql b/tests/test_directory_patch.sql
new file mode 100644
index 0000000000000000000000000000000000000000..24da84e58cc6c4a596d56a1a26461ca8b2b24bf2
--- /dev/null
+++ b/tests/test_directory_patch.sql
@@ -0,0 +1,39 @@
+
+USE _caosdb_schema_unit_tests;
+
+BEGIN;
+CALL tap.no_plan();
+
+-- SETUP
+INSERT INTO entities (id, role, acl) VALUES
+(52, "FILE", 0),
+(53, "FILE", 0),
+(54, "FILE", 0),
+(55, "FILE", 0),
+(56, "FILE", 0),
+(57, "FILE", 0);
+
+
+INSERT INTO files (file_id, path, size, file_key) VALUES
+(52, "file_at_root_a", 256, "file_at_root_a"),
+(53, "file_at_root_b", 256, "file_at_root_b"),
+(54, "level1/file_at_level1_a", 256, "level1/file_at_level1_a"),
+(55, "level1/file_at_level1_b", 256, "level1/file_at_level1_b"),
+(56, "level1/level2/file_at_level2_a", 256, "level1/level2/file_at_level2_a"),
+(57, "level1/level2/file_at_level2_b", 256, "level1/level2/file_at_level2_b");
+
+
+SELECT tap.eq(COUNT(*), 7, "7 rows in test_files") FROM files;
+
+-- TEST _create_dirs
+
+CALL _create_dirs();
+
+SELECT tap.eq(COUNT(*), 9, "9 rows in test_files") FROM files;
+SELECT tap.eq(COUNT(*), 1, "one dir level1") FROM files WHERE path="level1";
+SELECT tap.eq(COUNT(*), 1, "one dir level1/level2") FROM files WHERE path="level1/level2";
+
+
+
+CALL tap.finish();
+ROLLBACK;