diff --git a/src/main/java/org/caosdb/server/jobs/TransactionStage.java b/src/main/java/org/caosdb/server/jobs/TransactionStage.java
index 9e15b4e556269def79d58e532bbe3c9e6cbb9bbd..c265fc25b98aebb303c4f5b9907d3d59c2316347 100644
--- a/src/main/java/org/caosdb/server/jobs/TransactionStage.java
+++ b/src/main/java/org/caosdb/server/jobs/TransactionStage.java
@@ -50,6 +50,7 @@ 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 352a7428f2007fc59cbf0b3fb7f067d1198857c1..20a31e3f72429dd22bd9abe1a9eb121e6eb0bcd4 100644
--- a/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
+++ b/src/main/java/org/caosdb/server/jobs/core/ExecuteQuery.java
@@ -31,6 +31,8 @@ import org.caosdb.server.jobs.JobAnnotation;
 import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.query.Query;
 import org.caosdb.server.query.Query.ParsingException;
+import org.caosdb.server.transaction.Retrieve;
+import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
 
 @JobAnnotation(flag = "query", stage = TransactionStage.INIT)
@@ -53,8 +55,16 @@ 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 ii = 0;
       for (final EntityInterface entity : getContainer()) {
-        getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction()));
+        if (!(getTransaction() instanceof Retrieve) || (ii >= index1 && ii < index2)) {
+          getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction()));
+        } else {
+          entity.setEntityStatus(EntityStatus.IGNORE);
+        }
+        ii++;
       }
     }
   }
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 5f2a6ed62f48f20d09c34c8ee34190231903ffe7..ce499a5b766b58437bd248255f9394682d3608a1 100644
--- a/src/main/java/org/caosdb/server/jobs/core/Paging.java
+++ b/src/main/java/org/caosdb/server/jobs/core/Paging.java
@@ -24,14 +24,12 @@ 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_TRANSACTION)
+@JobAnnotation(flag = "P", stage = TransactionStage.PRE_INIT)
 public class Paging extends FlagJob {
 
   public static final int DEFAULT_LENGTH = 100;
@@ -53,6 +51,8 @@ public class Paging extends FlagJob {
             index2 = index1 + Integer.parseInt(m.group(2));
           }
         }
+        getTransaction().setPagingIndices(index1, index2);
+        /*
         int i = 0;
         for (final EntityInterface e : getContainer()) {
           if (i >= index2 || i < index1) {
@@ -61,6 +61,7 @@ public class Paging extends FlagJob {
           }
           i++;
         }
+        */
       }
     }
   }
diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java
index 88da39bce24f1cabf651eebf1532cab14bddb82c..cf71903e1182ed41bbc8bea1233981290cf87ff4 100644
--- a/src/main/java/org/caosdb/server/query/Query.java
+++ b/src/main/java/org/caosdb/server/query/Query.java
@@ -858,7 +858,8 @@ 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.
+   * permission. This function is also designed for filtering of intermediate results
+   * TODO describe intermediate results.
    *
    * @param tabname
    * @throws SQLException
diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java
index b4d63fbb293e0119cefe90db34b9cfb28f4e0ce1..2b616e995cca42c086a082d61474ebd5f3edeb1a 100644
--- a/src/main/java/org/caosdb/server/transaction/Transaction.java
+++ b/src/main/java/org/caosdb/server/transaction/Transaction.java
@@ -60,6 +60,8 @@ 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 Access access = null;
   private final Schedule schedule = new Schedule();
 
@@ -82,6 +84,19 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
     return this.container;
   }
 
+  public void setPagingIndices(int index1, int index2) {
+    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.
    *
@@ -155,6 +170,7 @@ 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()