diff --git a/make_db b/make_db
index ccf3cd4c3c34fc12e86584613d1bda039c7c7f95..6f23facfb23b4d3a0cf8a4024f511e0e898d0173 100755
--- a/make_db
+++ b/make_db
@@ -51,12 +51,13 @@ function _execute_tests () {
     for tfile in $TESTS ; do
         echo "Running $tfile"
         echo "----- $tfile -----" >> .TEST_RESULTS
-        cat $tfile | $SQL --disable-pager --batch --raw --skip-column-names --unbuffered >> .TEST_RESULTS
+        cat $tfile | $SQL --disable-pager --batch --raw --skip-column-names --unbuffered >> .TEST_RESULTS 2>&1
     done;
 
     popd
     cat tests/.TEST_RESULTS
     grep -c -i "failed" tests/.TEST_RESULTS > /dev/null && return 1
+    grep -c -i "ERROR" tests/.TEST_RESULTS > /dev/null && return 1
     return 0
 }
 
diff --git a/procedures/retrieveEntity.sql b/procedures/retrieveEntity.sql
index 1e2621b090ee3caf12c1aa1a9aec6a73abebcfe0..d4c0cf76974b0d82f239feab0d3b617d97b3c3f5 100644
--- a/procedures/retrieveEntity.sql
+++ b/procedures/retrieveEntity.sql
@@ -29,13 +29,16 @@ drop procedure if exists db_2_0.retrieveEntity //
 
 create procedure db_2_0.retrieveEntity(in EntityID INT UNSIGNED)
 BEGIN
-	DECLARE FilePath VARCHAR(255) DEFAULT NULL;
-	DECLARE FileSize VARCHAR(255) DEFAULT NULL;
+	DECLARE FilePath VARBINARY(65525) DEFAULT NULL;
+	DECLARE FileSize BIGINT UNSIGNED DEFAULT NULL;
 	DECLARE FileHash VARCHAR(255) DEFAULT NULL;
+    DECLARE FileMimetype VARBINARY(255) DEFAULT NULL;
+    DECLARE FileStorage VARBINARY(255) DEFAULT NULL;
+    DECLARE FileStorageId VARBINARY(65525) DEFAULT NULL;
 	DECLARE DatatypeID INT UNSIGNED DEFAULT NULL;
     DECLARE CollectionName VARCHAR(255) DEFAULT NULL;
 	
-	Select path, size, hex(hash) into FilePath, FileSize, FileHash from files where file_id = EntityID LIMIT 1;
+	Select path, size, hex(hash), mimetype, fileStorage, storageId into FilePath, FileSize, FileHash, FileMimetype, FileStorage, FileStorageId FROM files WHERE file_id = EntityID LIMIT 1;
 	Select datatype into DatatypeID from data_type where domain_id=0 and entity_id=0 and property_id=EntityID LIMIT 1;
 
 	SELECT collection into CollectionName from collection_type where domain_id=0 and entity_id=0 and property_id=EntityID LIMIT 1;
@@ -50,6 +53,9 @@ BEGIN
 		FileSize as FileSize, 
 		FilePath as FilePath, 
 		FileHash as FileHash,
+        FileMimetype as FileMimetype,
+        FileStorage as FileStorage,
+        FileStorageId as FileStorageId,
 		(SELECT acl FROM entity_acl as a WHERE a.id = e.acl) as ACL
 	from entities e where id = EntityID LIMIT 1;
 END;
diff --git a/rules.sql b/rules.sql
index 017fe16c46f9165bf17920570694792bc53dafd9..9c82c7f415c8b64971aa94558ba7abf6510bb249 100644
--- a/rules.sql
+++ b/rules.sql
@@ -149,8 +149,3 @@ INSERT INTO rules (domain_id, entity_id, transaction, criterion, modus) VALUES (
 INSERT INTO rules (domain_id, entity_id, transaction, criterion, modus) VALUES (0,17,'UPDATE','CheckRefidIsaParRefid','MUST');
 #-- INSERT INTO rules (domain_id, entity_id, transaction, criterion, modus) VALUES (0,17,'UPDATE','CheckDescPresent','MUST');
 
-#-- SQLite files
-INSERT INTO rules (domain_id, entity_id, transaction, criterion, modus) VALUES (0,50,'UPDATE','CheckRefidValid','MUST');
-INSERT INTO rules (domain_id, entity_id, transaction, criterion, modus) VALUES (0,50,'UPDATE','CheckRefidIsaParRefid','SHOULD');
-#-- INSERT INTO rules (domain_id, entity_id, transaction, criterion, modus) VALUES (0,50,'UPDATE','CheckDescPresent','SHOULD');
-INSERT INTO rules (domain_id, entity_id, transaction, criterion, modus) VALUES (0,50,'UPDATE','SQLiteTransaction','MUST');
diff --git a/tests/test_0_next_patch.sql b/tests/test_0_next_patch.sql
new file mode 100644
index 0000000000000000000000000000000000000000..e55e4884d3d1e180761d28b758dc412319f1c31e
--- /dev/null
+++ b/tests/test_0_next_patch.sql
@@ -0,0 +1,70 @@
+-- USE _caosdb_schema_unit_tests;
+
+
+-- REMOVE SQLITE datatype
+DELETE FROM entities WHERE id = 50;
+
+ALTER TABLE files ADD UNIQUE (`path`);
+
+ALTER TABLE files ADD COLUMN IF NOT EXISTS (
+    mimetype VARBINARY(255) DEFAULT NULL,
+    fileStorage VARBINARY(255) NOT NULL DEFAULT "DEFAULT",
+    storageId VARBINARY(255) DEFAULT NULL
+);
+
+
+ALTER TABLE entities MODIFY COLUMN `role` enum('RECORDTYPE','RECORD','FILE','DOMAIN','PROPERTY','DATATYPE','ROLE','QUERYTEMPLATE', 'DIRECTORY') COLLATE utf8_unicode_ci NOT NULL;
+
+INSERT IGNORE INTO entities (id, name, description, role, acl) VALUES (9, "DIRECTORY", "The directory role.", "ROLE", 0);
+
+UPDATE files SET storageId=path;
+
+ALTER TABLE files MODIFY COLUMN storageId VARBINARY(255) NOT NULL;
+
+DROP PROCEDURE IF EXISTS _create_dirs;
+DELIMITER //
+CREATE PROCEDURE _create_dirs()
+BEGIN
+    DECLARE done BOOLEAN DEFAULT FALSE;
+    DECLARE _file_id INT UNSIGNED DEFAULT NULL;
+    DECLARE _path VARCHAR(255) DEFAULT NULL;
+    DECLARE dir_id INT UNSIGNED DEFAULT NULL;
+    DECLARE dir_path VARCHAR(255) DEFAULT "";
+    DECLARE dir_exists BOOLEAN DEFAULT FALSE;
+    DECLARE cur CURSOR FOR SELECT file_id, path FROM files;
+    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
+    OPEN cur;
+
+    loop1: LOOP
+        FETCH cur INTO _file_id, _path;
+        IF done THEN
+            LEAVE loop1;
+        END IF;
+
+        -- TODO
+        loop2: LOOP
+            SELECT REGEXP_SUBSTR(_path, CONCAT("(?U)^", dir_path, ".*/" )) INTO dir_path;
+            IF dir_path = "" THEN
+                SET dir_exists = FALSE;
+                SET done = FALSE;
+                LEAVE loop2;
+            END IF;
+            SELECT TRUE INTO dir_exists FROM files WHERE path = LEFT(dir_path, CHAR_LENGTH(dir_path)-1);
+            IF dir_exists IS TRUE THEN
+                SET dir_exists = FALSE;
+                ITERATE loop2;
+            END IF;
+            INSERT INTO entities (name, description, role, acl) VALUES (NULL, NULL, "DIRECTORY", 0);
+            SET dir_id = LAST_INSERT_ID();
+            INSERT INTO files (file_id, path, size, hash, checked_timestamp, mimetype, fileStorage, storageId) VALUES (dir_id, LEFT(dir_path, CHAR_LENGTH(dir_path)-1), 0, NULL, 0, "inode/directory", "DEFAULT", LEFT(dir_path, CHAR_LENGTH(dir_path)-1));
+        END LOOP;
+
+    END LOOP;
+
+    CLOSE cur;
+
+END //
+
+DELIMITER ;
+
+CALL _create_dirs();
diff --git a/tests/test_directory_patch.sql b/tests/test_directory_patch.sql
new file mode 100644
index 0000000000000000000000000000000000000000..a77470485f967381920eccf01cbefb963c0c261d
--- /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
+(51, "FILE", 0),
+(52, "FILE", 0),
+(53, "FILE", 0),
+(54, "FILE", 0),
+(55, "FILE", 0),
+(56, "FILE", 0);
+
+
+INSERT INTO files (file_id, path, size, storageId) VALUES
+(51, "file_at_root_a", 256, "file_at_root_a"),
+(52, "file_at_root_b", 256, "file_at_root_b"),
+(53, "level1/file_at_level1_a", 256, "level1/file_at_level1_a"),
+(54, "level1/file_at_level1_b", 256, "level1/file_at_level1_b"),
+(55, "level1/level2/file_at_level2_a", 256, "level1/level2/file_at_level2_a"),
+(56, "level1/level2/file_at_level2_b", 256, "level1/level2/file_at_level2_b");
+
+SELECT tap.eq(COUNT(*), 6, "six rows in test_files") FROM files;
+
+-- TEST _create_dirs
+
+CALL _create_dirs();
+
+SELECT * FROM files;
+SELECT tap.eq(COUNT(*), 8, "8 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;
diff --git a/update_sql_procedures.sh b/update_sql_procedures.sh
index 7b0b457f07456663645c383703e8c1c7ec962291..d70800621fe6f4d2e59eeaa3ef9e29e143dcb231 100755
--- a/update_sql_procedures.sh
+++ b/update_sql_procedures.sh
@@ -33,7 +33,11 @@ mysql_execute "$(sed s/db_2_0/$DATABASE_NAME/g rules.sql)"
 echo "[OK]"
 
 echo -n "updating procedures ... "
-mysql_execute "$(sed s/db_2_0/$DATABASE_NAME/g procedures/*.sql procedures/query/*.sql)" 
+PROCEDURES="procedures/*.sql procedures/query/*.sql"
+for p in $PROCEDURES
+do
+    mysql_execute "$(sed s/db_2_0/$DATABASE_NAME/g $p)"
+done
 success