diff --git a/caosdb-webui b/caosdb-webui
index 8c59cc861d646cbdba0ec749ba052656f67fd58d..5dfe879722bd01acc5209c581b60bf0ac49635b6 160000
--- a/caosdb-webui
+++ b/caosdb-webui
@@ -1 +1 @@
-Subproject commit 8c59cc861d646cbdba0ec749ba052656f67fd58d
+Subproject commit 5dfe879722bd01acc5209c581b60bf0ac49635b6
diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java
index 0a877fc83e2f680565181655ed92c3a61cda393b..deee34bfea87f15167689c602ab4a238cea547fe 100644
--- a/src/main/java/org/caosdb/server/query/Query.java
+++ b/src/main/java/org/caosdb/server/query/Query.java
@@ -39,6 +39,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.UUID;
 import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
 import org.apache.commons.jcs.access.behavior.ICacheAccess;
@@ -238,6 +239,8 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
    */
   private boolean cachable = true;
 
+  private static String cacheETag = UUID.randomUUID().toString();
+
   public Type getType() {
     return this.type;
   }
@@ -668,6 +671,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
 
   /** Remove all cached queries from the cache. */
   public static void clearCache() {
+    cacheETag = UUID.randomUUID().toString();
     cache.clear();
   }
 
@@ -678,10 +682,12 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
    * @param resultSet
    */
   private void setCache(String key, List<IdVersionPair> resultSet) {
-    if (resultSet instanceof Serializable) {
-      cache.put(key, (Serializable) resultSet);
-    } else {
-      cache.put(key, new ArrayList<>(resultSet));
+    synchronized (cache) {
+      if (resultSet instanceof Serializable) {
+        cache.put(key, (Serializable) resultSet);
+      } else {
+        cache.put(key, new ArrayList<>(resultSet));
+      }
     }
   }
 
@@ -859,6 +865,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
       ret.setAttribute("results", "0");
     }
     ret.setAttribute("cached", Boolean.toString(this.cached));
+    ret.setAttribute("etag", cacheETag);
 
     final Element parseTreeElem = new Element("ParseTree");
     if (this.el.hasErrors()) {
diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
index abda78b6feeb0de7104de5365877b28d474058fe..570fce2c2b001699fdb48c1379e807ae05d62996 100644
--- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
+++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
@@ -215,13 +215,7 @@ public class WriteTransaction extends Transaction<WritableContainer>
                     .setFile(oldEntity.getFileProperties().retrieveFromFileSystem());
               }
 
-              try {
-                checkPermissions(entity, deriveUpdate(entity, oldEntity));
-              } catch (final AuthorizationException exc) {
-                entity.setEntityStatus(EntityStatus.UNQUALIFIED);
-                entity.addError(ServerMessages.AUTHORIZATION_ERROR);
-                entity.addInfo(exc.getMessage());
-              }
+              ((UpdateEntity) entity).setOriginal(oldEntity);
             }
             break innerLoop;
           }
@@ -290,6 +284,18 @@ public class WriteTransaction extends Transaction<WritableContainer>
   @Override
   protected void preCheck() throws InterruptedException, Exception {
     for (final EntityInterface entity : getContainer()) {
+      try {
+        if (entity.getEntityStatus() == EntityStatus.QUALIFIED) {
+          checkPermissions(entity, deriveUpdate(entity, ((UpdateEntity) entity).getOriginal()));
+        }
+      } catch (final AuthorizationException exc) {
+        entity.setEntityStatus(EntityStatus.UNQUALIFIED);
+        entity.addError(ServerMessages.AUTHORIZATION_ERROR);
+        entity.addInfo(exc.getMessage());
+      } catch (ClassCastException exc) {
+        // not an update entity. ignore.
+      }
+
       // set default EntityACL if none present
       if (entity.getEntityACL() == null) {
         entity.setEntityACL(EntityACL.getOwnerACLFor(SecurityUtils.getSubject()));