diff --git a/src/doc/development/structure.rst b/src/doc/development/structure.rst
index 7661647562e35a21eba3c5569a8de6c2433f65b3..3848e983fca5d05871212e0985b98d539c04b7fe 100644
--- a/src/doc/development/structure.rst
+++ b/src/doc/development/structure.rst
@@ -130,7 +130,7 @@ The request handling in CaosDB is organized in the following way:
   :java:ref:`Containers<Container>`, enriched with some metadata).
 - The Transaction keeps a :java:ref:`Schedule` of related :java:ref:`Jobs<Job>` (each also wrapping
   a specific Transaction), which may be called at different stages, called
-  :java:ref:`JobExecutionTimes<JobExecutionTime>`.
+  :java:ref:`TransactionStages<TransactionStage>`.
 - The Transaction's ``execute()`` method, when called, in turn calls a number of methods for
   initialization, checks, preparations, cleanup etc.  Additionally the scheduled jobs are executed
   at their specified stages, for example all jobs scheduled for ``INIT`` are executed immediately
@@ -163,7 +163,7 @@ Summarized, the classes are connected like this:
   class Schedule
   class ScheduledJob
   abstract Job {
-    ExecutionTime time
+    TransactionStage stage
     Transaction transaction
     execute(BackendTransaction t)\n    // -> transaction.execute(t, transaction.access)
   }
diff --git a/src/main/java/org/caosdb/server/jobs/Job.java b/src/main/java/org/caosdb/server/jobs/Job.java
index 34ad4966af0c1272f4ef8468700d9d2d7f6207d9..9432fc3916606cddbf64922850d7f2f9ff5284c2 100644
--- a/src/main/java/org/caosdb/server/jobs/Job.java
+++ b/src/main/java/org/caosdb/server/jobs/Job.java
@@ -67,7 +67,7 @@ public abstract class Job {
 
   private Transaction<? extends TransactionContainer> transaction = null;
   private Mode mode = null;
-  private final JobExecutionTime time;
+  private final TransactionStage stage;
   private EntityInterface entity = null;
 
   public abstract JobTarget getTarget();
@@ -117,9 +117,9 @@ public abstract class Job {
 
   protected Job() {
     if (this.getClass().isAnnotationPresent(JobAnnotation.class)) {
-      this.time = this.getClass().getAnnotation(JobAnnotation.class).time();
+      this.stage = this.getClass().getAnnotation(JobAnnotation.class).stage();
     } else {
-      this.time = JobExecutionTime.CHECK;
+      this.stage = TransactionStage.CHECK;
     }
   }
 
@@ -468,8 +468,8 @@ public abstract class Job {
     System.out.println(toString());
   }
 
-  public JobExecutionTime getExecutionTime() {
-    return this.time;
+  public TransactionStage getTransactionStage() {
+    return this.stage;
   }
 
   /**
diff --git a/src/main/java/org/caosdb/server/jobs/JobAnnotation.java b/src/main/java/org/caosdb/server/jobs/JobAnnotation.java
index 8acdaccb9f56b0b779474c510b0216a1a327971a..bebebd75ed386c19f8abfb7c09e802dda5ec2941 100644
--- a/src/main/java/org/caosdb/server/jobs/JobAnnotation.java
+++ b/src/main/java/org/caosdb/server/jobs/JobAnnotation.java
@@ -31,10 +31,12 @@ import org.caosdb.server.transaction.TransactionInterface;
  *
  * <p>Without a JobAnnotation, the Job will run at the default {@link
  * org.caosdb.server.transaction.Transaction#check() CHECK} stage.
+ *
+ * @see {@link TransactionStage}
  */
 @Retention(RetentionPolicy.RUNTIME)
 public @interface JobAnnotation {
-  JobExecutionTime time() default JobExecutionTime.CHECK;
+  TransactionStage stage() default TransactionStage.CHECK;
 
   String flag() default "";
 
diff --git a/src/main/java/org/caosdb/server/jobs/JobExecutionTime.java b/src/main/java/org/caosdb/server/jobs/JobExecutionTime.java
deleted file mode 100644
index 5d79d72b872bb6045bf9d884add79d563c8d14be..0000000000000000000000000000000000000000
--- a/src/main/java/org/caosdb/server/jobs/JobExecutionTime.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * ** header v3.0
- * This file is a part of the CaosDB Project.
- *
- * Copyright (C) 2018 Research Group Biomedical Physics,
- * Max-Planck-Institute for Dynamics and Self-Organization Göttingen
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- * ** end header
- */
-package org.caosdb.server.jobs;
-
-/** Not really a time (measured in seconds), but rather the execution stage. */
-public enum JobExecutionTime {
-  INIT,
-  PRE_CHECK,
-  CHECK,
-  POST_CHECK,
-  PRE_TRANSACTION,
-  TRANSACTION,
-  POST_TRANSACTION,
-  CLEANUP,
-  ROLL_BACK
-}
diff --git a/src/main/java/org/caosdb/server/jobs/Schedule.java b/src/main/java/org/caosdb/server/jobs/Schedule.java
index 892f590fe4497bf1083a002eedccc2bcb374cf13..0090ec92dffb310052b5b8cc82424e2edd0288f9 100644
--- a/src/main/java/org/caosdb/server/jobs/Schedule.java
+++ b/src/main/java/org/caosdb/server/jobs/Schedule.java
@@ -33,9 +33,9 @@ import org.caosdb.server.entity.EntityInterface;
 /**
  * Keeps track of Jobs.
  *
- * <p>The Schedule class orders jobs by "time" and also assures that jobs are skipped when
- * appropriate and to prevent that jobs run more than once (because sometimes they trigger each
- * other).
+ * <p>The Schedule class orders jobs by {@link TransactionStage} and also assures that jobs are
+ * skipped when appropriate and to prevent that jobs run more than once (because sometimes they
+ * trigger each other).
  */
 public class Schedule {
 
@@ -43,7 +43,7 @@ public class Schedule {
   private ScheduledJob running = null;
 
   public List<ScheduledJob> addAll(final Collection<Job> jobs) {
-    List<ScheduledJob> result = new ArrayList<ScheduledJob>(jobs.size());
+    final List<ScheduledJob> result = new ArrayList<ScheduledJob>(jobs.size());
     for (final Job j : jobs) {
       result.add(add(j));
     }
@@ -51,19 +51,19 @@ public class Schedule {
   }
 
   public ScheduledJob add(final Job j) {
-    ScheduledJob ret = new ScheduledJob(j);
-    List<ScheduledJob> jobs = jobLists.get(ret.getExecutionTime().ordinal());
+    final ScheduledJob ret = new ScheduledJob(j);
+    List<ScheduledJob> jobs = jobLists.get(ret.getTransactionStage().ordinal());
     if (jobs == null) {
       jobs = new CopyOnWriteArrayList<ScheduledJob>();
-      jobLists.put(ret.getExecutionTime().ordinal(), jobs);
+      jobLists.put(ret.getTransactionStage().ordinal(), jobs);
     }
     jobs.add(ret);
     return ret;
   }
 
-  /** Run all Jobs with the specified JobExecutionTime. */
-  public void runJobs(final JobExecutionTime time) {
-    List<ScheduledJob> jobs = this.jobLists.get(time.ordinal());
+  /** Run all Jobs from the specified {@link TransactionStage}. */
+  public void runJobs(final TransactionStage stage) {
+    final List<ScheduledJob> jobs = this.jobLists.get(stage.ordinal());
     if (jobs != null) {
       for (final ScheduledJob scheduledJob : jobs) {
         runJob(scheduledJob);
@@ -89,16 +89,14 @@ public class Schedule {
     }
   }
 
-  /**
-   * Run all scheduled Jobs for the given entity.
-   *
-   * <p>Execution time: Either CHECK or what is given as jobclass' annotation.
-   */
+  /** Run all scheduled Jobs of a given class for the given entity. */
   public void runJob(final EntityInterface entity, final Class<? extends Job> jobclass) {
-    List<ScheduledJob> jobs =
+
+    // the jobs of this class are in the jobList for the TransactionStage of the jobClass.
+    final List<ScheduledJob> jobs =
         jobclass.isAnnotationPresent(JobAnnotation.class)
-            ? this.jobLists.get(jobclass.getAnnotation(JobAnnotation.class).time().ordinal())
-            : this.jobLists.get(JobExecutionTime.CHECK.ordinal());
+            ? this.jobLists.get(jobclass.getAnnotation(JobAnnotation.class).stage().ordinal())
+            : this.jobLists.get(TransactionStage.CHECK.ordinal());
     for (final ScheduledJob scheduledJob : jobs) {
       if (jobclass.isInstance(scheduledJob.job)) {
         if (scheduledJob.job.getEntity() == entity) {
diff --git a/src/main/java/org/caosdb/server/jobs/ScheduledJob.java b/src/main/java/org/caosdb/server/jobs/ScheduledJob.java
index defd1d68d15bc160e7bfae9dc7fd732c7d25922a..65bc3a1947baf5b76539f281e0d855e878a3bdfd 100644
--- a/src/main/java/org/caosdb/server/jobs/ScheduledJob.java
+++ b/src/main/java/org/caosdb/server/jobs/ScheduledJob.java
@@ -81,8 +81,8 @@ public class ScheduledJob {
   }
 
   /** Return the state of the inner Job. */
-  public JobExecutionTime getExecutionTime() {
-    return this.job.getExecutionTime();
+  public TransactionStage getTransactionStage() {
+    return this.job.getTransactionStage();
   }
 
   public boolean skip() {
diff --git a/src/main/java/org/caosdb/server/jobs/TransactionStage.java b/src/main/java/org/caosdb/server/jobs/TransactionStage.java
new file mode 100644
index 0000000000000000000000000000000000000000..8248140d913e08acfb699cbb553a14749c8e2f1f
--- /dev/null
+++ b/src/main/java/org/caosdb/server/jobs/TransactionStage.java
@@ -0,0 +1,63 @@
+/*
+ * ** header v3.0
+ * This file is a part of the CaosDB Project.
+ *
+ * Copyright (C) 2018 Research Group Biomedical Physics,
+ * Max-Planck-Institute for Dynamics and Self-Organization Göttingen
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * ** end header
+ */
+package org.caosdb.server.jobs;
+
+import org.caosdb.server.jobs.core.Strict;
+import org.caosdb.server.transaction.Transaction;
+import org.caosdb.server.utils.UndoHandler;
+
+/**
+ * Any {@link Transaction} of an Entity consists of sequence of stages. Jobs which have a {@link
+ * JobAnnotation} can specify the transaction stage in which they are to be executed. By default,
+ * any job is executed during the CHECK stage.
+ * <li>INIT - The transaction is being initialized (create schedule, aquire locks (one writing
+ *     thread, many reading threads permitted).
+ * <li>PRE_CHECK - Prepare entities (e.g. check if any updates are to be processed, load/generate
+ *     acl, cast objects into more specialized classes.)
+ * <li>CHECK - Do the actual consistency checking.
+ * <li>POST_CHECK - Do more consistency checking (reserved for those jobs which need the normal
+ *     checks to be done already, e.g. the {@link Strict} job).
+ * <li>PRE_TRANSACTION - Prepare the entities for the transaction (e.g. for paging, translate the
+ *     state messages into state properties). Also, in this stage, the full read and write lock is
+ *     aquired.
+ * <li>TRANSACTION - Do the actual transaction.
+ * <li>POST_TRANSACTION - Post-process entities (Success messages, write history, transform stage
+ *     properties into messages).
+ * <li>CLEANUP - Release all locks, remove temporary files, clean-up the {@link UndoHandler}s.
+ * <li>ROLL_BACK - In case an error occured in any of the stages, this special stage rolls-back any
+ *     changes and calls the {@link UndoHandler#undo()} of the {@link UndoHandler}s.
+ *
+ * @see {@link Transaction#execute()}.
+ * @author Timm Fitschen <t.fitschen@indiscale.com>
+ */
+public enum TransactionStage {
+  INIT,
+  PRE_CHECK,
+  CHECK,
+  POST_CHECK,
+  PRE_TRANSACTION,
+  TRANSACTION,
+  POST_TRANSACTION,
+  CLEANUP,
+  ROLL_BACK
+}
diff --git a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java
index d1a2113a2f87018cec63d381cce64ad6c8ad09f2..408384f416e1249501d5383ea1028ced56914ded 100644
--- a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java
+++ b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java
@@ -29,12 +29,12 @@ import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.wrapper.Parent;
 import org.caosdb.server.jobs.ContainerJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.transaction.Retrieve;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
 
-@JobAnnotation(time = JobExecutionTime.INIT)
+@JobAnnotation(stage = TransactionStage.INIT)
 public class AccessControl extends ContainerJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/Atomic.java b/src/main/java/org/caosdb/server/jobs/core/Atomic.java
index 45b5de8e4d5835bd835a797290e2d3c875687e44..8639615ee6ac4ddd648a19d15262a1c526ef10c6 100644
--- a/src/main/java/org/caosdb/server/jobs/core/Atomic.java
+++ b/src/main/java/org/caosdb/server/jobs/core/Atomic.java
@@ -26,7 +26,7 @@ import org.caosdb.server.entity.Entity;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.ContainerJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.transaction.WriteTransaction;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.Observable;
@@ -34,7 +34,7 @@ import org.caosdb.server.utils.Observer;
 import org.caosdb.server.utils.ServerMessages;
 
 @JobAnnotation(
-    time = JobExecutionTime.PRE_TRANSACTION,
+    stage = TransactionStage.PRE_TRANSACTION,
     transaction = WriteTransaction.class,
     loadAlways = true)
 public class Atomic extends ContainerJob implements Observer {
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java
index 02cb96fc1214712c7a8ef1bb98327ba9fb39e9d0..e663874189ee0301a5b30452468391711624b606 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java
@@ -33,7 +33,7 @@ import org.caosdb.server.entity.wrapper.Parent;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.jobs.EntityJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.permissions.EntityPermission;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
@@ -43,7 +43,7 @@ import org.caosdb.server.utils.ServerMessages;
  *
  * @author tf
  */
-@JobAnnotation(time = JobExecutionTime.PRE_CHECK)
+@JobAnnotation(stage = TransactionStage.PRE_CHECK)
 public class CheckParValid extends EntityJob {
   @Override
   public final void run() {
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java
index f95104bd2f2552a642e7e4bcd2fc13f7fd2788d4..390deedde211c0931eca1c3677ac5ff9c8ee9d8f 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java
@@ -32,7 +32,7 @@ import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.jobs.EntityJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.permissions.EntityPermission;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
@@ -42,7 +42,7 @@ import org.caosdb.server.utils.ServerMessages;
  *
  * @author tf
  */
-@JobAnnotation(time = JobExecutionTime.PRE_CHECK)
+@JobAnnotation(stage = TransactionStage.PRE_CHECK)
 public class CheckPropValid extends EntityJob {
   @Override
   public final void run() {
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java b/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java
index cd187cf17ad72c5431fcd3f2eb0b95890941faf9..d82a8a5be4baf265e6af263391751a68458a91f4 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java
@@ -30,7 +30,7 @@ import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.Message.MessageType;
 import org.caosdb.server.entity.UpdateEntity;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.transaction.WriteTransaction;
 import org.caosdb.server.utils.ServerMessages;
 
@@ -42,7 +42,7 @@ import org.caosdb.server.utils.ServerMessages;
  *
  * @author Timm Fitschen (t.fitschen@indiscale.com)
  */
-@JobAnnotation(time = JobExecutionTime.POST_CHECK, transaction = WriteTransaction.class)
+@JobAnnotation(stage = TransactionStage.POST_CHECK, transaction = WriteTransaction.class)
 public class CheckStateTransition extends EntityStateJob {
 
   private static final String PERMISSION_STATE_FORCE_FINAL = "STATE:FORCE:FINAL";
diff --git a/src/main/java/org/caosdb/server/jobs/core/DebugCalls.java b/src/main/java/org/caosdb/server/jobs/core/DebugCalls.java
index 8527560d02e498bf3812162a8b01b9641aad7260..8e0ae7435693ba1010f023da6c585911825f5a5e 100644
--- a/src/main/java/org/caosdb/server/jobs/core/DebugCalls.java
+++ b/src/main/java/org/caosdb/server/jobs/core/DebugCalls.java
@@ -25,11 +25,11 @@ package org.caosdb.server.jobs.core;
 import org.caosdb.server.CaosDBServer;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 
 @JobAnnotation(
     flag = "debug",
-    time = JobExecutionTime.INIT,
+    stage = TransactionStage.INIT,
     values = {DebugCalls.ex_null_p},
     description =
         "This job for debugging and is available in debug mode only. Otherwise the flag is ignored. It throws an exception on purpose.",
diff --git a/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java b/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
index 7f5444b36104526101ebf9b3f2aa547b3d91cbc9..399039a072d2fd7b5f54566b2f448791169a356b 100644
--- a/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
+++ b/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
@@ -26,13 +26,13 @@ import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.query.Query;
 import org.caosdb.server.query.Query.ParsingException;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
 
-@JobAnnotation(flag = "query", time = JobExecutionTime.INIT)
+@JobAnnotation(flag = "query", stage = TransactionStage.INIT)
 public class ExecuteQuery extends FlagJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/History.java b/src/main/java/org/caosdb/server/jobs/core/History.java
index 5594b5afdb841436dbdd63f96b8e2c44faef51c6..d39a6e1f570400194b3a530c3c323a92d0374b7c 100644
--- a/src/main/java/org/caosdb/server/jobs/core/History.java
+++ b/src/main/java/org/caosdb/server/jobs/core/History.java
@@ -27,7 +27,7 @@ import org.caosdb.server.database.backend.transaction.RetrieveVersionHistory;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.permissions.EntityPermission;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
@@ -37,7 +37,7 @@ import org.caosdb.server.utils.ServerMessages;
  *
  * @author Timm Fitschen (t.fitschen@indiscale.com)
  */
-@JobAnnotation(time = JobExecutionTime.POST_TRANSACTION, flag = "H")
+@JobAnnotation(stage = TransactionStage.POST_TRANSACTION, flag = "H")
 public class History extends FlagJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java b/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java
index bda4b8ebe885aa49df13ecf36ab14663c7ead270..39b66e35330a485bbd8eb4c40724ab3b250ccc45 100644
--- a/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java
+++ b/src/main/java/org/caosdb/server/jobs/core/InheritInitialState.java
@@ -5,9 +5,9 @@ import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.wrapper.Parent;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 
-@JobAnnotation(time = JobExecutionTime.CHECK)
+@JobAnnotation(stage = TransactionStage.CHECK)
 public class InheritInitialState extends EntityStateJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java b/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java
index 7dbff695a342e5dcd2a19a2d72116c14fba78a6c..d3a1fc636761298f1b0586a4036be09ced835021 100644
--- a/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java
+++ b/src/main/java/org/caosdb/server/jobs/core/InitEntityStateJobs.java
@@ -39,7 +39,7 @@ import org.caosdb.server.entity.UpdateEntity;
 import org.caosdb.server.entity.WritableEntity;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.transaction.WriteTransaction;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.Observable;
@@ -57,7 +57,7 @@ import org.caosdb.server.utils.Observer;
  */
 @JobAnnotation(
     loadAlways = true,
-    time = JobExecutionTime.INIT,
+    stage = TransactionStage.INIT,
     transaction = WriteTransaction.class)
 public class InitEntityStateJobs extends EntityStateJob implements Observer {
 
diff --git a/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java b/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java
index 35ce49297291accd41a7c293fc909cc0a27f9317..8133e4659d55caf29faa56eeb80ced194cd26cfc 100644
--- a/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java
+++ b/src/main/java/org/caosdb/server/jobs/core/InsertFilesInDir.java
@@ -46,7 +46,7 @@ import org.caosdb.server.entity.Role;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.Job;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.transaction.Retrieve;
 import org.caosdb.server.transaction.WriteTransactionInterface;
 import org.caosdb.server.utils.EntityStatus;
@@ -57,7 +57,7 @@ import org.caosdb.server.utils.Utils;
 @JobAnnotation(
     flag = "InsertFilesInDir",
     loadOnDefault = false,
-    time = JobExecutionTime.INIT,
+    stage = TransactionStage.INIT,
     description =
         "For expert users only! Risk of creating spam records!\nValue of this flag might be any directory on the servers local file system which is part of the server's back-end file storage. This job will insert every readable, nonhidden file in said directory into the database and link the file with a symlink. This is useful to add a huge amount of files without actully copying them to the back-end file storage. If you call this job on a directory more than once every file that was recently added to the source directory is inserted. Every yet known file is left untouched. \nOptional parameter -e EXCLUDE: A regular expression of files which are to be ignored. \n Optional parameter -i INCLUDE: a regular expression of files which are to be included. By default, all files are included. The -e takes precedence. \nOptional parameter -p PREFIX: Stores all new files into the directory PREFIX in the server's file system.\nOptional parameter --force-allow-symlinks: Simlinks in your data are a source of problems for the database. Therefore, simlinks are ignored by default. This option allows symlinks (but still generates simlink warnings). \nPrepend/Dry run: Call this flag with a retrieve transaction (HTTP GET) and it will only count all files and list them without actually inserting them.")
 public class InsertFilesInDir extends FlagJob {
diff --git a/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java b/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java
index 89f381d648144e274325c5c71a57c9f4daf04895..ef8df214c804fb1d55c3ed088c5f7f6e998aca07 100644
--- a/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java
+++ b/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java
@@ -27,9 +27,9 @@ import org.caosdb.server.jobs.ContainerJob;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.Job;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 
-@JobAnnotation(time = JobExecutionTime.INIT)
+@JobAnnotation(stage = TransactionStage.INIT)
 public class LoadContainerFlagJobs extends ContainerJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java b/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java
index 6e98704a5f6d73199993f2ed531e6d6277934e64..855d6a139aa80fa0b67cda652708b3e56ef5eb2b 100644
--- a/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java
+++ b/src/main/java/org/caosdb/server/jobs/core/MakeStateMessage.java
@@ -30,7 +30,7 @@ import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.entity.xml.ToElementable;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.transaction.Retrieve;
 import org.jdom2.Element;
 
@@ -46,7 +46,7 @@ import org.jdom2.Element;
 @JobAnnotation(
     loadAlways = true,
     transaction = Retrieve.class,
-    time = JobExecutionTime.POST_TRANSACTION)
+    stage = TransactionStage.POST_TRANSACTION)
 public class MakeStateMessage extends EntityStateJob {
 
   public static final String SPARSE_FLAG = "sparseState";
diff --git a/src/main/java/org/caosdb/server/jobs/core/MakeStateProperty.java b/src/main/java/org/caosdb/server/jobs/core/MakeStateProperty.java
index 56682921563d77f462903567a2c128fcd5d92555..c2aebc681b38a9902bede69883cce4025bc8afe6 100644
--- a/src/main/java/org/caosdb/server/jobs/core/MakeStateProperty.java
+++ b/src/main/java/org/caosdb/server/jobs/core/MakeStateProperty.java
@@ -25,14 +25,14 @@ package org.caosdb.server.jobs.core;
 
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.transaction.WriteTransaction;
 
 /**
  * This job constructs an ordinary Property from the State right before the entity is being written
  * to the back-end and after any checks run.
  */
-@JobAnnotation(transaction = WriteTransaction.class, time = JobExecutionTime.PRE_TRANSACTION)
+@JobAnnotation(transaction = WriteTransaction.class, stage = TransactionStage.PRE_TRANSACTION)
 public class MakeStateProperty extends EntityStateJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/NoCache.java b/src/main/java/org/caosdb/server/jobs/core/NoCache.java
index a4f639392ac63a97f2f025dfe6717a664114c561..e408330ee2639d1c5d7dc5f145848e292daa9b3b 100644
--- a/src/main/java/org/caosdb/server/jobs/core/NoCache.java
+++ b/src/main/java/org/caosdb/server/jobs/core/NoCache.java
@@ -24,7 +24,7 @@ package org.caosdb.server.jobs.core;
 
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 
 @JobAnnotation(
     flag = "cache",
@@ -32,7 +32,7 @@ import org.caosdb.server.jobs.JobExecutionTime;
     description =
         "Depending on the configuraion of the server some transactions with the backend database might be cached internally for performance reasons. Disable the internal caching for this transaction with 'false'. Note: You cannot enable the caching with 'true', if the server is not configured to use caching.",
     values = {"true", "false"},
-    time = JobExecutionTime.INIT)
+    stage = TransactionStage.INIT)
 public class NoCache extends FlagJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/Paging.java b/src/main/java/org/caosdb/server/jobs/core/Paging.java
index 43683639f75c08be394a38ce03e91282405f333d..5f2a6ed62f48f20d09c34c8ee34190231903ffe7 100644
--- a/src/main/java/org/caosdb/server/jobs/core/Paging.java
+++ b/src/main/java/org/caosdb/server/jobs/core/Paging.java
@@ -27,11 +27,11 @@ import java.util.regex.Pattern;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.transaction.Retrieve;
 import org.caosdb.server.utils.EntityStatus;
 
-@JobAnnotation(flag = "P", time = JobExecutionTime.PRE_TRANSACTION)
+@JobAnnotation(flag = "P", stage = TransactionStage.PRE_TRANSACTION)
 public class Paging extends FlagJob {
 
   public static final int DEFAULT_LENGTH = 100;
diff --git a/src/main/java/org/caosdb/server/jobs/core/PickUp.java b/src/main/java/org/caosdb/server/jobs/core/PickUp.java
index b91fccf72d54022c6f6d19ba26c2b0974a54829f..94a80836c863ea226a88e035201a2e2fb9fd1039 100644
--- a/src/main/java/org/caosdb/server/jobs/core/PickUp.java
+++ b/src/main/java/org/caosdb/server/jobs/core/PickUp.java
@@ -30,12 +30,12 @@ import org.caosdb.server.entity.FileProperties;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.jobs.EntityJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.Observable;
 import org.caosdb.server.utils.Observer;
 
-@JobAnnotation(time = JobExecutionTime.INIT)
+@JobAnnotation(stage = TransactionStage.INIT)
 public class PickUp extends EntityJob implements Observer {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java b/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java
index e7e8f0e4d6aab3f3d0b3e9392d408a88aaa0abcc..1cc12c6102f66dda224360554e4ac5c515ae418d 100644
--- a/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java
+++ b/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java
@@ -35,7 +35,7 @@ import org.caosdb.server.entity.wrapper.Parent;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.jobs.EntityJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
 
@@ -44,7 +44,7 @@ import org.caosdb.server.utils.ServerMessages;
  *
  * @author tf
  */
-@JobAnnotation(time = JobExecutionTime.PRE_TRANSACTION)
+@JobAnnotation(stage = TransactionStage.PRE_TRANSACTION)
 public class ProcessNameProperties extends EntityJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java
index f59b2c1ec94de846714575537516c41d18bf4629..4664c01b88d361485c342a8fcddca2ab082f0dee 100644
--- a/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java
+++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java
@@ -27,7 +27,7 @@ import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.xml.ToElementable;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.permissions.EntityPermission;
 import org.caosdb.server.transaction.Retrieve;
 import org.caosdb.server.utils.EntityStatus;
@@ -35,7 +35,7 @@ import org.caosdb.server.utils.ServerMessages;
 import org.jdom2.Element;
 
 @JobAnnotation(
-    time = JobExecutionTime.POST_TRANSACTION,
+    stage = TransactionStage.POST_TRANSACTION,
     flag = "ACL",
     description = "Adds an XML representation of the EntityACL to the output of this entity.")
 public class RetrieveACL extends FlagJob {
diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java
index 603d861ad24b659fab262291d888420c02f6bcf5..7cd7791e0b27f1ec1d5e67e047e7f1cbe177948c 100644
--- a/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java
+++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java
@@ -26,9 +26,9 @@ import org.caosdb.server.database.backend.transaction.RetrieveAll;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 
-@JobAnnotation(flag = "all", time = JobExecutionTime.INIT)
+@JobAnnotation(flag = "all", stage = TransactionStage.INIT)
 public class RetrieveAllJob extends FlagJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveIdOnlyFlag.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveIdOnlyFlag.java
index 1712950dff9403df54f26457d0b6a763d7ce4de8..844468c5473b4d2dff6e59777f925f2701505749 100644
--- a/src/main/java/org/caosdb/server/jobs/core/RetrieveIdOnlyFlag.java
+++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveIdOnlyFlag.java
@@ -25,10 +25,10 @@ package org.caosdb.server.jobs.core;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.utils.EntityStatus;
 
-@JobAnnotation(flag = "IdOnly", time = JobExecutionTime.PRE_TRANSACTION)
+@JobAnnotation(flag = "IdOnly", stage = TransactionStage.PRE_TRANSACTION)
 public class RetrieveIdOnlyFlag extends FlagJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java
index 7377805805ec55e2c3c3928cc42b0c053d8a9c9d..8b6412cee5d6e800a78509741d4f3680403008ce 100644
--- a/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java
+++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java
@@ -28,7 +28,7 @@ import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.xml.ToElementable;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.permissions.EntityPermission;
 import org.caosdb.server.permissions.ResponsibleAgent;
 import org.caosdb.server.transaction.Retrieve;
@@ -37,7 +37,7 @@ import org.caosdb.server.utils.ServerMessages;
 import org.jdom2.Element;
 
 @JobAnnotation(
-    time = JobExecutionTime.POST_TRANSACTION,
+    stage = TransactionStage.POST_TRANSACTION,
     flag = "owner",
     description = "Adds an XML representation of the owner(s) to the output of this entity.")
 public class RetrieveOwner extends FlagJob {
diff --git a/src/main/java/org/caosdb/server/jobs/core/RetriveAllNames.java b/src/main/java/org/caosdb/server/jobs/core/RetriveAllNames.java
index dfd69a5cb5a40a6e6be35e345f17e38f3dbb7e2e..b5787246cbafba0df31056d2da15adb330ef0c50 100644
--- a/src/main/java/org/caosdb/server/jobs/core/RetriveAllNames.java
+++ b/src/main/java/org/caosdb/server/jobs/core/RetriveAllNames.java
@@ -4,7 +4,7 @@ import org.caosdb.server.database.backend.transaction.GetAllNames;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.permissions.EntityPermission;
 import org.caosdb.server.utils.EntityStatus;
 
@@ -15,7 +15,7 @@ import org.caosdb.server.utils.EntityStatus;
  * <p>The entites' status are set to VALID because the entities parents and properties do not have
  * to be retrieved.
  */
-@JobAnnotation(flag = "names", time = JobExecutionTime.INIT)
+@JobAnnotation(flag = "names", stage = TransactionStage.INIT)
 public class RetriveAllNames extends FlagJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/Strict.java b/src/main/java/org/caosdb/server/jobs/core/Strict.java
index aebbecf86a89476339dbdef8892b074aebc8196d..bb69063c116e5c14aa9fad2b0bbf881d2481b394 100644
--- a/src/main/java/org/caosdb/server/jobs/core/Strict.java
+++ b/src/main/java/org/caosdb/server/jobs/core/Strict.java
@@ -27,11 +27,11 @@ import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.xml.ToElementable;
 import org.caosdb.server.jobs.ContainerJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
 
-@JobAnnotation(time = JobExecutionTime.POST_CHECK)
+@JobAnnotation(stage = TransactionStage.POST_CHECK)
 public class Strict extends ContainerJob {
   // TODO load strict job via unified flag interface
 
diff --git a/src/main/java/org/caosdb/server/jobs/core/UpdateUnitConverters.java b/src/main/java/org/caosdb/server/jobs/core/UpdateUnitConverters.java
index b3ef80adb64fcf3c1007a33a64bde691c9ff9c1d..0b71d2102c98188d875d52d3bbc3e0f79a23043b 100644
--- a/src/main/java/org/caosdb/server/jobs/core/UpdateUnitConverters.java
+++ b/src/main/java/org/caosdb/server/jobs/core/UpdateUnitConverters.java
@@ -25,12 +25,12 @@ package org.caosdb.server.jobs.core;
 import org.caosdb.server.database.backend.transaction.InsertLinCon;
 import org.caosdb.server.jobs.EntityJob;
 import org.caosdb.server.jobs.JobAnnotation;
-import org.caosdb.server.jobs.JobExecutionTime;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.unit.Converter;
 import org.caosdb.unit.LinearConverter;
 import org.caosdb.unit.Unit;
 
-@JobAnnotation(time = JobExecutionTime.PRE_TRANSACTION)
+@JobAnnotation(stage = TransactionStage.PRE_TRANSACTION)
 public class UpdateUnitConverters extends EntityJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java
index fdc4e646e3bef6404dd83e254558d239a72fb81a..99c305fa17b37878cc5f3277c93623a915be4ea3 100644
--- a/src/main/java/org/caosdb/server/transaction/Transaction.java
+++ b/src/main/java/org/caosdb/server/transaction/Transaction.java
@@ -39,14 +39,15 @@ import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.Message.MessageType;
 import org.caosdb.server.entity.container.TransactionContainer;
 import org.caosdb.server.jobs.Job;
-import org.caosdb.server.jobs.JobExecutionTime;
 import org.caosdb.server.jobs.Schedule;
 import org.caosdb.server.jobs.ScheduledJob;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.jobs.core.AccessControl;
 import org.caosdb.server.jobs.core.CheckDatatypePresent;
 import org.caosdb.server.jobs.core.CheckEntityACLRoles;
 import org.caosdb.server.jobs.core.Mode;
 import org.caosdb.server.jobs.core.PickUp;
+import org.caosdb.server.permissions.EntityACL;
 import org.caosdb.server.utils.AbstractObservable;
 import org.caosdb.server.utils.Info;
 import org.caosdb.server.utils.Observer;
@@ -73,9 +74,11 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
     this(container, Info.getInstance());
   }
 
-  protected Transaction(C container, Observer o) {
+  protected Transaction(final C container, final Observer o) {
     this.container = container;
-    if (o != null) acceptObserver(o);
+    if (o != null) {
+      acceptObserver(o);
+    }
   }
 
   public static DatabaseAccessManager getAccessManager() {
@@ -94,7 +97,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
   protected void makeSchedule() throws Exception {
     // load flag jobs
     final Job loadContainerFlags = Job.getJob("LoadContainerFlagJobs", Mode.MUST, null, this);
-    ScheduledJob scheduledJob = this.schedule.add(loadContainerFlags);
+    final ScheduledJob scheduledJob = this.schedule.add(loadContainerFlags);
     this.schedule.runJob(scheduledJob);
 
     // AccessControl
@@ -126,31 +129,36 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
    * <p>This method calls the following other internal methods and scheduled jobs stored in the
    * {@link getSchedule() internal Schedule object}:
    *
-   * <ul>
-   *   <li>{@link init}
-   *   <li>{@link Schedule.runJobs(INIT)}
-   *   <li>{@link preCheck}
-   *   <li>{@link Schedule.runJobs(PRE_CHECK)}
-   *   <li>{@link check}
-   *   <li>{@link Schedule.runJobs(POST_CHECK)}
-   *   <li>{@link postCheck}
-   *   <li>{@link preTransaction}
-   *   <li>{@link Schedule.runJobs(PRE_TRANSACTION)}
+   * <ol>
+   *   <li>{@link init} - Make {@link Schedule}, resolve names to ids, aquire read access.
+   *   <li>{@link Schedule.runJobs(INIT)} - See {@link TransactionStage#INIT}.
+   *   <li>{@link preCheck} - Load/generate {@link EntityACL}s, check if any updates are to be
+   *       processed.
+   *   <li>{@link Schedule.runJobs(PRE_CHECK)} - See {@link TransactionStage#PRE_CHECK}.
+   *   <li>{@link check} - only run the jobs in the CHECK stage, see {@link TransactionStage#CHECK}.
+   *   <li>{@link Schedule.runJobs(POST_CHECK)} - See {@link TransactionStage#POST_CHECK}.
+   *   <li>{@link postCheck} - currently, nothing happens here (just there for consistency).
+   *   <li>{@link preTransaction} - acquire write access (if necessary)
+   *   <li>{@link Schedule.runJobs(PRE_TRANSACTION)} - See {@link TransactionStage#PRE_TRANSACTION}.
    *   <li>{@link transaction}: This is typically the main method of a Transaction.
-   *   <li>{@link Schedule.runJobs(POST_TRANSACTION)}
-   *   <li>{@link postTransaction}
-   *   <li>{@link writeHistory}
-   *   <li>{@link commit}
-   *   <li>{@link rollBack}: Only in the case of errors.
-   *   <li>{@link cleanUp}: Always.
-   *   <li>{@link notifyObservers(CLEAN_UP)}: Also always.
+   *   <li>{@link Schedule.runJobs(POST_TRANSACTION)} - See {@link
+   *       TransactionStage#POST_TRANSACTION}.
+   *   <li>{@link postTransaction} - Add success messages
+   *   <li>{@link writeHistory} - write the transaction history logs
+   *   <li>{@link commit} - commit the changes
+   *   <li>{@link rollBack}: Only in the case of errors - rollback any changes (also file-system
+   *       changes).
+   *   <li>{@link cleanUp}: Always - cleanup the transaction (e.g. remove temporary files).
+   *   <li>{@link notifyObservers(CLEAN_UP)}: Also always - for any jobs that do their own clean-up.
+   *
+   * @see {@link TransactionStage}.
    */
   @Override
   public final void execute() throws Exception {
     long t1 = System.currentTimeMillis();
     try {
       init();
-      this.schedule.runJobs(JobExecutionTime.INIT);
+      this.schedule.runJobs(TransactionStage.INIT);
       getContainer()
           .getTransactionBenchmark()
           .addMeasurement(
@@ -158,7 +166,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
 
       t1 = System.currentTimeMillis();
       preCheck();
-      this.schedule.runJobs(JobExecutionTime.PRE_CHECK);
+      this.schedule.runJobs(TransactionStage.PRE_CHECK);
       getContainer()
           .getTransactionBenchmark()
           .addMeasurement(
@@ -172,7 +180,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
               this.getClass().getSimpleName() + ".check", System.currentTimeMillis() - t1);
 
       t1 = System.currentTimeMillis();
-      this.schedule.runJobs(JobExecutionTime.POST_CHECK);
+      this.schedule.runJobs(TransactionStage.POST_CHECK);
       postCheck();
       getContainer()
           .getTransactionBenchmark()
@@ -181,7 +189,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
 
       t1 = System.currentTimeMillis();
       preTransaction();
-      this.schedule.runJobs(JobExecutionTime.PRE_TRANSACTION);
+      this.schedule.runJobs(TransactionStage.PRE_TRANSACTION);
       getContainer()
           .getTransactionBenchmark()
           .addMeasurement(
@@ -196,7 +204,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
               this.getClass().getSimpleName() + ".transaction", System.currentTimeMillis() - t1);
 
       t1 = System.currentTimeMillis();
-      this.schedule.runJobs(JobExecutionTime.POST_TRANSACTION);
+      this.schedule.runJobs(TransactionStage.POST_TRANSACTION);
       postTransaction();
       getContainer()
           .getTransactionBenchmark()
@@ -246,6 +254,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
     return getContainer().getOwner();
   }
 
+  /** Return true iff this transaction should be logged in the transaction history logs. */
   public abstract boolean logHistory();
 
   public UTCDateTime getTimestamp() {
@@ -255,36 +264,46 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
   // TODO move to post-transaction job
   private void writeHistory() throws TransactionException, Message {
     if (logHistory()) {
-      String realm = ((Principal) getTransactor().getPrincipal()).getRealm();
-      String username = ((Principal) getTransactor().getPrincipal()).getUsername();
+      final String realm = ((Principal) getTransactor().getPrincipal()).getRealm();
+      final String username = ((Principal) getTransactor().getPrincipal()).getUsername();
       execute(
           new InsertTransactionHistory(getContainer(), realm, username, getTimestamp()),
           getAccess());
     }
   }
 
+  /** @see {@link #execute()} */
   protected void rollBack() {
-    this.schedule.runJobs(JobExecutionTime.ROLL_BACK);
+    this.schedule.runJobs(TransactionStage.ROLL_BACK);
   }
 
+  /** @see {@link #execute()} */
   protected abstract void init() throws Exception;
 
+  /** @see {@link #execute()} */
   protected abstract void preCheck() throws InterruptedException, Exception;
 
+  /** @see {@link #execute()} */
   protected final void check() {
-    this.schedule.runJobs(JobExecutionTime.CHECK);
+    this.schedule.runJobs(TransactionStage.CHECK);
   }
 
+  /** @see {@link #execute()} */
   protected abstract void postCheck();
 
+  /** @see {@link #execute()} */
   protected abstract void preTransaction() throws InterruptedException;
 
+  /** @see {@link #execute()} */
   protected abstract void transaction() throws Exception;
 
+  /** @see {@link #execute()} */
   protected abstract void postTransaction() throws Exception;
 
+  /** @see {@link #execute()} */
   protected abstract void cleanUp();
 
+  /** @see {@link #execute()} */
   protected void commit() throws Exception {}
 
   public boolean useCache() {
diff --git a/src/main/java/org/caosdb/server/utils/FlagInfo.java b/src/main/java/org/caosdb/server/utils/FlagInfo.java
index 164c6aabe9c4fafff26f93db30d791fa91389eee..60697cb90df0bcf0da0588c580c49664ec0b0f52 100644
--- a/src/main/java/org/caosdb/server/utils/FlagInfo.java
+++ b/src/main/java/org/caosdb/server/utils/FlagInfo.java
@@ -55,7 +55,7 @@ public class FlagInfo {
     for (final JobAnnotation a : as) {
       final Element aElem = new Element(a.flag());
       aElem.setAttribute("description", a.description());
-      aElem.setAttribute("time", a.time().toString());
+      aElem.setAttribute("stage", a.stage().toString());
       if (!a.transaction().equals(TransactionInterface.class)) {
         aElem.setAttribute("transaction", a.transaction().getSimpleName());
       }
diff --git a/src/test/java/org/caosdb/server/jobs/ScheduleTest.java b/src/test/java/org/caosdb/server/jobs/ScheduleTest.java
index 7ad1d6112e8b7bd3a29042d5f6ca82709ae4100a..cef0ec3e076f38893ada35bbad881ccfe8a02331 100644
--- a/src/test/java/org/caosdb/server/jobs/ScheduleTest.java
+++ b/src/test/java/org/caosdb/server/jobs/ScheduleTest.java
@@ -46,6 +46,6 @@ public class ScheduleTest {
           }
         });
 
-    schedule.runJobs(JobExecutionTime.ROLL_BACK);
+    schedule.runJobs(TransactionStage.ROLL_BACK);
   }
 }