diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java
index 2668e770d6f779e0b3121f30aa1778dccf6c9d93..48367508112c2c3267abd771fa84eb21ea16a534 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -1004,7 +1004,7 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
 
   @Override
   public boolean skipJob() {
-    return false;
+    return this.entityStatus == EntityStatus.IGNORE;
   }
 
   @Override
diff --git a/src/main/java/org/caosdb/server/entity/xml/ParentToElementStrategy.java b/src/main/java/org/caosdb/server/entity/xml/ParentToElementStrategy.java
index 4f7906829427a2305f0f1b2addf72d2b69112a9e..2556fdb21bbb55252144a4200f75a265a562af74 100644
--- a/src/main/java/org/caosdb/server/entity/xml/ParentToElementStrategy.java
+++ b/src/main/java/org/caosdb/server/entity/xml/ParentToElementStrategy.java
@@ -26,7 +26,6 @@ package org.caosdb.server.entity.xml;
 
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.wrapper.Parent;
-import org.caosdb.server.utils.EntityStatus;
 import org.jdom2.Element;
 
 /**
@@ -51,15 +50,4 @@ public class ParentToElementStrategy extends EntityToElementStrategy {
     }
     return element;
   }
-
-  @Override
-  public Element addToElement(
-      final EntityInterface entity,
-      final Element element,
-      final SerializeFieldStrategy setFieldStrategy) {
-    if (entity.getEntityStatus() != EntityStatus.IGNORE) {
-      element.addContent(toElement(entity, setFieldStrategy));
-    }
-    return element;
-  }
 }
diff --git a/src/main/java/org/caosdb/server/jobs/TransactionStage.java b/src/main/java/org/caosdb/server/jobs/TransactionStage.java
index c265fc25b98aebb303c4f5b9907d3d59c2316347..9e15b4e556269def79d58e532bbe3c9e6cbb9bbd 100644
--- a/src/main/java/org/caosdb/server/jobs/TransactionStage.java
+++ b/src/main/java/org/caosdb/server/jobs/TransactionStage.java
@@ -50,7 +50,6 @@ import org.caosdb.server.utils.UndoHandler;
  * @author Timm Fitschen <t.fitschen@indiscale.com>
  */
 public enum TransactionStage {
-  PRE_INIT,
   INIT,
   PRE_CHECK,
   CHECK,
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 017555e0f25595dc446987101214818eeb67a1ce..5e4d02f7f94bf05d757f34f7fcf7fe36ad5a9bc0 100644
--- a/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
+++ b/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
@@ -35,13 +35,16 @@ import org.caosdb.server.transaction.Retrieve;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
 
-@JobAnnotation(flag = "query", stage = TransactionStage.INIT)
+@JobAnnotation(flag = "query", stage = TransactionStage.INIT, transaction = Retrieve.class)
 public class ExecuteQuery extends FlagJob {
 
   @Override
   protected void job(final String value) {
 
     if (value != null) {
+      // run paging job first
+      getTransaction().getSchedule().runJob(null, Paging.class);
+
       final Query queryInstance =
           new Query(value, getTransaction().getTransactor(), getContainer());
       getContainer().setQuery(queryInstance);
@@ -55,13 +58,19 @@ public class ExecuteQuery extends FlagJob {
             .addMessage(new Message(MessageType.Info, (MessageCode) null, e.getMessage()));
       }
       getContainer().addMessage(queryInstance);
-      int index1 = getTransaction().getPagingIndex1();
-      int index2 = getTransaction().getPagingIndex2();
+
+      int index = 0;
+      int length = getContainer().size();
+
+      if (((Retrieve) getTransaction()).hasPaging()) {
+        Retrieve.Paging paging = ((Retrieve) getTransaction()).getPaging();
+        index = Math.min(getContainer().size(), paging.index);
+        length = Math.min(getContainer().size(), paging.length);
+      }
+
       int ii = 0;
       for (final EntityInterface entity : getContainer()) {
-        if (!(getTransaction() instanceof Retrieve)
-            || !getTransaction().hasPaging()
-            || (ii >= index1 && ii < index2)) {
+        if (ii >= index && ii < length) {
           getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction()));
         } else {
           entity.setEntityStatus(EntityStatus.IGNORE);
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 ce499a5b766b58437bd248255f9394682d3608a1..d7814b71218756fbe72c46257d658fb516018104 100644
--- a/src/main/java/org/caosdb/server/jobs/core/Paging.java
+++ b/src/main/java/org/caosdb/server/jobs/core/Paging.java
@@ -24,12 +24,14 @@ package org.caosdb.server.jobs.core;
 
 import java.util.regex.Matcher;
 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.TransactionStage;
 import org.caosdb.server.transaction.Retrieve;
+import org.caosdb.server.utils.EntityStatus;
 
-@JobAnnotation(flag = "P", stage = TransactionStage.PRE_INIT)
+@JobAnnotation(flag = "P", stage = TransactionStage.INIT, transaction = Retrieve.class)
 public class Paging extends FlagJob {
 
   public static final int DEFAULT_LENGTH = 100;
@@ -40,28 +42,29 @@ public class Paging extends FlagJob {
   protected void job(final String value) {
     if (getTransaction() instanceof Retrieve) {
       if (value != null) {
-        int index1 = DEFAULT_INDEX;
-        int index2 = index1 + DEFAULT_LENGTH;
+        int index = DEFAULT_INDEX;
+        int length = index + DEFAULT_LENGTH;
         final Matcher m = pattern.matcher(value);
         if (m.matches()) {
           if (m.group(1) != null) {
-            index1 = Integer.parseInt(m.group(1));
+            index = Integer.parseInt(m.group(1));
           }
           if (m.group(2) != null) {
-            index2 = index1 + Integer.parseInt(m.group(2));
+            length = index + Integer.parseInt(m.group(2));
           }
         }
-        getTransaction().setPagingIndices(index1, index2);
-        /*
+
+        // this info may be used by other jobs
+        ((Retrieve) getTransaction()).setPaging(index, length);
+
         int i = 0;
         for (final EntityInterface e : getContainer()) {
-          if (i >= index2 || i < index1) {
+          if (i >= length || i < index) {
             // do not retrieve this entity
             e.setEntityStatus(EntityStatus.IGNORE);
           }
           i++;
         }
-        */
       }
     }
   }
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 7cd7791e0b27f1ec1d5e67e047e7f1cbe177948c..fcd1ee7f48c8421e421046e0bb93b373b41cc865 100644
--- a/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java
+++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveAllJob.java
@@ -27,19 +27,41 @@ import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
 import org.caosdb.server.jobs.TransactionStage;
+import org.caosdb.server.transaction.Retrieve;
+import org.caosdb.server.utils.EntityStatus;
 
-@JobAnnotation(flag = "all", stage = TransactionStage.INIT)
+@JobAnnotation(flag = "all", stage = TransactionStage.INIT, transaction = Retrieve.class)
 public class RetrieveAllJob extends FlagJob {
 
   @Override
   protected void job(String value) {
     if (getContainer().isEmpty()) {
+      // run paging job first
+      getTransaction().getSchedule().runJob(null, Paging.class);
+
       if (value == null) {
         value = "ENTITY";
       }
+
       execute(new RetrieveAll(getContainer(), value));
+
+      int index = 0;
+      int length = getContainer().size();
+
+      if (((Retrieve) getTransaction()).hasPaging()) {
+        index = Math.min(getContainer().size(), ((Retrieve) getTransaction()).getPaging().index);
+        length = Math.min(getContainer().size(), ((Retrieve) getTransaction()).getPaging().length);
+      }
+
+      // only add jobs for those which are on this page
+      int ii = 0;
       for (EntityInterface entity : getContainer()) {
-        getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction()));
+        if (ii >= index && ii < length) {
+          getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction()));
+        } else {
+          entity.setEntityStatus(EntityStatus.IGNORE);
+        }
+        ii++;
       }
     }
   }
diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java
index f1abe03ef1fc1becd8b495c81c02a37c916bb12a..c4a458630456d057ccddf26c48def0e72ccf3789 100644
--- a/src/main/java/org/caosdb/server/query/Query.java
+++ b/src/main/java/org/caosdb/server/query/Query.java
@@ -876,8 +876,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
 
   /**
    * Filter out all entities which may not be retrieved by this user due to a missing RETRIEVE
-   * permission. This function is also designed for filtering of intermediate results
-   * TODO describe intermediate results.
+   * permission. This function is also designed for filtering of intermediate results.
    *
    * @param tabname
    * @throws SQLException
diff --git a/src/main/java/org/caosdb/server/transaction/Retrieve.java b/src/main/java/org/caosdb/server/transaction/Retrieve.java
index 86b7672cf9ebc0ad8e74f3974ee89174532d9f73..859a6ad68a1df35f79618f1f7413bb2112d8a0ac 100644
--- a/src/main/java/org/caosdb/server/transaction/Retrieve.java
+++ b/src/main/java/org/caosdb/server/transaction/Retrieve.java
@@ -121,4 +121,28 @@ public class Retrieve extends Transaction<RetrieveContainer> {
   public boolean logHistory() {
     return false;
   }
+
+  public static class Paging {
+    public Paging(int index, int length) {
+      this.index = index;
+      this.length = length;
+    }
+
+    public final int index;
+    public final int length;
+  }
+
+  private Retrieve.Paging paging = null;
+
+  public boolean hasPaging() {
+    return this.paging != null;
+  }
+
+  public void setPaging(int index, int length) {
+    this.paging = new Retrieve.Paging(index, length);
+  }
+
+  public Retrieve.Paging getPaging() {
+    return paging;
+  }
 }
diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java
index a9bac31c80fbd208b18cf60e66902112a0294b0a..5fc06f5ec82066d3515cbf524e64beb001ba0fcd 100644
--- a/src/main/java/org/caosdb/server/transaction/Transaction.java
+++ b/src/main/java/org/caosdb/server/transaction/Transaction.java
@@ -60,9 +60,6 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
 
   public static final String CLEAN_UP = "TransactionCleanUp";
   private final C container;
-  private int pagingIndex1;
-  private int pagingIndex2;
-  private boolean ThasPaging = false;
   private Access access = null;
   private final Schedule schedule = new Schedule();
 
@@ -85,24 +82,6 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
     return this.container;
   }
 
-  public boolean hasPaging() {
-    return ThasPaging;
-  }
-
-  public void setPagingIndices(int index1, int index2) {
-    ThasPaging = true;
-    pagingIndex1 = index1;
-    pagingIndex2 = index2;
-  }
-
-  public int getPagingIndex1() {
-    return pagingIndex1;
-  }
-
-  public int getPagingIndex2() {
-    return pagingIndex2;
-  }
-
   /**
    * Implementation note: Not called in this class, but may be used by subclasses.
    *
@@ -126,6 +105,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
     this.schedule.addAll(Job.loadPermanentContainerJobs(this));
 
     for (final EntityInterface e : getContainer()) {
+      if (e.skipJob()) continue;
       final List<Job> loadJobs = loadContainerFlags.loadJobs(e, this);
       this.schedule.addAll(loadJobs);
 
@@ -176,7 +156,6 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
     long t1 = System.currentTimeMillis();
     try {
       init();
-      this.schedule.runJobs(TransactionStage.PRE_INIT);
       this.schedule.runJobs(TransactionStage.INIT);
       getContainer()
           .getTransactionBenchmark()