diff --git a/procedures/query/applyPOV.sql b/procedures/query/applyPOV.sql
index e648637e68745949e068b51cc82ffe9c11a9ac1b..e7d0029661f7a7d74a5a8a8b4f819b56281edce5 100644
--- a/procedures/query/applyPOV.sql
+++ b/procedures/query/applyPOV.sql
@@ -198,18 +198,30 @@ POV_LABEL: BEGIN
 
 
 
-    IF versioned AND sourceSet = "entities" THEN
+    IF versioned THEN
         call createVersionedTmpTable(keepTabl);
 
         #-- generate statement from statement parts
         SET @stmtPOVkeepTblStr = CONCAT("INSERT IGNORE INTO `", keepTabl, "` (id, _iversion) SELECT entity_id AS id, _iversion FROM ", data, " as data", IF(propertiesTable IS NULL, '', CONCAT(' WHERE EXISTS (Select 1 from `', propertiesTable, '` AS prop WHERE prop.id = data.property_id AND (prop.id2=data.entity_id OR prop.id2=0))')));
 
-        SET @stmtPOVStr = CONCAT(
-                CONCAT('INSERT IGNORE INTO `',
+        IF targetSet IS NOT NULL THEN
+            SET @stmtPOVStr = CONCAT('INSERT IGNORE INTO `',
                     targetSet,
                     '` (id, _iversion) SELECT source.id, source._iversion FROM `',
                     keepTabl,
-                    '` AS source'));
+                    '` AS source');
+        ELSE
+            SET @stmtPOVStr = CONCAT('DELETE FROM `',
+                    sourceSet,
+                    '` WHERE NOT EXISTS (SELECT 1 FROM `',
+                    keepTabl,
+                    '` AS data WHERE data.id=`',
+                    sourceSet,
+                    '`.`id` AND data._iversion=`',
+                    sourceSet,
+                    '`._iversion LIMIT 1)');
+
+        END IF;
 
         #-- prepare and execute
         PREPARE stmt3 FROM @stmtPOVStr;
@@ -259,8 +271,6 @@ POV_LABEL: BEGIN
         DEALLOCATE PREPARE stmtPOVkeepTbl;
     END IF;
 
-    /* Question: why select AS and not select INTO? */
-
     SELECT @stmtPOVkeepTblStr as applyPOVStmt1, @stmtPOVStr as applyPOVStmt2, keepTabl as applyPOVIntermediateResultSet;
 
 
diff --git a/procedures/query/applyTransactionFilter.sql b/procedures/query/applyTransactionFilter.sql
index b40b287b25bdd703337d50f3ca19d25d71bfcada..56299d726f83b84c723ca23e0c94027b787139a5 100644
--- a/procedures/query/applyTransactionFilter.sql
+++ b/procedures/query/applyTransactionFilter.sql
@@ -39,7 +39,7 @@ BEGIN
 		')'
 	);
 
-	SET @stmtTransactionStr = makeStmt(sourceSet,targetSet,data,NULL);
+	SET @stmtTransactionStr = makeStmt(sourceSet,targetSet,data,NULL,FALSE);
 	PREPARE stmtTransactionFilter from @stmtTransactionStr;
 	IF userName IS NOT NULL THEN
 		SET @userName = userName;
diff --git a/procedures/query/calcComplementUnion.sql b/procedures/query/calcComplementUnion.sql
index b0e70f744087672519957d0b9b6713d8ef3574a3..daaafa1934e58d53dbcc5cd17551c9353efa4571 100644
--- a/procedures/query/calcComplementUnion.sql
+++ b/procedures/query/calcComplementUnion.sql
@@ -23,15 +23,33 @@
 
 
 DROP PROCEDURE IF EXISTS db_2_0.calcComplementUnion;
+-- Apparently this code is not used anymore
 DELIMITER //
 
-CREATE PROCEDURE db_2_0.calcComplementUnion(in targetSet VARCHAR(255), in subResultSet VARCHAR(255), in universe VARCHAR(255))
+CREATE PROCEDURE db_2_0.calcComplementUnion(in targetSet VARCHAR(255), in subResultSet VARCHAR(255), in universe VARCHAR(255), in versioned BOOLEAN)
 BEGIN
-    SET @stmtComplementUnionStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` SELECT id FROM `',universe, '` AS universe WHERE NOT EXISTS ( SELECT 1 FROM `', subResultSet,'` AS diff WHERE diff.id=universe.id)');
+    IF versioned AND universe = "entities" THEN
+        SET @stmtComplementUnionStr = CONCAT(
+            'INSERT IGNORE INTO `', targetSet,
+            '` SELECT e.id, _get_head_iversion(e.id) FROM entities as e WHERE NOT EXISTS ( SELECT 1 FROM `',
+            subResultSet,
+            '` AS diff WHERE diff.id=e.id AND diff._iversion = _get_head_iversion(e.id)) UNION ALL SELECT e.id, e._iversion FROM archive_entities AS e WHERE NOT EXISTS ( SELECT 1 FROM `',
+            subResultSet,
+            '` as diff WHERE e.id = diff.id AND e._iversion = diff._iversion)');
+    ELSEIF versioned THEN
+        SET @stmtComplementUnionStr = CONCAT(
+            'INSERT IGNORE INTO `', targetSet,
+            '` SELECT id FROM `',universe,
+            '` AS universe WHERE NOT EXISTS ( SELECT 1 FROM `',
+                subResultSet,'`
+                AS diff WHERE diff.id=universe.id AND diff._iversion = universe.id_version)');
+    ELSE
+        SET @stmtComplementUnionStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` SELECT id FROM `',universe, '` AS universe WHERE NOT EXISTS ( SELECT 1 FROM `', subResultSet,'` AS diff WHERE diff.id=universe.id)');
+    END IF;
     PREPARE stmtComplementUnion FROM @stmtComplementUnionStr;
     EXECUTE stmtComplementUnion;
     DEALLOCATE PREPARE stmtComplementUnion;
-    
+
 END;
 //
 
diff --git a/procedures/query/calcDifference.sql b/procedures/query/calcDifference.sql
index 279b8cbac73c43893086187a38ec693978e16791..6814befff636e13f3a742baa57a21eca486a116c 100644
--- a/procedures/query/calcDifference.sql
+++ b/procedures/query/calcDifference.sql
@@ -27,13 +27,17 @@
 DROP PROCEDURE IF EXISTS db_2_0.calcDifference;
 DELIMITER //
 
-CREATE PROCEDURE db_2_0.calcDifference(in resultSetTable VARCHAR(255), in diff VARCHAR(255))
+CREATE PROCEDURE db_2_0.calcDifference(in resultSetTable VARCHAR(255), in diff VARCHAR(255), in versioned BOOLEAN)
 BEGIN
-    SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE EXISTS ( SELECT 1 FROM `', diff,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)');
+    IF versioned THEN
+        SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE EXISTS ( SELECT 1 FROM `', diff,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id` AND diff._iversion=`', resultSetTable, '`.`_iversion`)');
+    ELSE
+        SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE EXISTS ( SELECT 1 FROM `', diff,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)');
+    END IF;
     PREPARE diffStmt FROM @diffStmtStr;
     EXECUTE diffStmt;
     DEALLOCATE PREPARE diffStmt;
-    
+
 END;
 //
 
diff --git a/procedures/query/calcIntersection.sql b/procedures/query/calcIntersection.sql
index e9f8616a6dc00dbd465151e2d637f1f74fb8d2a2..0f53be233e537a20a1b5e04f3299382c283691cc 100644
--- a/procedures/query/calcIntersection.sql
+++ b/procedures/query/calcIntersection.sql
@@ -25,9 +25,21 @@
 DROP PROCEDURE IF EXISTS db_2_0.calcIntersection;
 DELIMITER //
 
-CREATE PROCEDURE db_2_0.calcIntersection(in resultSetTable VARCHAR(255), in intersectWith VARCHAR(255))
+CREATE PROCEDURE db_2_0.calcIntersection(in resultSetTable VARCHAR(255), in intersectWith VARCHAR(255), in versioned BOOLEAN)
 BEGIN
-    SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE NOT EXISTS ( SELECT 1 FROM `', intersectWith,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)');
+    IF versioned THEN
+        SET @diffStmtStr = CONCAT('DELETE FROM `',
+            resultSetTable,
+            '` WHERE NOT EXISTS ( SELECT 1 FROM `',
+            intersectWith,
+            '` AS diff WHERE diff.id=`',
+            resultSetTable,
+            '`.`id` AND diff._iversion=`',
+            resultSetTable,
+            '`.`_iversion`)');
+    ELSE
+        SET @diffStmtStr = CONCAT('DELETE FROM `', resultSetTable, '` WHERE NOT EXISTS ( SELECT 1 FROM `', intersectWith,'` AS diff WHERE diff.id=`',resultSetTable,'`.`id`)');
+    END IF;
     PREPARE diffStmt FROM @diffStmtStr;
     EXECUTE diffStmt;
 
diff --git a/procedures/query/calcUnion.sql b/procedures/query/calcUnion.sql
index 7db35bb774659ae4d27ead20b92029991ef1fed3..885a7130a4b89717fe8c0908d39f28869fbd2175 100644
--- a/procedures/query/calcUnion.sql
+++ b/procedures/query/calcUnion.sql
@@ -28,11 +28,11 @@ DELIMITER //
 
 CREATE PROCEDURE db_2_0.calcUnion(in targetSet VARCHAR(255), in sourceSet VARCHAR(255))
 BEGIN
-    SET @diffStmtStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` (id) SELECT id FROM `',sourceSet,'`');
+    SET @diffStmtStr = CONCAT('INSERT IGNORE INTO `', targetSet, '` SELECT * FROM `',sourceSet,'`');
     PREPARE diffStmt FROM @diffStmtStr;
     EXECUTE diffStmt;
     DEALLOCATE PREPARE diffStmt;
-    
+
 END;
 //
 
diff --git a/procedures/query/finishSubProperty.sql b/procedures/query/finishSubProperty.sql
index 635aba4f030eab0f7e3c6f547e4d1df0b3a15584..e63cd413d4b543a0a5a2edffeb5b3462d8fbaef2 100644
--- a/procedures/query/finishSubProperty.sql
+++ b/procedures/query/finishSubProperty.sql
@@ -24,15 +24,15 @@
 DROP PROCEDURE IF EXISTS db_2_0.finishSubProperty;
 DELIMITER //
 
-CREATE PROCEDURE db_2_0.finishSubProperty(in sourceSet VARCHAR(255),in targetSet VARCHAR(255), in list VARCHAR(255))
+CREATE PROCEDURE db_2_0.finishSubProperty(in sourceSet VARCHAR(255),in targetSet VARCHAR(255), in list VARCHAR(255), in versioned BOOLEAN)
 BEGIN
     DECLARE data VARCHAR(20000) DEFAULT CONCAT('`',list,'`');
-    SET @finishSubPropertyStmtStr = makeStmt(sourceSet, targetSet, data, NULL);
+    SET @finishSubPropertyStmtStr = makeStmt(sourceSet, targetSet, data, NULL, versioned);
 
-	PREPARE finishSubPropertyStmt FROM @finishSubPropertyStmtStr;
-	EXECUTE finishSubPropertyStmt;
+    PREPARE finishSubPropertyStmt FROM @finishSubPropertyStmtStr;
+    EXECUTE finishSubPropertyStmt;
     DEALLOCATE PREPARE finishSubPropertyStmt;
-        
+
     SELECT @finishSubPropertyStmtStr AS finishSubPropertyStmt;
 
 END;
diff --git a/procedures/query/initDisjunctionFilter.sql b/procedures/query/initDisjunctionFilter.sql
index 7a5a45bd125563b847d69ca404d0c28294c64fc6..54e8c70ca771cd7bf9207166f29d1c47b0c2aff8 100644
--- a/procedures/query/initDisjunctionFilter.sql
+++ b/procedures/query/initDisjunctionFilter.sql
@@ -26,7 +26,7 @@
 DROP PROCEDURE IF EXISTS db_2_0.initEmptyTargetSet;
 DELIMITER //
 
-CREATE PROCEDURE db_2_0.initEmptyTargetSet(in targetSet VARCHAR(255))
+CREATE PROCEDURE db_2_0.initEmptyTargetSet(in targetSet VARCHAR(255), in versioned BOOLEAN)
 BEGIN
     DECLARE newTableName VARCHAR(255) DEFAULT targetSet;
     IF targetSet IS NOT NULL THEN
@@ -36,10 +36,18 @@ BEGIN
         EXECUTE stmtIsNotEmpty;
         DEALLOCATE PREPARE stmtIsNotEmpty;
         IF @isNotEmptyVar IS NOT NULL THEN /*if targetSet is not empty*/
-            call createTmpTable(newTableName);
+            IF versioned THEN
+                call createVersionedTmpTable(newTableName);
+            ELSE
+                call createTmpTable(newTableName);
+            END IF;
         END IF;
     ELSE
-        call createTmpTable(newTableName);
+        IF versioned THEN
+            call createVersionedTmpTable(newTableName);
+        ELSE
+            call createTmpTable(newTableName);
+        END IF;
     END IF;
     SELECT newTableName AS newTableName;
 END;
@@ -49,49 +57,56 @@ DELIMITER ;
 DROP PROCEDURE IF EXISTS db_2_0.initDisjunctionFilter;
 DELIMITER //
 
-CREATE PROCEDURE db_2_0.initDisjunctionFilter()
+CREATE PROCEDURE db_2_0.initDisjunctionFilter(in versioned BOOLEAN)
 BEGIN
-    call initEmptyTargetSet(NULL);
+    call initEmptyTargetSet(NULL, versioned);
 END;
 //
 DELIMITER ;
 
 DROP PROCEDURE IF EXISTS db_2_0.initNegationFilter;
-DELIMITER //
+-- Apparently this code is not used anymore
+-- DELIMITER //
 
-CREATE PROCEDURE db_2_0.initNegationFilter(in sourceSet VARCHAR(255))
-BEGIN
-    DECLARE newTableName VARCHAR(255) DEFAULT NULL;
-    call createTmpTable(newTableName);
-    call copyTable(sourceSet, newTableName);
-    SELECT newTableName AS newTableName;
-END;
-//
-DELIMITER ;
+-- CREATE PROCEDURE db_2_0.initNegationFilter(in sourceSet VARCHAR(255), in versioned BOOLEAN)
+-- BEGIN
+    -- DECLARE newTableName VARCHAR(255) DEFAULT NULL;
+    -- if versioned THEN
+        -- call createVersionedTmpTable(newTableName);
+    -- ELSE
+        -- call createTmpTable(newTableName);
+    -- END IF;
+    -- call copyTable(sourceSet, newTableName);
+    -- SELECT newTableName AS newTableName;
+-- END;
+-- //
+-- DELIMITER ;
 
 DROP PROCEDURE IF EXISTS db_2_0.initConjunctionFilter;
-DELIMITER //
+-- Apparently this code is not used anymore
+-- DELIMITER //
 
-CREATE PROCEDURE db_2_0.initConjunctionFilter(in sourceSet VARCHAR(255))
-BEGIN
-    DECLARE newTableName VARCHAR(255) DEFAULT NULL;
-    call createTmpTable(newTableName);
-    call copyTable(sourceSet, newTableName);
-    SELECT newTableName AS newTableName;
-END;
-//
-DELIMITER ;
+-- CREATE PROCEDURE db_2_0.initConjunctionFilter(in sourceSet VARCHAR(255))
+-- BEGIN
+    -- DECLARE newTableName VARCHAR(255) DEFAULT NULL;
+    -- call createTmpTable(newTableName);
+    -- call copyTable(sourceSet, newTableName);
+    -- SELECT newTableName AS newTableName;
+-- END;
+-- //
+-- DELIMITER ;
 
 DROP PROCEDURE IF EXISTS db_2_0.finishNegationFilter;
-DELIMITER //
+-- Apparently this code is not used anymore
+-- DELIMITER //
 
-CREATE PROCEDURE db_2_0.finishNegationFilter(in sourceSet VARCHAR(255), in targetSet VARCHAR(255), in subResultSet VARCHAR(255))
-BEGIN
-    IF targetSet IS NULL OR sourceSet = targetSet THEN
-        call calcDifference(sourceSet, subResultSet);
-    ELSE
-        call calcComplementUnion(targetSet,subResultSet,sourceSet);
-    END IF;
-END;
-// 
-DELIMITER ;
+-- CREATE PROCEDURE db_2_0.finishNegationFilter(in sourceSet VARCHAR(255), in targetSet VARCHAR(255), in subResultSet VARCHAR(255), in versioned BOOLEAN)
+-- BEGIN
+    -- IF targetSet IS NULL OR sourceSet = targetSet THEN
+        -- call calcDifference(sourceSet, subResultSet, versioned);
+    -- ELSE
+        -- call calcComplementUnion(targetSet,subResultSet,sourceSet, versioned);
+    -- END IF;
+-- END;
+-- // 
+-- DELIMITER ;