diff --git a/caosdb-webui b/caosdb-webui
index 32fa3b8af945d4d0bf4e98818b2456bdc8f375c0..d02f34facc0409817daeac8a3a226a6cfcd0b895 160000
--- a/caosdb-webui
+++ b/caosdb-webui
@@ -1 +1 @@
-Subproject commit 32fa3b8af945d4d0bf4e98818b2456bdc8f375c0
+Subproject commit d02f34facc0409817daeac8a3a226a6cfcd0b895
diff --git a/src/main/java/caosdb/datetime/UTCDateTime.java b/src/main/java/caosdb/datetime/UTCDateTime.java
index 886080dd48718bcfdc9f2f8d032dd35b624671c7..846c8f9f266d4b834314b95e00973993d9031224 100644
--- a/src/main/java/caosdb/datetime/UTCDateTime.java
+++ b/src/main/java/caosdb/datetime/UTCDateTime.java
@@ -292,7 +292,7 @@ public class UTCDateTime implements Interval {
 
   @Override
   public String toString() {
-    return toDateTimeString(TimeZone.getDefault());
+    throw new NullPointerException("toString method!!!");
   }
 
   public static UTCDateTime UTCSeconds(final Long utcseconds, final Integer nanosecond) {
diff --git a/src/main/java/caosdb/server/entity/Message.java b/src/main/java/caosdb/server/entity/Message.java
index 002a2cb174a4714b3c2658b375610480ccbcab5f..03e788251620b6c192eb86f1bbd172564a66235f 100644
--- a/src/main/java/caosdb/server/entity/Message.java
+++ b/src/main/java/caosdb/server/entity/Message.java
@@ -79,20 +79,20 @@ public class Message extends Exception implements Comparable<Message>, ToElement
     this(type, code, null, null);
   }
 
-  public Message(final int code, final String description) {
+  public Message(final Integer code, final String description) {
     this("Message", code, description, null);
   }
 
-  public Message(final MessageType type, final int code, final String description) {
+  public Message(final MessageType type, final Integer code, final String description) {
     this(type.toString(), code, description, null);
   }
 
   public Message(
-      final MessageType type, final int code, final String description, final String body) {
+      final MessageType type, final Integer code, final String description, final String body) {
     this(type.toString(), code, description, body);
   }
 
-  public Message(final String type, final int code, final String description) {
+  public Message(final String type, final Integer code, final String description) {
     this(type, code, description, null);
   }
 
diff --git a/src/main/java/caosdb/server/jobs/Job.java b/src/main/java/caosdb/server/jobs/Job.java
index 29d052a3cda7ba696e8a792fa8a5de3bd9135bcb..681098b76a9deb90bc05dbea6f13ad2acd937ea6 100644
--- a/src/main/java/caosdb/server/jobs/Job.java
+++ b/src/main/java/caosdb/server/jobs/Job.java
@@ -233,8 +233,12 @@ public abstract class Job extends AbstractObservable implements Observer {
           if (flagName.length() > 0) {
             allClasses.put(flagName.toLowerCase(), c);
           }
+          if (c.getAnnotation(JobAnnotation.class).loadAlways()) {
+            loadAlways.add(c);
+          }
         }
       }
+      // TODO merge these two parts of this function. Its the same!
       jobPackage = new Reflections("caosdb.server.jobs.extension");
       allClassesSet = jobPackage.getSubTypesOf(Job.class);
       for (final Class<? extends Job> c : allClassesSet) {
@@ -289,7 +293,8 @@ public abstract class Job extends AbstractObservable implements Observer {
     final ArrayList<Job> jobs = new ArrayList<>();
     // load permanent jobs
     for (Class<? extends Job> j : loadAlways) {
-      if (j.getAnnotation(JobAnnotation.class).transaction().isInstance(transaction)) {
+      if (EntityJob.class.isAssignableFrom(j)
+          && j.getAnnotation(JobAnnotation.class).transaction().isInstance(transaction)) {
         jobs.add(getJob(j, Mode.MUST, entity, transaction));
       }
     }
@@ -425,4 +430,16 @@ public abstract class Job extends AbstractObservable implements Observer {
   public JobExecutionTime getExecutionTime() {
     return this.time;
   }
+
+  public static List<Job> loadPermanentContainerJobs(Transaction<?> transaction) {
+    final ArrayList<Job> jobs = new ArrayList<>();
+    // load permanent jobs
+    for (Class<? extends Job> j : loadAlways) {
+      if (ContainerJob.class.isAssignableFrom(j)
+          && j.getAnnotation(JobAnnotation.class).transaction().isInstance(transaction)) {
+        jobs.add(getJob(j, Mode.MUST, null, transaction));
+      }
+    }
+    return jobs;
+  }
 }
diff --git a/src/main/java/caosdb/server/jobs/core/Atomic.java b/src/main/java/caosdb/server/jobs/core/Atomic.java
index f41eba282f750e6ec0f388d801e0eeabc7c60352..cdc9f25d7367a9732dcdcc9a0e03dd5e359acaa2 100644
--- a/src/main/java/caosdb/server/jobs/core/Atomic.java
+++ b/src/main/java/caosdb/server/jobs/core/Atomic.java
@@ -27,11 +27,15 @@ import caosdb.server.entity.EntityInterface;
 import caosdb.server.jobs.ContainerJob;
 import caosdb.server.jobs.JobAnnotation;
 import caosdb.server.jobs.JobExecutionTime;
+import caosdb.server.transaction.WriteTransaction;
 import caosdb.server.utils.EntityStatus;
 import caosdb.server.utils.Observable;
 import caosdb.server.utils.ServerMessages;
 
-@JobAnnotation(time = JobExecutionTime.POST_CHECK)
+@JobAnnotation(
+    time = JobExecutionTime.POST_CHECK,
+    transaction = WriteTransaction.class,
+    loadAlways = true)
 public class Atomic extends ContainerJob {
 
   private boolean doCheck() {
diff --git a/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java b/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java
index 7904e47d52d4b92dc527d2cf8f7247df51d0edaf..1eb4941d47314f7f67bbe874784f2427cecdca92 100644
--- a/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java
+++ b/src/main/java/caosdb/server/jobs/core/CheckNoAdditionalPropertiesPresent.java
@@ -7,6 +7,7 @@ import caosdb.server.jobs.JobAnnotation;
 import caosdb.server.utils.EntityStatus;
 import caosdb.server.utils.ServerMessages;
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
 
 @JobAnnotation(
@@ -35,6 +36,7 @@ public class CheckNoAdditionalPropertiesPresent extends EntityJob {
       for (EntityInterface parentProperty : parent.getProperties()) {
         if (sameProperty(property, parentProperty) && !used.contains(parentProperty)) {
           used.add(parentProperty);
+          return;
         }
       }
       // not found!
@@ -51,6 +53,6 @@ public class CheckNoAdditionalPropertiesPresent extends EntityJob {
   }
 
   private boolean sameProperty(EntityInterface property, EntityInterface parentProperty) {
-    return property.getId() == parentProperty.getId();
+    return property.getId() != null && Objects.equals(property.getId(), parentProperty.getId());
   }
 }
diff --git a/src/main/java/caosdb/server/permissions/EntityACL.java b/src/main/java/caosdb/server/permissions/EntityACL.java
index 86346bdfa3c3846e7951e41268e117ec2a99aaab..f2f89765a91cb182b0627dc41356c93b341aba47 100644
--- a/src/main/java/caosdb/server/permissions/EntityACL.java
+++ b/src/main/java/caosdb/server/permissions/EntityACL.java
@@ -48,7 +48,7 @@ public class EntityACL {
   public static final long OWNER_BITSET = 1;
   private final Collection<EntityACI> acl;
 
-  EntityACL(final Collection<EntityACI> acl) {
+  public EntityACL(final Collection<EntityACI> acl) {
     if (acl != null) {
       this.acl = acl;
     } else {
@@ -60,13 +60,16 @@ public class EntityACL {
     final EntityACLFactory f = new EntityACLFactory();
     f.grant(OWNER_ROLE, "*");
     f.grant(OTHER_ROLE, "RETRIEVE:*");
+    f.grant(OTHER_ROLE, "USE:*");
+    f.grant(Role.ANONYMOUS_ROLE, "RETRIEVE:*");
+    f.grant(Role.ANONYMOUS_ROLE, "USE:*");
     f.deny(OTHER_ROLE, "UPDATE:*");
     f.deny(OTHER_ROLE, "DELETE");
     f.deny(OTHER_ROLE, true, "EDIT:ACL");
     return f.create();
   }
 
-  EntityACL(final EntityACI... aci) {
+  public EntityACL(final EntityACI... aci) {
     this.acl = new ArrayList<>();
     for (final EntityACI a : aci) {
       this.acl.add(a);
diff --git a/src/main/java/caosdb/server/query/CQLParser.g4 b/src/main/java/caosdb/server/query/CQLParser.g4
index 12fa0fc7663efca549a8306dd68ca7e910040172..48205d1fece3309570f40e566078f51c96cab1bd 100644
--- a/src/main/java/caosdb/server/query/CQLParser.g4
+++ b/src/main/java/caosdb/server/query/CQLParser.g4
@@ -236,10 +236,12 @@ pov returns [POV filter] locals [Query.Pattern p, String o, String v, String a]
 	(
 		property {$p = $property.pp; $a=$property.agg;} 
 		(
-			( LIKE {$o = $LIKE.text;}
+			( 
+			  LIKE {$o = $LIKE.text;}
 			  ( like_pattern {$v = $like_pattern.ep.toString();}
-			  | value {$v = $value.str;} )
-			| OPERATOR {$o = $OPERATOR.text;} value {$v = $value.str;})
+			    | value {$v = $value.str;} )
+			  | OPERATOR {$o = $OPERATOR.text;} value {$v = $value.str;}
+			)
 			| IS_NULL {$o = "0";}
 			| IS_NOT_NULL {$o = "!0";}
 			| IN datetime {$o = "("; $v=$datetime.text;}
@@ -248,11 +250,14 @@ pov returns [POV filter] locals [Query.Pattern p, String o, String v, String a]
 	) 
 	| 
 	(
-		OPERATOR {$o = $OPERATOR.text;} value {$v = $value.str;}
-		(
-			AS_A
-			property {$p = $property.pp;} 
-		)?
+		( LIKE {$o = $LIKE.text;}
+		  ( like_pattern {$v = $like_pattern.ep.toString();}
+		    | value {$v = $value.str;} )
+		)
+		| ( OPERATOR {$o = $OPERATOR.text;} value {$v = $value.str;}
+		  ( AS_A
+			property {$p = $property.pp;} )?
+		)
 	)
 	
 ;
diff --git a/src/main/java/caosdb/server/transaction/Transaction.java b/src/main/java/caosdb/server/transaction/Transaction.java
index 9e03b7750c4f34f70754001862f6da9adf0a90ef..de1e5e279ee4b1cd252dda0fdf6bb23e8f93e57f 100644
--- a/src/main/java/caosdb/server/transaction/Transaction.java
+++ b/src/main/java/caosdb/server/transaction/Transaction.java
@@ -38,7 +38,6 @@ import caosdb.server.jobs.Job;
 import caosdb.server.jobs.JobExecutionTime;
 import caosdb.server.jobs.Schedule;
 import caosdb.server.jobs.core.AccessControl;
-import caosdb.server.jobs.core.Atomic;
 import caosdb.server.jobs.core.CheckDatatypePresent;
 import caosdb.server.jobs.core.CheckEntityACLRoles;
 import caosdb.server.jobs.core.Mode;
@@ -86,13 +85,13 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
     this.schedule.add(loadContainerFlags);
     this.schedule.runJob(loadContainerFlags);
 
-    // all transactions are atomic
-    this.schedule.add(Job.getJob(Atomic.class.getSimpleName(), Mode.MUST, null, this));
-
     // AccessControl
     this.schedule.add(Job.getJob(AccessControl.class.getSimpleName(), Mode.MUST, null, this));
     this.schedule.add(Job.getJob(CheckEntityACLRoles.class.getSimpleName(), Mode.MUST, null, this));
 
+    // load permanent container jobs
+    this.schedule.addAll(Job.loadPermanentContainerJobs(this));
+
     for (final EntityInterface e : getContainer()) {
       final List<Job> loadJobs = Job.loadJobs(e, this);
       this.schedule.addAll(loadJobs);
diff --git a/src/main/java/caosdb/server/utils/ServerMessages.java b/src/main/java/caosdb/server/utils/ServerMessages.java
index ac1d47a3e58c3c1158a6e4c1bf3e6ffea1425689..63cadf5f3a0eedca04e8dab21a0213a81bf2bd3c 100644
--- a/src/main/java/caosdb/server/utils/ServerMessages.java
+++ b/src/main/java/caosdb/server/utils/ServerMessages.java
@@ -423,7 +423,7 @@ public class ServerMessages {
       new Message(
           MessageType.Warning,
           0,
-          "This property is an additional property which has no corresponding properties among the properties of the parents.");
+          "This property is an additional property which has no corresponding property among the properties of the parents.");
 
   public static final Message PROPERTY_WITH_DATATYPE_OVERRIDE =
       new Message(MessageType.Warning, 0, "This property overrides the datatype.");