diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
index cf40b58fe6f78d4b22fcbd12d14255f2fee3cfeb..75f8421722671e636aad7ec10a30a8cb2ca1ac91 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
@@ -93,6 +93,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WindowUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Constants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridCustomColumnInfo;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridFilters;
@@ -177,7 +178,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
 
     // ------ private section. NOTE: it should remain unaccessible to subclasses! ---------------
 
-    private static final int PAGE_SIZE = 50;
+    private static final int PAGE_SIZE = Constants.GRID_PAGE_SIZE;
 
     // set to true to see some useful debugging messages
     private static final boolean DEBUG = false;
@@ -713,6 +714,8 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         private final DefaultResultSetConfig<String, T> resultSetConfig;
 
         private int logID;
+        
+        private boolean reloadingPhase;
 
         public ListEntitiesCallback(final IViewContext<?> viewContext,
                 final AsyncCallback<PagingLoadResult<M>> delegate,
@@ -746,8 +749,19 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
             logID = log("process loaded data");
             // save the key of the result, later we can refer to the result in the cache using this
             // key
-            saveCacheKey(result.getResultSetKey());
+            String key = result.getResultSetKey();
+            saveCacheKey(key);
             GridRowModels<T> rowModels = result.getList();
+            boolean partial = result.isPartial();
+            if (reloadingPhase)
+            {
+                reloadingPhase = false;
+            } else if (partial)
+            {
+                reloadingPhase = true;
+                resultSetConfig.setCacheConfig(ResultSetFetchConfig.createFetchFromCacheAndRecompute(key));
+                listEntities(resultSetConfig, this);
+            }
             List<GridCustomColumnInfo> customColumnMetadata = rowModels.getCustomColumnsMetadata();
             customColumnsMetadataProvider.setCustomColumnsMetadata(customColumnMetadata);
             // convert the result to the model data for the grid control
@@ -760,7 +774,14 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
             pagingToolbar.enableExportButton();
             pagingToolbar.updateDefaultConfigButton(true);
 
-            filterToolbar.refreshColumnFiltersDistinctValues(rowModels.getColumnDistinctValues());
+            if (reloadingPhase == false)
+            {
+                pagingToolbar.enable();
+                filterToolbar.refreshColumnFiltersDistinctValues(rowModels.getColumnDistinctValues());
+            } else
+            {
+                pagingToolbar.disableForLoadingRest();
+            }
             onComplete(true);
 
             viewContext.logStop(logID);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/BrowserGridPagingToolBar.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/BrowserGridPagingToolBar.java
index 527c56dc6f812d0f4c79e3d53669b266c1fab9ab..71eb74328a3d619cc3440778c3eeb5600e6ac15e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/BrowserGridPagingToolBar.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/BrowserGridPagingToolBar.java
@@ -178,6 +178,12 @@ public final class BrowserGridPagingToolBar extends PagingToolBar
     {
         return refreshButton.isEnabled();
     }
+    
+    public void disableForLoadingRest()
+    {
+        displayText.setLabel("Loading the rest of the data");
+        disable();
+    }
 
     protected final void updateDefaultRefreshButton(boolean isEnabled)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/Constants.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/Constants.java
new file mode 100644
index 0000000000000000000000000000000000000000..8bd4defa63389dffe5d8c41a85400ee5cf14c49d
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/Constants.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.dto;
+
+/**
+ * Constants used by client and server of the web presentation layer.
+ *
+ * @author Franz-Josef Elmer
+ */
+public class Constants
+{
+    /** Maximum number of rows shown on a page of a grid. */
+    public static final int GRID_PAGE_SIZE = 50;
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ResultSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ResultSet.java
index 34568438b7452415d412c84fb8ae8ae94eb7f763..5cc03fa2fd57fed28c14b05349a21a84def88ef9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ResultSet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ResultSet.java
@@ -36,6 +36,8 @@ public final class ResultSet<T> implements IsSerializable, IResultSetHolder<T>
     private int totalLength;
 
     private String resultSetKey;
+    
+    private boolean partial;
 
     public final void setList(final GridRowModels<T> result)
     {
@@ -92,4 +94,14 @@ public final class ResultSet<T> implements IsSerializable, IResultSetHolder<T>
         return list.toString();
     }
 
+    public void setPartial(boolean partial)
+    {
+        this.partial = partial;
+    }
+
+    public boolean isPartial()
+    {
+        return partial;
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java
index b92a6287aa43821a70496f27db3413dc94c2b876..1b8f8a718ca8be4131897303dbeedbb8b2f60f65 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractClientService.java
@@ -384,12 +384,6 @@ public abstract class AbstractClientService implements IClientService,
                     {
                         public List<TableModelRowWithObject<Null>> getOriginalData(int maxSize)
                                 throws UserFailureException
-                        {
-                            return getOriginalData();
-                        }
-
-                        public List<TableModelRowWithObject<Null>> getOriginalData()
-                                throws UserFailureException
                         {
                             return TableModelUtils.asTableModelRowsWithNullObject(tableModel
                                     .getRows());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractOriginalDataProviderWithoutHeaders.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractOriginalDataProviderWithoutHeaders.java
index 87c783e0b53a0c0ef7c0dae02518847a83d655fc..7266595de6576f4fc3eb889b62189280ccc49b27 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractOriginalDataProviderWithoutHeaders.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/AbstractOriginalDataProviderWithoutHeaders.java
@@ -58,7 +58,7 @@ public abstract class AbstractOriginalDataProviderWithoutHeaders<T> implements
         return list;
     }
 
-    public List<T> getOriginalData() throws UserFailureException
+    private List<T> getOriginalData() throws UserFailureException
     {
         if (originalData != null)
         {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 06584730c28ebf292765f4a93c03e27cc3ca55c5..d17cb6dc8e025b2ea0b2a4bcd3ca979900c120d7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -2154,12 +2154,6 @@ public final class CommonClientService extends AbstractClientService implements
         IOriginalDataProvider<TableModelRowWithObject<Null>> dataProvider =
                 new IOriginalDataProvider<TableModelRowWithObject<Null>>()
                     {
-                        public List<TableModelRowWithObject<Null>> getOriginalData()
-                                throws UserFailureException
-                        {
-                            throw new IllegalStateException("Data not found in the cache");
-                        }
-
                         public List<TableModelColumnHeader> getHeaders()
                         {
                             return null;
@@ -2168,7 +2162,7 @@ public final class CommonClientService extends AbstractClientService implements
                         public List<TableModelRowWithObject<Null>> getOriginalData(int maxSize)
                                 throws UserFailureException
                         {
-                            return getOriginalData();
+                            throw new IllegalStateException("Data not found in the cache");
                         }
 
                     };
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListMatchingEntitiesOriginalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListMatchingEntitiesOriginalDataProvider.java
deleted file mode 100644
index bfbc16782f1b9202e387cfba1a67363d3dd11e5d..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListMatchingEntitiesOriginalDataProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package ch.systemsx.cisd.openbis.generic.client.web.server;
-
-import java.util.List;
-
-import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider;
-import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
-import ch.systemsx.cisd.openbis.generic.shared.dto.SearchableEntity;
-
-/**
- * A {@link IOriginalDataProvider} implementation for listing matching entities.
- * 
- * @author Christian Ribeaud
- */
-final class ListMatchingEntitiesOriginalDataProvider extends
-        AbstractOriginalDataProvider<MatchingEntity>
-{
-
-    private final SearchableEntity[] matchingEntities;
-
-    private final String queryText;
-
-    private final boolean useWildcardSearchMode;
-
-    ListMatchingEntitiesOriginalDataProvider(ICommonServer commonServer, String sessionToken,
-            SearchableEntity[] matchingEntities, String queryText,
-            final boolean useWildcardSearchMode)
-    {
-        super(commonServer, sessionToken);
-        this.matchingEntities = matchingEntities;
-        this.queryText = queryText;
-        this.useWildcardSearchMode = useWildcardSearchMode;
-    }
-
-    //
-    // AbstractOriginalDataProvider
-    //
-
-    @Override
-    public final List<MatchingEntity> getFullOriginalData()
-    {
-        final List<MatchingEntity> entities =
-                commonServer.listMatchingEntities(sessionToken, matchingEntities, queryText,
-                        useWildcardSearchMode);
-        return entities;
-    }
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractTableModelProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractTableModelProvider.java
index 89648b5ec26c4ab3c3fa4caa325aa9b89ee60f23..b6007c3616b2b65438abdedef7f0d1ff0cca95a8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractTableModelProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractTableModelProvider.java
@@ -33,20 +33,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
 public abstract class AbstractTableModelProvider<T extends ISerializable> implements
         ITableModelProvider<T>
 {
-    private TypedTableModel<T> model;
-
-    public final TypedTableModel<T> getTableModel()
-    {
-        if (model == null)
-        {
-            model = createTableModel();
-        }
-        return model;
-    }
-
     public TypedTableModel<T> getTableModel(int maxSize)
     {
-        TypedTableModel<T> tableModel = getTableModel();
+        TypedTableModel<T> tableModel = createTableModel(maxSize);
         List<TableModelColumnHeader> headers = tableModel.getHeader();
         List<TableModelRowWithObject<T>> rows = tableModel.getRows();
         List<TableModelRowWithObject<T>> limitedRows = new ArrayList<TableModelRowWithObject<T>>();
@@ -62,9 +51,9 @@ public abstract class AbstractTableModelProvider<T extends ISerializable> implem
     }
 
     /**
-     * Creates the table model. The returned instance is always returned by {@link #getTableModel()}
-     * .
+     * Creates the table model with the specified maximum number of rows. If
+     * {@link Integer#MAX_VALUE} is specified the complete table will be created.
      */
-    protected abstract TypedTableModel<T> createTableModel();
+    protected abstract TypedTableModel<T> createTableModel(int maxSize);
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java
index 13062d60e6b509cf6a70bb5e9abeda245bfefdf2..8d3a5a790815ea27eed9bc98bc0c89f785b37128 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java
@@ -28,10 +28,18 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 import org.apache.log4j.Logger;
 
 import ch.rinn.restrictions.Private;
+import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
+import ch.systemsx.cisd.base.namedthread.NamingThreadPoolExecutor;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.shared.basic.AlternativesStringFilter;
@@ -424,7 +432,9 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
     private final ICustomColumnsProvider customColumnsProvider;
 
     // all cache access should be doen in a monitor (synchronized clause)
-    private final Map<K, TableData<?>> cache = new HashMap<K, TableData<?>>();
+    private final Map<K, Future<?>> cache = new HashMap<K, Future<?>>();
+
+    private final ThreadPoolExecutor executor = new NamingThreadPoolExecutor("Background Table Loader").corePoolSize(10).daemonize();
 
     private final XMLPropertyTransformer xmlPropertyTransformer = new XMLPropertyTransformer();
 
@@ -667,52 +677,135 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         TableData<T> tableData = tryGetCachedTableData(dataKey);
         if (tableData != null)
         {
-            return calculateSortAndFilterResult(sessionToken, tableData, resultConfig, dataKey);
+            return calculateSortAndFilterResult(sessionToken, tableData, resultConfig, dataKey, false);
         } else
         {
             return fetchAndCacheResult(sessionToken, resultConfig, dataProvider);
         }
     }
-
+    
     private <T> IResultSet<K, T> fetchAndCacheResult(final String sessionToken,
             final IResultSetConfig<K, T> resultConfig, final IOriginalDataProvider<T> dataProvider)
     {
-        K dataKey = resultSetKeyProvider.createKey();
-        debug("retrieving the data with a new key " + dataKey);
-        List<T> rows = dataProvider.getOriginalData();
-        List<TableModelColumnHeader> headers = dataProvider.getHeaders();
-        TableData<T> tableData =
-                new TableData<T>(rows, headers, customColumnsProvider, columnCalculator);
+        final K dataKey = resultSetKeyProvider.createKey();
+        int limit = resultConfig.getLimit();
+        if (limit == IResultSetConfig.NO_LIMIT)
+        {
+            limit = Integer.MAX_VALUE;
+        }
+        debug("Retrieving " + limit + " record for a new key " + dataKey);
+        List<T> rows = dataProvider.getOriginalData(limit);
+        final List<TableModelColumnHeader> headers = dataProvider.getHeaders();
+        final TableData<T> tableData =
+            new TableData<T>(rows, headers, customColumnsProvider, columnCalculator);
         xmlPropertyTransformer.transformXMLProperties(rows);
+        
+        Future<TableData<T>> future;
+        boolean partial = rows.size() >= limit;
+        if (partial)
+        {
+            debug("Only partially loaded data for key "+dataKey);
+            future = loadCompleteTableInBackground(dataProvider, dataKey);
+        } else
+        {
+            debug("Completely loaded for key "+dataKey);
+            future = createFutureWhichIsPresent(dataKey, tableData);
+        }
+        addToCache(dataKey, future);
+        return calculateSortAndFilterResult(sessionToken, tableData, resultConfig, dataKey, partial);
+    }
 
-        addToCache(dataKey, tableData);
-        return calculateSortAndFilterResult(sessionToken, tableData, resultConfig, dataKey);
+    private <T> Future<TableData<T>> createFutureWhichIsPresent(final K dataKey,
+            final TableData<T> tableData)
+    {
+        return new Future<TableData<T>>()
+            {
+                public boolean cancel(boolean mayInterruptIfRunning)
+                {
+                    return true;
+                }
+
+                public boolean isCancelled()
+                {
+                    return false;
+                }
+
+                public boolean isDone()
+                {
+                    return true;
+                }
+
+                public TableData<T> get() throws InterruptedException, ExecutionException
+                {
+                    return tableData;
+                }
+
+                public TableData<T> get(long timeout, TimeUnit unit)
+                        throws InterruptedException, ExecutionException, TimeoutException
+                {
+                    return get();
+                }
+            };
     }
 
-    private synchronized <T> void addToCache(K dataKey, TableData<T> tableData)
+    private <T> Future<TableData<T>> loadCompleteTableInBackground(
+            final IOriginalDataProvider<T> dataProvider, final K dataKey)
+    {
+        Future<TableData<T>> future;
+        Callable<TableData<T>> callable = new Callable<TableData<T>>()
+            {
+                public TableData<T> call() throws Exception
+                {
+                    List<T> rows = dataProvider.getOriginalData(Integer.MAX_VALUE);
+                    List<TableModelColumnHeader> headers = dataProvider.getHeaders();
+                    debug(rows.size() + " records loaded for key "+dataKey);
+                    TableData<T> tableData =
+                        new TableData<T>(rows, headers, customColumnsProvider,
+                                columnCalculator);
+                    xmlPropertyTransformer.transformXMLProperties(rows);
+                    return tableData;
+                }
+            };
+            future = executor.submit(callable);
+        return future;
+    }
+    
+
+    private synchronized <T> void addToCache(K dataKey, Future<TableData<T>> tableData)
     {
         cache.put(dataKey, tableData);
+        debug(cache.size() + " keys in cache: " + cache.keySet());
     }
 
     private static <K, T> IResultSet<K, T> calculateSortAndFilterResult(String sessionToken,
-            TableData<T> tableData, final IResultSetConfig<K, T> resultConfig, K dataKey)
+            TableData<T> tableData, final IResultSetConfig<K, T> resultConfig, K dataKey, boolean partial)
     {
         GridRowModels<T> data = tableData.getRows(sessionToken, resultConfig);
-        return filterLimitAndSort(resultConfig, data, dataKey);
+        return filterLimitAndSort(resultConfig, data, dataKey, partial);
     }
 
     private synchronized <T> TableData<T> tryGetCachedTableData(K dataKey)
     {
-        TableData<T> tableData = cast(cache.get(dataKey));
+        Future<TableData<T>> tableData = cast(cache.get(dataKey));
         if (tableData == null)
         {
             operationLog.error("Reference to the stale cache key " + dataKey);
+            return null;
+        }
+        try
+        {
+            return tableData.get();
+        } catch (InterruptedException ex)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+        } catch (ExecutionException ex)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(ex.getCause());
         }
-        return tableData;
     }
 
     private static <K, T> IResultSet<K, T> filterLimitAndSort(
-            final IResultSetConfig<K, T> resultConfig, GridRowModels<T> data, K dataKey)
+            final IResultSetConfig<K, T> resultConfig, GridRowModels<T> data, K dataKey, boolean partial)
     {
         GridRowModels<T> filteredData =
                 filterData(data, resultConfig.getAvailableColumns(), resultConfig.getFilters());
@@ -722,12 +815,13 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         final SortInfo<T> sortInfo = resultConfig.getSortInfo();
         sortData(filteredData, sortInfo);
         final GridRowModels<T> list = subList(filteredData, offset, limit);
-        return new DefaultResultSet<K, T>(dataKey, list, size);
+        return new DefaultResultSet<K, T>(dataKey, list, size, partial);
     }
 
     public final synchronized void removeResultSet(final K resultSetKey)
     {
         assert resultSetKey != null : "Unspecified data key holder.";
+        debug("remove key " + resultSetKey);
         if (cache.remove(resultSetKey) != null)
         {
             debug(String.format("Result set for key '%s' has been removed.", resultSetKey));
@@ -740,6 +834,6 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
 
     private void debug(String msg)
     {
-        operationLog.debug(msg);
+        operationLog.info(msg);
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DataProviderAdapter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DataProviderAdapter.java
index a9179b00c74dd915815ebfaa1c0e504e11f1c13b..ba2cf943ec827ab5efe34d4eb021efdcb5bed1bb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DataProviderAdapter.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DataProviderAdapter.java
@@ -16,35 +16,43 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.server.resultset;
 
+import java.util.Collections;
 import java.util.List;
 
-import ch.systemsx.cisd.openbis.generic.client.web.server.AbstractOriginalDataProviderWithoutHeaders;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
 
 /**
+ * Adapter which turns a {@link ITableModelProvider} into a {@link IOriginalDataProvider}.
+ *  
  * @author Franz-Josef Elmer
  */
-public final class DataProviderAdapter<T extends ISerializable> extends
-    AbstractOriginalDataProviderWithoutHeaders<TableModelRowWithObject<T>>
+public final class DataProviderAdapter<T extends ISerializable> implements
+        IOriginalDataProvider<TableModelRowWithObject<T>>
 {
     private final ITableModelProvider<T> provider;
+    
+    private TypedTableModel<T> tableModel;
 
     public DataProviderAdapter(ITableModelProvider<T> provider)
     {
         this.provider = provider;
     }
 
-    @Override
-    public List<TableModelRowWithObject<T>> getFullOriginalData()
+    public List<TableModelRowWithObject<T>> getOriginalData(int maxSize)
+            throws UserFailureException
     {
-        return provider.getTableModel().getRows();
+        tableModel = provider.getTableModel(maxSize);
+        return tableModel.getRows();
     }
 
-    @Override
     public List<TableModelColumnHeader> getHeaders()
     {
-        return provider.getTableModel().getHeader();
+        return tableModel == null ? Collections.<TableModelColumnHeader> emptyList() : tableModel
+                .getHeader();
     }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java
index b5b0a200badf553d4092ab8fe874b0d8210cdd57..f4333a9d498d5731e0e6dcd5c32bc7f00338bdf4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java
@@ -31,8 +31,11 @@ public final class DefaultResultSet<K, T> implements IResultSet<K, T>
 
     private final int totalLength;
 
-    public DefaultResultSet(final K resultSetKey, final GridRowModels<T> list, final int totalLength)
+    private final boolean partial;
+
+    public DefaultResultSet(final K resultSetKey, final GridRowModels<T> list, final int totalLength, boolean partial)
     {
+        this.partial = partial;
         assert resultSetKey != null : "Unspecified result set key";
         assert list != null : "Unspecified list.";
         assert totalLength > -1 : "Total length must be >= 0.";
@@ -60,4 +63,9 @@ public final class DefaultResultSet<K, T> implements IResultSet<K, T>
         return totalLength;
     }
 
+    public boolean isPartial()
+    {
+        return partial;
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/FileFormatTypesProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/FileFormatTypesProvider.java
index ea88ba19f6ef16cc862194dd4072521fb458681c..6afc08d1d0ac9b4d5a50ee0849019aabf0022479 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/FileFormatTypesProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/FileFormatTypesProvider.java
@@ -38,7 +38,7 @@ public class FileFormatTypesProvider extends AbstractCommonTableModelProvider<Fi
     }
 
     @Override
-    protected TypedTableModel<FileFormatType> createTableModel()
+    protected TypedTableModel<FileFormatType> createTableModel(int maxSize)
     {
         List<FileFormatType> fileFormats = commonServer.listFileFormatTypes(sessionToken);
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IOriginalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IOriginalDataProvider.java
index af43dc83f9f834cb6df1cbb2781d6eccba767a4d..c12bbcd1eea69fead9cce391dc62cee64717fe5c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IOriginalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IOriginalDataProvider.java
@@ -30,15 +30,11 @@ public interface IOriginalDataProvider<T>
 {
 
     /**
-     * Gets the original data limited to not more than specified number of items.
+     * Gets the original data limited by specified number of items. All data is returned if the
+     * argument is {@link Integer#MAX_VALUE}.
      */
     public List<T> getOriginalData(int maxSize) throws UserFailureException;
     
-    /**
-     * Returns the original data.
-     */
-    public List<T> getOriginalData() throws UserFailureException;
-    
     /**
      * Returns headers if known, otherwise an empty list is returned.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IResultSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IResultSet.java
index e6d8355718efa218a5e42cbe7c5d547bcd6fe5a2..006521a6b4be7783268cec320859b2dbf70c1629 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IResultSet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IResultSet.java
@@ -46,4 +46,10 @@ public interface IResultSet<K, T>
      */
     public int getTotalLength();
 
+    /**
+     * Returns <code>true</code> if this result set is not complete. Note, that
+     * {@link #getTotalLength()} is meaningless if this is the case.
+     */
+    public boolean isPartial();
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ITableModelProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ITableModelProvider.java
index 6121aed388008ba2719f8d4aa9a3a37be51a24a8..8ebb043e825605d644179557517b2651ee50fd97 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ITableModelProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ITableModelProvider.java
@@ -27,12 +27,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
 public interface ITableModelProvider<T extends ISerializable>
 {
     /**
-     * Returns the full table model.
-     */
-    public TypedTableModel<T> getTableModel();
-    
-    /**
-     * Returns the table model limited as specified.
+     * Returns the table model limited as specified. For {@link Integer#MAX_VALUE} the full table
+     * model is returned.
      */
     public TypedTableModel<T> getTableModel(int maxSize);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java
index 55432068f1c8887cdfcc63b6a7416911934a38a4..d0d2962a4a6b5b1b702a6aaeef18c6dc6421ab9f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java
@@ -52,7 +52,7 @@ public class MatchingEntitiesProvider extends AbstractCommonTableModelProvider<M
     }
 
     @Override
-    protected TypedTableModel<MatchingEntity> createTableModel()
+    protected TypedTableModel<MatchingEntity> createTableModel(int maxSize)
     {
         List<MatchingEntity> entities =
             commonServer.listMatchingEntities(sessionToken, matchingEntities, queryText,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ProjectsProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ProjectsProvider.java
index 5b0fc2204bbc1f7632f81b87f983d1c75f5723ed..7380246d8932f3753128c1d0fc6dd96449114519 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ProjectsProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ProjectsProvider.java
@@ -43,7 +43,7 @@ public class ProjectsProvider extends AbstractCommonTableModelProvider<Project>
     }
 
     @Override
-    protected TypedTableModel<Project> createTableModel()
+    protected TypedTableModel<Project> createTableModel(int maxSize)
     {
         List<Project> projects = commonServer.listProjects(sessionToken);
         TypedTableModelBuilder<Project> builder = new TypedTableModelBuilder<Project>();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProvider.java
index 2e369ce0db4655afb865a23a58d1b39a81181a85..767c6ae91b1c26ca907b668346863956b5f7c9c0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProvider.java
@@ -67,7 +67,7 @@ public class SampleProvider extends AbstractCommonTableModelProvider<Sample>
     }
 
     @Override
-    protected TypedTableModel<Sample> createTableModel()
+    protected TypedTableModel<Sample> createTableModel(int maxSize)
     {
         List<Sample> samples = getSamples();
         TypedTableModelBuilder<Sample> builder = new TypedTableModelBuilder<Sample>();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SpacesProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SpacesProvider.java
index ab687ebda08ffb4d719028b0eb676101c5e0f840..25887e588ebfbc34d240936697c7067e7d04f27e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SpacesProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SpacesProvider.java
@@ -42,7 +42,7 @@ public class SpacesProvider extends AbstractCommonTableModelProvider<Space>
     }
 
     @Override
-    protected TypedTableModel<Space> createTableModel()
+    protected TypedTableModel<Space> createTableModel(int maxSize)
     {
         DatabaseInstanceIdentifier identifier = new DatabaseInstanceIdentifier(null);
         List<Space> spaces = commonServer.listSpaces(sessionToken, identifier);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabulariesProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabulariesProvider.java
index fc2e14b7d54891e111a9eec76477daf5aaf7fef5..c80b497333329b49827f53ba5ef376970915de6d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabulariesProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabulariesProvider.java
@@ -51,7 +51,7 @@ public class VocabulariesProvider extends AbstractCommonTableModelProvider<Vocab
     }
 
     @Override
-    protected TypedTableModel<Vocabulary> createTableModel()
+    protected TypedTableModel<Vocabulary> createTableModel(int maxSize)
     {
         List<Vocabulary> vocabularies =
                 commonServer.listVocabularies(sessionToken, withTerms, excludeInternal);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabularyTermsProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabularyTermsProvider.java
index fac647a6ce7d0ccb0584755ece42f81d423e55c0..a3d9672e8181ee632e9559282b77df68068cb0e8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabularyTermsProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabularyTermsProvider.java
@@ -57,7 +57,7 @@ public class VocabularyTermsProvider extends AbstractCommonTableModelProvider<Vo
     }
 
     @Override
-    protected TypedTableModel<VocabularyTermWithStats> createTableModel()
+    protected TypedTableModel<VocabularyTermWithStats> createTableModel(int maxSize)
     {
         TypedTableModelBuilder<VocabularyTermWithStats> builder =
                 new TypedTableModelBuilder<VocabularyTermWithStats>();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/translator/ResultSetTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/translator/ResultSetTranslator.java
index 2c79db268303ca321f7bed7fc2437d055b4cf763..44ee7fce9f35877ad8b300e5f22f1698e4176d31 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/translator/ResultSetTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/translator/ResultSetTranslator.java
@@ -48,6 +48,7 @@ public final class ResultSetTranslator
         resultSet.setList(resultSetList);
         resultSet.setTotalLength(result.getTotalLength());
         resultSet.setResultSetKey(result.getResultSetKey());
+        resultSet.setPartial(result.isPartial());
         return resultSet;
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
index 6307181b984b248eaf0b126f0732875e399506b4..928f789f24d0468c50a5eddc167c484bba6a5929 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
@@ -299,7 +299,7 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest
         final String resultSetKey = "131";
         GridRowModels<T> rowModels = createGridRowModels(entities);
         final DefaultResultSet<String, T> defaultResultSet =
-                new DefaultResultSet<String, T>(resultSetKey, rowModels, entities.size());
+                new DefaultResultSet<String, T>(resultSetKey, rowModels, entities.size(), false);
         context.checking(new Expectations()
             {
                 {
@@ -326,7 +326,7 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest
         GridRowModels<TableModelRowWithObject<T>> rowModels = createGridRowModels(rows);
         final DefaultResultSet<String, TableModelRowWithObject<T>> resultSet =
                 new DefaultResultSet<String, TableModelRowWithObject<T>>(resultSetKey, rowModels,
-                        entities.size());
+                        entities.size(), false);
         context.checking(new Expectations()
             {
                 {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java
index 0a91d55d7cb6f0065c789384aafc99523b02f38c..3b80f75d2c93624caf463674d0f1679b97be68ba 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java
@@ -331,14 +331,31 @@ public final class CachedResultSetManagerTest extends AssertJUnit
     }
 
     @Test
-    public void testOffsetAndLimit()
+    public void testOffset()
     {
         prepareDataAndCustomColumnDefinitions(20);
         ResultSetConfigBuilder builder =
                 new ResultSetConfigBuilder(COL_DEFS).displayID(GRID_DISPLAY_ID);
 
-        getAndCheckRows(10, 0, builder.offset(-1).limit(10));
+        builder.fetchFromCache(KEY);
+        getAndCheckRows(18, 2, builder.offset(2).limit(-1));
+        getAndCheckRows(1, 19, builder.offset(19).limit(-1));
+        getAndCheckRows(1, 19, builder.offset(20).limit(-1));
+        getAndCheckRows(1, 19, builder.offset(21).limit(-1));
+        getAndCheckRows(20, 0, builder.offset(-1).limit(-1));
 
+        context.assertIsSatisfied();
+    }
+    
+    @Test
+    public void testOffsetAndLimit()
+    {
+        prepareDataAndCustomColumnDefinitions(20, 10);
+        ResultSetConfigBuilder builder =
+            new ResultSetConfigBuilder(COL_DEFS).displayID(GRID_DISPLAY_ID);
+        
+        getAndCheckRows(10, 0, builder.offset(-1).limit(10));
+        
         builder.fetchFromCache(KEY);
         getAndCheckRows(10, 9, builder.offset(9).limit(10));
         getAndCheckRows(10, 10, builder.offset(10).limit(10));
@@ -346,12 +363,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
         getAndCheckRows(1, 19, builder.offset(19).limit(10));
         getAndCheckRows(1, 19, builder.offset(20).limit(10));
         getAndCheckRows(1, 19, builder.offset(21).limit(10));
-        getAndCheckRows(18, 2, builder.offset(2).limit(-1));
-        getAndCheckRows(1, 19, builder.offset(19).limit(-1));
-        getAndCheckRows(1, 19, builder.offset(20).limit(-1));
-        getAndCheckRows(1, 19, builder.offset(21).limit(-1));
-        getAndCheckRows(20, 0, builder.offset(-1).limit(-1));
-
+        
         context.assertIsSatisfied();
     }
 
@@ -411,7 +423,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
                     one(keyGenerator).createKey();
                     will(returnValue(KEY));
 
-                    one(originalDataProvider).getOriginalData();
+                    one(originalDataProvider).getOriginalData(Integer.MAX_VALUE);
                     will(returnValue(Arrays.asList()));
 
                     one(originalDataProvider).getHeaders();
@@ -738,7 +750,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
                     one(keyGenerator).createKey();
                     will(returnValue(KEY));
 
-                    one(originalDataProvider).getOriginalData();
+                    one(originalDataProvider).getOriginalData(Integer.MAX_VALUE);
                     will(returnValue(createDataList()));
 
                     one(originalDataProvider).getHeaders();
@@ -808,7 +820,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
                     one(keyGenerator).createKey();
                     will(returnValue(KEY));
 
-                    one(originalDataProvider).getOriginalData();
+                    one(originalDataProvider).getOriginalData(Integer.MAX_VALUE);
                     will(returnValue(data));
 
                     one(originalDataProvider).getHeaders();
@@ -854,7 +866,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
                     one(keyGenerator).createKey();
                     will(returnValue(KEY));
 
-                    one(originalDataProvider).getOriginalData();
+                    one(originalDataProvider).getOriginalData(Integer.MAX_VALUE);
                     will(returnValue(createDataList()));
 
                     one(originalDataProvider).getHeaders();
@@ -879,7 +891,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
                     one(keyGenerator).createKey();
                     will(returnValue(KEY));
 
-                    one(originalDataProvider).getOriginalData();
+                    one(originalDataProvider).getOriginalData(Integer.MAX_VALUE);
                     will(returnValue(createDataList("a", "b")));
 
                     one(originalDataProvider).getHeaders();
@@ -927,6 +939,12 @@ public final class CachedResultSetManagerTest extends AssertJUnit
 
     private void prepareDataAndCustomColumnDefinitions(final int size,
             final GridCustomColumn... columns)
+    {
+        prepareDataAndCustomColumnDefinitions(size, Integer.MAX_VALUE, columns);
+    }
+    
+    private void prepareDataAndCustomColumnDefinitions(final int size, final int maxSize,
+            final GridCustomColumn... columns)
     {
         context.checking(new Expectations()
             {
@@ -934,16 +952,24 @@ public final class CachedResultSetManagerTest extends AssertJUnit
                     one(keyGenerator).createKey();
                     will(returnValue(KEY));
 
-                    one(originalDataProvider).getOriginalData();
+                    one(originalDataProvider).getOriginalData(maxSize);
                     DataHolder[] rows = new DataHolder[size];
                     for (int i = 0; i < rows.length; i++)
                     {
                         rows[i] = new DataHolder(i + "-a" + i % 2);
                     }
                     will(returnValue(Arrays.asList(rows)));
-
+                    
                     one(originalDataProvider).getHeaders();
                     will(returnValue(Arrays.asList()));
+                    
+                    if (size >= maxSize)
+                    {
+                        one(originalDataProvider).getOriginalData(Integer.MAX_VALUE);
+                        will(returnValue(Arrays.asList(rows)));
+                        one(originalDataProvider).getHeaders();
+                        will(returnValue(Arrays.asList()));
+                    }
 
                     allowing(customColumnsProvider).getGridCustomColumn(SESSION_TOKEN,
                             GRID_DISPLAY_ID);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/FileFormatTypesProviderTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/FileFormatTypesProviderTest.java
index 0ed3fee1efc3f120ae3f01fd61c7fb935a1adece..da1a86c95c2489085bad7ab827975132a351f4dc 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/FileFormatTypesProviderTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/FileFormatTypesProviderTest.java
@@ -60,7 +60,7 @@ public class FileFormatTypesProviderTest extends AbstractProviderTest
     {
         FileFormatTypesProvider vocabulariesProvider =
                 new FileFormatTypesProvider(server, SESSION_TOKEN);
-        TypedTableModel<FileFormatType> tableModel = vocabulariesProvider.getTableModel();
+        TypedTableModel<FileFormatType> tableModel = vocabulariesProvider.getTableModel(Integer.MAX_VALUE);
 
         assertEquals("[CODE, DESCRIPTION]", getHeaderIDs(tableModel).toString());
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProviderTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProviderTest.java
index 4f3280352573317ee299757742e0828d0815a489..c79e440cf1ef62ea9966d6dc644c1641df6fd291 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProviderTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleProviderTest.java
@@ -78,7 +78,7 @@ public class SampleProviderTest extends AbstractProviderTest
                 }
             });
 
-        TypedTableModel<Sample> tableModel = sampleProvider.getTableModel();
+        TypedTableModel<Sample> tableModel = sampleProvider.getTableModel(Integer.MAX_VALUE);
 
         assertEquals(
                 "[CODE, SUBCODE, DATABASE_INSTANCE, SPACE, SAMPLE_IDENTIFIER, SAMPLE_TYPE, "
@@ -131,7 +131,7 @@ public class SampleProviderTest extends AbstractProviderTest
                 }
             });
 
-        TypedTableModel<Sample> tableModel = sampleProvider.getTableModel();
+        TypedTableModel<Sample> tableModel = sampleProvider.getTableModel(Integer.MAX_VALUE);
 
         assertEquals(
                 "[CODE, SUBCODE, DATABASE_INSTANCE, SPACE, SAMPLE_IDENTIFIER, SAMPLE_TYPE, "
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabulariesProviderTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabulariesProviderTest.java
index 5386dfdba101708a97a7018b9996ce9677f8165d..9c3f64db99de519f1103fa5b7bea3b7716fb034b 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabulariesProviderTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/VocabulariesProviderTest.java
@@ -61,7 +61,7 @@ public class VocabulariesProviderTest extends AbstractProviderTest
     {
         VocabulariesProvider vocabulariesProvider =
                 new VocabulariesProvider(server, SESSION_TOKEN, true, false);
-        TypedTableModel<Vocabulary> tableModel = vocabulariesProvider.getTableModel();
+        TypedTableModel<Vocabulary> tableModel = vocabulariesProvider.getTableModel(Integer.MAX_VALUE);
 
         assertEquals(
                 "[CODE, DESCRIPTION, IS_MANAGED_INTERNALLY, REGISTRATOR, REGISTRATION_DATE, URL_TEMPLATE, "
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProvider.java
index 988402c740106508b9ca560afe4b080af356a7fd..25bc49a4740f1fdf37c73b19ffad36c9f1c4b078 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProvider.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProvider.java
@@ -48,7 +48,7 @@ class RawDataSampleProvider extends AbstractTableModelProvider<Sample>
     }
 
     @Override
-    public TypedTableModel<Sample> createTableModel()
+    public TypedTableModel<Sample> createTableModel(int maxSize)
     {
         List<MsInjectionSample> samples = service.listRawDataSamples(sessionToken);
         TypedTableModelBuilder<Sample> builder = new TypedTableModelBuilder<Sample>();
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientServiceTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientServiceTest.java
index 2e3ee7d683fa107bcb411b4bf3769d42fa20dfd6..3c8c161796696f64f36a432b32c9a33c263c4561 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientServiceTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/PhosphoNetXClientServiceTest.java
@@ -78,7 +78,7 @@ public class PhosphoNetXClientServiceTest extends AbstractFileSystemTestCase
                 throws UserFailureException
         {
             List<TableModelColumnHeader> headers = dataProvider.getHeaders();
-            List<T> originalData = dataProvider.getOriginalData();
+            List<T> originalData = dataProvider.getOriginalData(Integer.MAX_VALUE);
             List<GridRowModel<T>> rows = new ArrayList<GridRowModel<T>>();
             for (int i = 0; i < originalData.size(); i++)
             {
@@ -86,7 +86,7 @@ public class PhosphoNetXClientServiceTest extends AbstractFileSystemTestCase
                 rows.add(new GridRowModel<T>(rowData, null));
             }
             return new DefaultResultSet<K, T>(resultConfig.getCacheConfig().tryGetResultSetKey(),
-                    new GridRowModels<T>(rows, headers, null, null), rows.size());
+                    new GridRowModels<T>(rows, headers, null, null), rows.size(), false);
         }
 
         public void removeResultSet(K resultSetKey) throws UserFailureException
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProviderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProviderTest.java
index a01f76e600b31cc90b149aaff099752b672ebe19..355b72867a2f68378b4e788f1112af858416c4a6 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProviderTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/RawDataSampleProviderTest.java
@@ -71,7 +71,7 @@ public class RawDataSampleProviderTest extends AbstractServerTestCase
     {
         prepareListRawDataSamples();
         
-        List<TableModelColumnHeader> headers = provider.getTableModel().getHeader();
+        List<TableModelColumnHeader> headers = provider.getTableModel(Integer.MAX_VALUE).getHeader();
         
         assertFixedColumns(headers);
         assertEquals(4, headers.size());
@@ -86,7 +86,7 @@ public class RawDataSampleProviderTest extends AbstractServerTestCase
         Sample ms3 = sample("MS3", sample("DE", "gamma", "alpha"), "two");
         prepareListRawDataSamples(ms1, ms2, ms3);
         
-        List<TableModelColumnHeader> headers = provider.getTableModel().getHeader();
+        List<TableModelColumnHeader> headers = provider.getTableModel(Integer.MAX_VALUE).getHeader();
         
         assertFixedColumns(headers);
         assertPropertyHeader("one", "USER-ONE", 4, headers);
@@ -103,7 +103,7 @@ public class RawDataSampleProviderTest extends AbstractServerTestCase
     {
         prepareListRawDataSamples();
         
-        List<TableModelRowWithObject<Sample>> data = provider.getTableModel().getRows();
+        List<TableModelRowWithObject<Sample>> data = provider.getTableModel(Integer.MAX_VALUE).getRows();
         
         assertEquals(0, data.size());
         context.assertIsSatisfied();
@@ -121,7 +121,7 @@ public class RawDataSampleProviderTest extends AbstractServerTestCase
         Sample ms3 = sample("MS3", parent, "2");
         prepareListRawDataSamples(ms1, ms2, ms3);
         
-        TypedTableModel<Sample> tableModel = provider.getTableModel();
+        TypedTableModel<Sample> tableModel = provider.getTableModel(Integer.MAX_VALUE);
         List<TableModelRowWithObject<Sample>> data = tableModel.getRows();
         
         assertEquals(3, data.size());
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/PlateMetadataProvider.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/PlateMetadataProvider.java
index 5a28df480186242e58f861258d9de0eaaaddf6ad..a92c2f44831c53c7ddb80cfdc6ae95c865e3363f 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/PlateMetadataProvider.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/PlateMetadataProvider.java
@@ -52,7 +52,7 @@ class PlateMetadataProvider extends AbstractTableModelProvider<WellMetadata>
     }
 
     @Override
-    public TypedTableModel<WellMetadata> createTableModel()
+    public TypedTableModel<WellMetadata> createTableModel(int maxSize)
     {
         TypedTableModelBuilder<WellMetadata> builder = new TypedTableModelBuilder<WellMetadata>();
         PlateContent plateContent = server.getPlateContent(sessionToken, plateId);
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/WellContentProvider.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/WellContentProvider.java
index 62f5bffca4a9b75ad756b27857fe265bb216fa96..2df1403c60ea7f1fd20a7b0ec1e789f975423b07 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/WellContentProvider.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/WellContentProvider.java
@@ -69,7 +69,7 @@ public class WellContentProvider extends AbstractTableModelProvider<WellContent>
     }
 
     @Override
-    protected TypedTableModel<WellContent> createTableModel()
+    protected TypedTableModel<WellContent> createTableModel(int maxSize)
     {
         TypedTableModelBuilder<WellContent> builder = new TypedTableModelBuilder<WellContent>();
         builder.addColumn(WELL_CONTENT_MATERIAL);
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/PlateMetadataProviderTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/PlateMetadataProviderTest.java
index e2dfd74cc273f37fabedce65bbe42dbfe1516087..ebce0f8b652e72157bb8b3715e8a3f6a11041c04 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/PlateMetadataProviderTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/PlateMetadataProviderTest.java
@@ -85,8 +85,7 @@ public class PlateMetadataProviderTest extends AbstractServerTestCase
                 }
             });
 
-        TypedTableModel<WellMetadata> tableModel = provider.getTableModel();
-        assertSame(tableModel, provider.getTableModel());
+        TypedTableModel<WellMetadata> tableModel = provider.getTableModel(Integer.MAX_VALUE);
 
         List<TableModelColumnHeader> headers = tableModel.getHeader();
         assertEquals(null, headers.get(0).getTitle());