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 d48923c6b2c60cb30b5d2d34fcdd8380149e059b..b92a6287aa43821a70496f27db3413dc94c2b876 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
@@ -197,7 +197,8 @@ public abstract class AbstractClientService implements IClientService,
     {
         return new AbstractOriginalDataProviderWithoutHeaders<T>()
             {
-                public List<T> getOriginalData() throws UserFailureException
+                @Override
+                public List<T> getFullOriginalData() throws UserFailureException
                 {
                     throw new IllegalStateException("Data not found in the cache");
                 }
@@ -381,6 +382,12 @@ public abstract class AbstractClientService implements IClientService,
         ResultSet<TableModelRowWithObject<Null>> resultSet =
                 listEntities(criteria, new IOriginalDataProvider<TableModelRowWithObject<Null>>()
                     {
+                        public List<TableModelRowWithObject<Null>> getOriginalData(int maxSize)
+                                throws UserFailureException
+                        {
+                            return getOriginalData();
+                        }
+
                         public List<TableModelRowWithObject<Null>> getOriginalData()
                                 throws UserFailureException
                         {
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 8a5aeb724e6e0a8645e554e2f98e5dce9685a147..87c783e0b53a0c0ef7c0dae02518847a83d655fc 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
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.server;
 import java.util.ArrayList;
 import java.util.List;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
 
@@ -31,11 +32,40 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
 public abstract class AbstractOriginalDataProviderWithoutHeaders<T> implements
         IOriginalDataProvider<T>
 {
-    private static final List<TableModelColumnHeader> NO_HEADERS = new ArrayList<TableModelColumnHeader>();
+    private static final List<TableModelColumnHeader> NO_HEADERS =
+            new ArrayList<TableModelColumnHeader>();
+
+    private List<T> originalData;
 
     public List<TableModelColumnHeader> getHeaders()
     {
         // Collections.emptyList() can not be serialized by GWT
         return NO_HEADERS;
     }
+    
+    public List<T> getOriginalData(int maxSize) throws UserFailureException
+    {
+        originalData = getOriginalData();
+        List<T> list = new ArrayList<T>();
+        for (T item : originalData)
+        {
+            if (list.size() == maxSize)
+            {
+                break;
+            }
+            list.add(item);
+        }
+        return list;
+    }
+
+    public List<T> getOriginalData() throws UserFailureException
+    {
+        if (originalData != null)
+        {
+            return originalData;
+        }
+        return getFullOriginalData();
+    }
+
+    public abstract List<T> getFullOriginalData();
 }
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 bc7e0b6d97514d040124227234c5f28726f67114..ed812a093ca6aa0d50cc3e56d0f46d6fcab417ff 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
@@ -582,7 +582,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(criteria,
                 new AbstractOriginalDataProviderWithoutHeaders<PropertyType>()
                     {
-                        public List<PropertyType> getOriginalData() throws UserFailureException
+                        @Override
+                        public List<PropertyType> getFullOriginalData() throws UserFailureException
                         {
                             return listPropertyTypes(true);
                         }
@@ -608,7 +609,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(criteria,
                 new AbstractOriginalDataProviderWithoutHeaders<EntityTypePropertyType<?>>()
                     {
-                        public List<EntityTypePropertyType<?>> getOriginalData()
+                        @Override
+                        public List<EntityTypePropertyType<?>> getFullOriginalData()
                                 throws UserFailureException
                         {
                             return extractAssignments(listPropertyTypes(true));
@@ -669,7 +671,8 @@ public final class CommonClientService extends AbstractClientService implements
     {
         return listEntities(criteria, new AbstractOriginalDataProviderWithoutHeaders<Script>()
             {
-                public List<Script> getOriginalData() throws UserFailureException
+                @Override
+                public List<Script> getFullOriginalData() throws UserFailureException
                 {
                     return listScripts(criteria.tryGetScriptType(), criteria.tryGetEntityKind());
                 }
@@ -711,7 +714,8 @@ public final class CommonClientService extends AbstractClientService implements
     {
         return listEntities(criteria, new AbstractOriginalDataProviderWithoutHeaders<Person>()
             {
-                public List<Person> getOriginalData() throws UserFailureException
+                @Override
+                public List<Person> getFullOriginalData() throws UserFailureException
                 {
                     if (criteria.getAuthorizationGroupId() == null)
                         return listPersons();
@@ -742,7 +746,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(criteria,
                 new AbstractOriginalDataProviderWithoutHeaders<RoleAssignment>()
                     {
-                        public List<RoleAssignment> getOriginalData() throws UserFailureException
+                        @Override
+                        public List<RoleAssignment> getFullOriginalData() throws UserFailureException
                         {
                             return listRoleAssignments();
                         }
@@ -798,7 +803,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(criteria,
                 new AbstractOriginalDataProviderWithoutHeaders<MaterialType>()
                     {
-                        public List<MaterialType> getOriginalData() throws UserFailureException
+                        @Override
+                        public List<MaterialType> getFullOriginalData() throws UserFailureException
                         {
                             return listMaterialTypes();
                         }
@@ -810,7 +816,8 @@ public final class CommonClientService extends AbstractClientService implements
     {
         return listEntities(criteria, new AbstractOriginalDataProviderWithoutHeaders<SampleType>()
             {
-                public List<SampleType> getOriginalData() throws UserFailureException
+                @Override
+                public List<SampleType> getFullOriginalData() throws UserFailureException
                 {
                     return listSampleTypes();
                 }
@@ -824,7 +831,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(criteria,
                 new AbstractOriginalDataProviderWithoutHeaders<ExperimentType>()
                     {
-                        public List<ExperimentType> getOriginalData() throws UserFailureException
+                        @Override
+                        public List<ExperimentType> getFullOriginalData() throws UserFailureException
                         {
                             return listExperimentTypes();
                         }
@@ -837,7 +845,8 @@ public final class CommonClientService extends AbstractClientService implements
     {
         return listEntities(criteria, new AbstractOriginalDataProviderWithoutHeaders<DataSetType>()
             {
-                public List<DataSetType> getOriginalData() throws UserFailureException
+                @Override
+                public List<DataSetType> getFullOriginalData() throws UserFailureException
                 {
                     return listDataSetTypes();
                 }
@@ -861,7 +870,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntitiesWithTypes(criteria,
                 new AbstractOriginalDataProviderWithoutHeaders<ExternalData>()
                     {
-                        public List<ExternalData> getOriginalData() throws UserFailureException
+                        @Override
+                        public List<ExternalData> getFullOriginalData() throws UserFailureException
                         {
                             final String sessionToken = getSessionToken();
                             final List<ExternalData> externalData =
@@ -880,7 +890,8 @@ public final class CommonClientService extends AbstractClientService implements
                 new AbstractOriginalDataProviderWithoutHeaders<ExternalData>()
                     {
 
-                        public List<ExternalData> getOriginalData() throws UserFailureException
+                        @Override
+                        public List<ExternalData> getFullOriginalData() throws UserFailureException
                         {
                             final String sessionToken = getSessionToken();
                             final List<ExternalData> externalData =
@@ -900,7 +911,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntitiesWithTypes(criteria,
                 new AbstractOriginalDataProviderWithoutHeaders<ExternalData>()
                     {
-                        public List<ExternalData> getOriginalData() throws UserFailureException
+                        @Override
+                        public List<ExternalData> getFullOriginalData() throws UserFailureException
                         {
                             final String sessionToken = getSessionToken();
                             final List<ExternalData> externalData =
@@ -1741,7 +1753,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(criteria,
                 new AbstractOriginalDataProviderWithoutHeaders<AttachmentVersions>()
                     {
-                        public List<AttachmentVersions> getOriginalData()
+                        @Override
+                        public List<AttachmentVersions> getFullOriginalData()
                                 throws UserFailureException
                         {
                             return listAttachmentVersions(holderId, holderKind);
@@ -2134,6 +2147,13 @@ public final class CommonClientService extends AbstractClientService implements
                         {
                             return null;
                         }
+
+                        public List<TableModelRowWithObject<Null>> getOriginalData(int maxSize)
+                                throws UserFailureException
+                        {
+                            return getOriginalData();
+                        }
+
                     };
         return new TypedTableResultSet<Null>(listEntities(resultSetConfig, dataProvider));
     }
@@ -2259,7 +2279,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(resultSetConfig,
                 new AbstractOriginalDataProviderWithoutHeaders<AuthorizationGroup>()
                     {
-                        public List<AuthorizationGroup> getOriginalData()
+                        @Override
+                        public List<AuthorizationGroup> getFullOriginalData()
                                 throws UserFailureException
                         {
                             return listAuthorizationGroups();
@@ -2408,7 +2429,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(resultSetConfig,
                 new AbstractOriginalDataProviderWithoutHeaders<GridCustomFilter>()
                     {
-                        public List<GridCustomFilter> getOriginalData() throws UserFailureException
+                        @Override
+                        public List<GridCustomFilter> getFullOriginalData() throws UserFailureException
                         {
                             return listFilters(gridId);
                         }
@@ -2480,7 +2502,8 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(resultSetConfig,
                 new AbstractOriginalDataProviderWithoutHeaders<GridCustomColumn>()
                     {
-                        public List<GridCustomColumn> getOriginalData() throws UserFailureException
+                        @Override
+                        public List<GridCustomColumn> getFullOriginalData() throws UserFailureException
                         {
                             return listGridCustomColumns(gridId);
                         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListDataSetSearchOriginalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListDataSetSearchOriginalDataProvider.java
index 78dae1a287de363519d508cb18b823d961f308df..ab331afa0c951044f64157da49fbb7c0b282be6f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListDataSetSearchOriginalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListDataSetSearchOriginalDataProvider.java
@@ -29,7 +29,8 @@ final class ListDataSetSearchOriginalDataProvider extends
     // AbstractOriginalDataProvider
     //
 
-    public final List<ExternalData> getOriginalData()
+    @Override
+    public final List<ExternalData> getFullOriginalData()
     {
         final List<ExternalData> hits = commonServer.searchForDataSets(sessionToken, criteria);
         return hits;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListExperimentsOriginalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListExperimentsOriginalDataProvider.java
index 7a95f3a4571eeb14ed5bd48bf8406f4d9a3b4789..e642439739352497043ebc8ae61d540924b11ed6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListExperimentsOriginalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListExperimentsOriginalDataProvider.java
@@ -44,7 +44,8 @@ final class ListExperimentsOriginalDataProvider extends AbstractOriginalDataProv
     // AbstractOriginalDataProvider
     //
 
-    public final List<Experiment> getOriginalData()
+    @Override
+    public final List<Experiment> getFullOriginalData()
     {
         final List<Experiment> experiments =
                 commonServer.listExperiments(sessionToken, listCriteria.getExperimentType(),
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
index b5801c53b430282d8e8a7354d556bb3e47088184..bfbc16782f1b9202e387cfba1a67363d3dd11e5d 100644
--- 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
@@ -36,7 +36,8 @@ final class ListMatchingEntitiesOriginalDataProvider extends
     // AbstractOriginalDataProvider
     //
 
-    public final List<MatchingEntity> getOriginalData()
+    @Override
+    public final List<MatchingEntity> getFullOriginalData()
     {
         final List<MatchingEntity> entities =
                 commonServer.listMatchingEntities(sessionToken, matchingEntities, queryText,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListMaterialOriginalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListMaterialOriginalDataProvider.java
index c0794eb5a079817b520e7b18cb12fa98d7364a9a..c3aa2cf0a1f2c8e9becfb8d99c07955a3cbed8ad 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListMaterialOriginalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListMaterialOriginalDataProvider.java
@@ -43,7 +43,8 @@ final class ListMaterialOriginalDataProvider extends AbstractOriginalDataProvide
     // AbstractOriginalDataProvider
     //
 
-    public final List<Material> getOriginalData()
+    @Override
+    public final List<Material> getFullOriginalData()
     {
         final List<Material> materials =
                 commonServer.listMaterials(sessionToken, displayCriteria.getListCriteria(), true);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListRelatedDataSetOriginalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListRelatedDataSetOriginalDataProvider.java
index f8ea286bbca9da43d7a8d2852c027f01844f00e2..7a6a2305b4429116d3cc3608fde4f4af12f195c4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListRelatedDataSetOriginalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListRelatedDataSetOriginalDataProvider.java
@@ -29,7 +29,8 @@ final class ListRelatedDataSetOriginalDataProvider extends
     // AbstractOriginalDataProvider
     //
 
-    public final List<ExternalData> getOriginalData()
+    @Override
+    public final List<ExternalData> getFullOriginalData()
     {
         final List<ExternalData> hits = commonServer.listRelatedDataSets(sessionToken, entities);
         return hits;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListSamplesOriginalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListSamplesOriginalDataProvider.java
index 30db1023054d2f16f80db8c7dfe5d0433f237354..c7ecf7a1b7d2557f9b4429a6814b8d639f819c2c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListSamplesOriginalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListSamplesOriginalDataProvider.java
@@ -29,7 +29,8 @@ final class ListSamplesOriginalDataProvider extends AbstractOriginalDataProvider
     // AbstractOriginalDataProvider
     //
 
-    public final List<Sample> getOriginalData()
+    @Override
+    public final List<Sample> getFullOriginalData()
     {
         switch (criteria.getCriteriaKind())
         {
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 ccc9dfc1cb0da84d4e51cd864f68d83b3b91b0c6..89648b5ec26c4ab3c3fa4caa325aa9b89ee60f23 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
@@ -16,7 +16,12 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.server.resultset;
 
+import java.util.ArrayList;
+import java.util.List;
+
 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;
 
 /**
@@ -39,6 +44,23 @@ public abstract class AbstractTableModelProvider<T extends ISerializable> implem
         return model;
     }
 
+    public TypedTableModel<T> getTableModel(int maxSize)
+    {
+        TypedTableModel<T> tableModel = getTableModel();
+        List<TableModelColumnHeader> headers = tableModel.getHeader();
+        List<TableModelRowWithObject<T>> rows = tableModel.getRows();
+        List<TableModelRowWithObject<T>> limitedRows = new ArrayList<TableModelRowWithObject<T>>();
+        for (TableModelRowWithObject<T> row : rows)
+        {
+            if (limitedRows.size() == maxSize)
+            {
+                break;
+            }
+            limitedRows.add(row);
+        }
+        return new TypedTableModel<T>(headers, limitedRows);
+    }
+
     /**
      * Creates the table model. The returned instance is always returned by {@link #getTableModel()}
      * .
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 9513b779992f8ed25b178ac2e1046ba338831c97..a9179b00c74dd915815ebfaa1c0e504e11f1c13b 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
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.server.resultset;
 
 import java.util.List;
 
+import ch.systemsx.cisd.openbis.generic.client.web.server.AbstractOriginalDataProviderWithoutHeaders;
 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;
@@ -25,8 +26,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject
 /**
  * @author Franz-Josef Elmer
  */
-public final class DataProviderAdapter<T extends ISerializable> implements
-        IOriginalDataProvider<TableModelRowWithObject<T>>
+public final class DataProviderAdapter<T extends ISerializable> extends
+    AbstractOriginalDataProviderWithoutHeaders<TableModelRowWithObject<T>>
 {
     private final ITableModelProvider<T> provider;
 
@@ -35,11 +36,13 @@ public final class DataProviderAdapter<T extends ISerializable> implements
         this.provider = provider;
     }
 
-    public List<TableModelRowWithObject<T>> getOriginalData()
+    @Override
+    public List<TableModelRowWithObject<T>> getFullOriginalData()
     {
         return provider.getTableModel().getRows();
     }
 
+    @Override
     public List<TableModelColumnHeader> getHeaders()
     {
         return provider.getTableModel().getHeader();
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 a432f14230068a78a1a128abe96a129864f93d8d..af43dc83f9f834cb6df1cbb2781d6eccba767a4d 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
@@ -29,6 +29,11 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
 public interface IOriginalDataProvider<T>
 {
 
+    /**
+     * Gets the original data limited to not more than specified number of items.
+     */
+    public List<T> getOriginalData(int maxSize) throws UserFailureException;
+    
     /**
      * Returns the original data.
      */
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 733fd2eda39ecc9ce6412d15f4d6397f251310ab..6121aed388008ba2719f8d4aa9a3a37be51a24a8 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
@@ -20,9 +20,19 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
 
 /**
+ * Provider of a {@link TypedTableModel} instance.
+ * 
  * @author Franz-Josef Elmer
  */
 public interface ITableModelProvider<T extends ISerializable>
 {
+    /**
+     * Returns the full table model.
+     */
     public TypedTableModel<T> getTableModel();
+    
+    /**
+     * Returns the table model limited as specified.
+     */
+    public TypedTableModel<T> getTableModel(int maxSize);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java
index 4dac8692e4a02a465c537eab772220b5277ab2d3..c7f0010381426ba3ac532529df5c7f4f56b3418c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java
@@ -198,7 +198,8 @@ public class QueryClientService extends AbstractClientService implements IQueryC
             return listEntities(resultSetConfig,
                     new AbstractOriginalDataProviderWithoutHeaders<QueryExpression>()
                         {
-                            public List<QueryExpression> getOriginalData()
+                            @Override
+                            public List<QueryExpression> getFullOriginalData()
                                     throws UserFailureException
                             {
                                 return queryServer.listQueries(getSessionToken(),
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListDataSetProteinDataProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListDataSetProteinDataProvider.java
index 6d0cfb85a9d1f0a271d126e09bb67cf76b3d7556..b40ba0c3dfefd45264670ea458a86956e317bbef 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListDataSetProteinDataProvider.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListDataSetProteinDataProvider.java
@@ -46,7 +46,8 @@ public class ListDataSetProteinDataProvider extends AbstractOriginalDataProvider
         this.proteinReferenceID = proteinReferenceID;
     }
 
-    public List<DataSetProtein> getOriginalData() throws UserFailureException
+    @Override
+    public List<DataSetProtein> getFullOriginalData() throws UserFailureException
     {
         return server.listProteinsByExperimentAndReference(sessionToken, experimentID,
                 proteinReferenceID);
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinOriginalDataProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinOriginalDataProvider.java
index 4f5dd6975c057fab02d10832cd0d807677442ef4..6b6c6bdd7eb3ac359ce4745430d4d7a95f0ea96a 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinOriginalDataProvider.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinOriginalDataProvider.java
@@ -53,7 +53,8 @@ class ListProteinOriginalDataProvider extends AbstractOriginalDataProviderWithou
         this.aggregateOnOriginal = aggregateOnOriginal;
     }
     
-    public List<ProteinInfo> getOriginalData() throws UserFailureException
+    @Override
+    public List<ProteinInfo> getFullOriginalData() throws UserFailureException
     {
         return server.listProteinsByExperiment(sessionToken, experimentID, falseDiscoveryRate,
                 aggregateFunction, treatmentTypeCode, aggregateOnOriginal);
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinSequenceDataProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinSequenceDataProvider.java
index e78bb8299b1015db85a6a908a903231da8987c12..65eff52485668bf5e3e08f4034359531cf14edb3 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinSequenceDataProvider.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinSequenceDataProvider.java
@@ -43,7 +43,8 @@ class ListProteinSequenceDataProvider extends AbstractOriginalDataProviderWithou
         this.proteinReferenceID = proteinReferenceID;
     }
 
-    public List<ProteinSequence> getOriginalData() throws UserFailureException
+    @Override
+    public List<ProteinSequence> getFullOriginalData() throws UserFailureException
     {
         return server.listProteinSequencesByProteinReference(sessionToken, proteinReferenceID);
     }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinSummaryProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinSummaryProvider.java
index d686893bcb1f996701aa8b24c0af2a7d734e0227..9cf596e0f134358df86e2830ba7257ed3cbb5382 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinSummaryProvider.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListProteinSummaryProvider.java
@@ -43,7 +43,8 @@ class ListProteinSummaryProvider extends AbstractOriginalDataProviderWithoutHead
         this.experimentID = experimentID;
     }
 
-    public List<ProteinSummary> getOriginalData() throws UserFailureException
+    @Override
+    public List<ProteinSummary> getFullOriginalData() throws UserFailureException
     {
         return server.listProteinSummariesByExperiment(sessionToken, experimentID);
     }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListSampleAbundanceDataProvider.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListSampleAbundanceDataProvider.java
index 21e5b9f318d4da690f06cd667fbb8f1c80e17353..1889d5494559711a4e0b924551d4473ae65889d4 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListSampleAbundanceDataProvider.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/server/ListSampleAbundanceDataProvider.java
@@ -49,7 +49,8 @@ class ListSampleAbundanceDataProvider extends AbstractOriginalDataProviderWithou
     }
 
 
-    public List<SampleWithPropertiesAndAbundance> getOriginalData() throws UserFailureException
+    @Override
+    public List<SampleWithPropertiesAndAbundance> getFullOriginalData() throws UserFailureException
     {
         return server.listSamplesWithAbundanceByProtein(sessionToken, experimentID, proteinReferenceID);
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
index 5243c00f466dccd5f696bd19b0dd2a4a0046cf38..be0392b8664e625b19d60f7fc817e6cea16089ef 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
@@ -271,7 +271,8 @@ public final class ScreeningClientService extends AbstractClientService implemen
             return listEntities(displayCriteria,
                     new AbstractOriginalDataProviderWithoutHeaders<Material>()
                         {
-                            public List<Material> getOriginalData() throws UserFailureException
+                            @Override
+                            public List<Material> getFullOriginalData() throws UserFailureException
                             {
                                 return server.listExperimentMaterials(getSessionToken(),
                                         experimentId, displayCriteria.getListCriteria()
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 c2ff2df5ab2352d7ec9ab1499b7b2c50b8da68bc..62f5bffca4a9b75ad756b27857fe265bb216fa96 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
@@ -30,7 +30,7 @@ import static ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSea
 
 import java.util.List;
 
-import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.ITableModelProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractTableModelProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
@@ -48,7 +48,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCrit
 /**
  * @author Franz-Josef Elmer
  */
-public class WellContentProvider implements ITableModelProvider<WellContent>
+public class WellContentProvider extends AbstractTableModelProvider<WellContent>
 {
     static final String WELL_CONTENT_PROPERTY_ID_PREFIX = "WELL_CONTENT_PROPERTY-";
 
@@ -60,8 +60,6 @@ public class WellContentProvider implements ITableModelProvider<WellContent>
 
     private final WellSearchCriteria materialCriteria;
 
-    private TypedTableModel<WellContent> model;
-
     WellContentProvider(IScreeningServer server, String sessionToken,
             WellSearchCriteria materialCriteria)
     {
@@ -70,61 +68,58 @@ public class WellContentProvider implements ITableModelProvider<WellContent>
         this.materialCriteria = materialCriteria;
     }
 
-    public TypedTableModel<WellContent> getTableModel()
+    @Override
+    protected TypedTableModel<WellContent> createTableModel()
     {
-        if (model == null)
+        TypedTableModelBuilder<WellContent> builder = new TypedTableModelBuilder<WellContent>();
+        builder.addColumn(WELL_CONTENT_MATERIAL);
+        builder.addColumn(WELL_CONTENT_MATERIAL_TYPE);
+        builder.addColumn(EXPERIMENT);
+        builder.addColumn(PLATE);
+        builder.addColumn(WELL);
+        builder.addColumn(WELL_ROW).withDataType(DataTypeCode.INTEGER);
+        builder.addColumn(WELL_COLUMN).withDataType(DataTypeCode.INTEGER);
+        builder.addColumn(IMAGE_DATA_SET);
+        builder.addColumn(IMAGE_ANALYSIS_DATA_SET);
+        builder.addColumn(FILE_FORMAT_TYPE);
+        builder.addColumn(WELL_IMAGES).withDefaultWidth(500);
+        List<WellContent> wells = server.listPlateWells(sessionToken, materialCriteria);
+        for (WellContent well : wells)
         {
-            TypedTableModelBuilder<WellContent> builder = new TypedTableModelBuilder<WellContent>();
-            builder.addColumn(WELL_CONTENT_MATERIAL);
-            builder.addColumn(WELL_CONTENT_MATERIAL_TYPE);
-            builder.addColumn(EXPERIMENT);
-            builder.addColumn(PLATE);
-            builder.addColumn(WELL);
-            builder.addColumn(WELL_ROW).withDataType(DataTypeCode.INTEGER);
-            builder.addColumn(WELL_COLUMN).withDataType(DataTypeCode.INTEGER);
-            builder.addColumn(IMAGE_DATA_SET);
-            builder.addColumn(IMAGE_ANALYSIS_DATA_SET);
-            builder.addColumn(FILE_FORMAT_TYPE);
-            builder.addColumn(WELL_IMAGES).withDefaultWidth(500);
-            List<WellContent> wells = server.listPlateWells(sessionToken, materialCriteria);
-            for (WellContent well : wells)
+            builder.addRow(well);
+            Material material = well.getMaterialContent();
+            String value = material.getCode();
+            builder.column(WELL_CONTENT_MATERIAL).addString(value);
+            builder.column(WELL_CONTENT_MATERIAL_TYPE)
+                    .addString(material.getEntityType().getCode());
+            builder.columnGroup(WELL_CONTENT_PROPERTY_ID_PREFIX).addProperties(
+                    material.getProperties());
+            NamedFeatureVector featureVector = well.tryGetFeatureVectorValues();
+            if (featureVector != null)
             {
-                builder.addRow(well);
-                Material material = well.getMaterialContent();
-                String value = material.getCode();
-                builder.column(WELL_CONTENT_MATERIAL).addString(value);
-                builder.column(WELL_CONTENT_MATERIAL_TYPE).addString(
-                        material.getEntityType().getCode());
-                builder.columnGroup(WELL_CONTENT_PROPERTY_ID_PREFIX).addProperties(
-                        material.getProperties());
-                NamedFeatureVector featureVector = well.tryGetFeatureVectorValues();
-                if (featureVector != null)
-                {
-                    addFeatureColumns(builder, featureVector);
-                }
-                builder.column(EXPERIMENT).addString(well.getExperiment().toString());
-                builder.column(PLATE).addString(well.getPlate().getCode());
-                builder.column(WELL).addString(well.getWell().getCode());
-                WellLocation location = well.tryGetLocation();
-                builder.column(WELL_ROW).addInteger(
-                        location == null ? null : new Long(location.getRow()));
-                builder.column(WELL_COLUMN).addInteger(
-                        location == null ? null : new Long(location.getColumn()));
-                DatasetImagesReference imageDataset = well.tryGetImageDataset();
-                builder.column(IMAGE_DATA_SET).addString(
-                        imageDataset == null ? null : imageDataset.getDatasetCode());
-                DatasetReference dataset = well.tryGetFeatureVectorDataset();
-                builder.column(IMAGE_ANALYSIS_DATA_SET).addString(
-                        dataset == null ? null : dataset.getCode());
-                builder.column(FILE_FORMAT_TYPE).addString(
-                        imageDataset == null ? null : imageDataset.getDatasetReference()
-                                .getFileTypeCode());
-                builder.column(WELL_IMAGES).addString(
-                        well.tryGetImageDataset() == null ? "" : "[images]");
+                addFeatureColumns(builder, featureVector);
             }
-            model = builder.getModel();
+            builder.column(EXPERIMENT).addString(well.getExperiment().toString());
+            builder.column(PLATE).addString(well.getPlate().getCode());
+            builder.column(WELL).addString(well.getWell().getCode());
+            WellLocation location = well.tryGetLocation();
+            builder.column(WELL_ROW).addInteger(
+                    location == null ? null : new Long(location.getRow()));
+            builder.column(WELL_COLUMN).addInteger(
+                    location == null ? null : new Long(location.getColumn()));
+            DatasetImagesReference imageDataset = well.tryGetImageDataset();
+            builder.column(IMAGE_DATA_SET).addString(
+                    imageDataset == null ? null : imageDataset.getDatasetCode());
+            DatasetReference dataset = well.tryGetFeatureVectorDataset();
+            builder.column(IMAGE_ANALYSIS_DATA_SET).addString(
+                    dataset == null ? null : dataset.getCode());
+            builder.column(FILE_FORMAT_TYPE).addString(
+                    imageDataset == null ? null : imageDataset.getDatasetReference()
+                            .getFileTypeCode());
+            builder.column(WELL_IMAGES).addString(
+                    well.tryGetImageDataset() == null ? "" : "[images]");
         }
-        return model;
+        return builder.getModel();
     }
 
     private void addFeatureColumns(TypedTableModelBuilder<WellContent> builder,