diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java
index 828545ece1377d2f6b72adb632f1e860a394cfc7..7364db575789c7c2ab2e0fbbbb6c219b4841d56f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java
@@ -129,14 +129,7 @@ final class DefaultFullTextIndexer implements IFullTextIndexer
 
     private int getNextIndex(int index, int maxIndex)
     {
-        int result = index + batchSize;
-        if (result < maxIndex)
-        {
-            return result;
-        } else
-        {
-            return maxIndex;
-        }
+        return Math.min(index + batchSize, maxIndex);
     }
 
     private static final FullTextSession getFullTextSession(final Session hibernateSession)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java
index f7081b178816fe4da19049c392edf449ca97f8cf..97df9049ff7a94f893c63ef0b5fcb5b81693845d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java
@@ -39,8 +39,6 @@ import ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames;
 @Component(ch.systemsx.cisd.openbis.generic.shared.ResourceNames.GENERIC_DATA_SET_TYPE_SLAVE_SERVER_PLUGIN)
 public class GenericDataSetTypeSlaveServerPlugin implements IDataSetTypeSlaveServerPlugin
 {
-    private static final int BATCH_SIZE = 1000;
-
     @Resource(name = ResourceNames.GENERIC_BUSINESS_OBJECT_FACTORY)
     private IGenericBusinessObjectFactory businessObjectFactory;
 
@@ -62,7 +60,7 @@ public class GenericDataSetTypeSlaveServerPlugin implements IDataSetTypeSlaveSer
         assert newDataSets != null && newDataSets.size() > 0 : "Unspecified data set or empty data sets.";
 
         new BatchOperationExecutor<NewDataSet>().executeInBatches(new DataSetBatchUpdate(
-                businessObjectFactory.createExternalDataTable(session), newDataSets), BATCH_SIZE);
+                businessObjectFactory.createExternalDataTable(session), newDataSets));
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java
index b259533ed43d9f5a8b9414d3c3f86347be869c8d..ccd7eb52b9df7adb14f76e7bdd27e9f981584a9f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java
@@ -46,9 +46,6 @@ import ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames;
 @Component(ch.systemsx.cisd.openbis.generic.shared.ResourceNames.GENERIC_SAMPLE_TYPE_SLAVE_SERVER_PLUGIN)
 public final class GenericSampleTypeSlaveServerPlugin implements ISampleTypeSlaveServerPlugin
 {
-
-    private static final int BATCH_SIZE = 10000;
-
     @Resource(name = ResourceNames.GENERIC_BUSINESS_OBJECT_FACTORY)
     private IGenericBusinessObjectFactory businessObjectFactory;
 
@@ -83,7 +80,7 @@ public final class GenericSampleTypeSlaveServerPlugin implements ISampleTypeSlav
         assert newSamples != null && newSamples.size() > 0 : "Unspecified sample or empty samples.";
 
         new BatchOperationExecutor<NewSample>().executeInBatches(new SampleBatchRegistration(
-                businessObjectFactory.createSampleTable(session), newSamples), BATCH_SIZE);
+                businessObjectFactory.createSampleTable(session), newSamples));
     }
 
     public void updateSamples(Session session, List<SampleBatchUpdatesDTO> updateSamples)
@@ -92,6 +89,6 @@ public final class GenericSampleTypeSlaveServerPlugin implements ISampleTypeSlav
         assert updateSamples != null && updateSamples.size() > 0 : "Unspecified sample or empty samples.";
 
         new BatchOperationExecutor<SampleBatchUpdatesDTO>().executeInBatches(new SampleBatchUpdate(
-                businessObjectFactory.createSampleTable(session), updateSamples), BATCH_SIZE);
+                businessObjectFactory.createSampleTable(session), updateSamples));
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index 22fead76f041f23edf767a245a265ced3a868e31..c20671abbbf0e67ffd1dc22b032c4772fdfa535e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -274,10 +274,10 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
                 registerSamples(session, samples);
             } else
             {
-                new BatchOperationExecutor<NewSample>().executeInBatches(
-                        new SampleBatchRegisterOrUpdate(businessObjectFactory
+                new BatchOperationExecutor<NewSample>()
+                        .executeInBatches(new SampleBatchRegisterOrUpdate(businessObjectFactory
                                 .createSampleLister(session), samples.getNewSamples(), samples
-                                .getSampleType(), session), 1000);
+                                .getSampleType(), session));
             }
         }
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java
index 06353d2a647d3861f50e3771045e2ad14195d471..dee516faddee20382b59f5944ab041cbad0de8fa 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java
@@ -1,6 +1,5 @@
 package ch.systemsx.cisd.openbis.plugin.generic.server.batch;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.log4j.Logger;
@@ -9,7 +8,7 @@ import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 
 /**
- * Executes provided operation in batches of chosen size.
+ * Executes provided operation in batches of chosen size (by default 1000).
  * 
  * @author Izabela Adamczyk
  */
@@ -18,27 +17,28 @@ public class BatchOperationExecutor<S>
     private static final Logger operationLog =
             LogFactory.getLogger(LogCategory.OPERATION, BatchOperationExecutor.class);
 
+    private static final int DEFAULT_BATCH_SIZE = 1000;
+
+    public void executeInBatches(IBatchOperation<S> strategy)
+    {
+        executeInBatches(strategy, DEFAULT_BATCH_SIZE);
+    }
+
     public void executeInBatches(IBatchOperation<S> strategy, int batchSize)
     {
         assert strategy != null : "Unspecified operation.";
 
-        List<S> batch = new ArrayList<S>();
-        int counter = 0;
-        for (S entity : strategy.getAllEntities())
-        {
-            batch.add(entity);
-            if (batch.size() >= batchSize)
-            {
-                strategy.execute(batch);
-                counter += batch.size();
-                operationLog.info(String.format("%s %s progress: %d/%d", strategy.getEntityName(),
-                        strategy.getOperationName(), counter, strategy.getAllEntities().size()));
-                batch.clear();
-            }
-        }
-        if (batch.size() > 0)
+        final List<S> allEntities = strategy.getAllEntities();
+        int startIndex = 0;
+        int maxIndex = allEntities.size();
+        while (startIndex < maxIndex)
         {
+            final int endIndex = Math.min(startIndex + batchSize, maxIndex);
+            final List<S> batch = allEntities.subList(startIndex, endIndex);
             strategy.execute(batch);
+            operationLog.info(String.format("%s %s progress: %d/%d", strategy.getEntityName(),
+                    strategy.getOperationName(), endIndex, maxIndex));
+            startIndex += batchSize;
         }
     }
 }
\ No newline at end of file