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 d0d2962a4a6b5b1b702a6aaeef18c6dc6421ab9f..32e1cdc4cc1cd2d5b4c29702f141ce87e1ddca07 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
@@ -56,7 +56,7 @@ public class MatchingEntitiesProvider extends AbstractCommonTableModelProvider<M
     {
         List<MatchingEntity> entities =
             commonServer.listMatchingEntities(sessionToken, matchingEntities, queryText,
-                    useWildcardSearchMode);
+                    useWildcardSearchMode, maxSize);
         TypedTableModelBuilder<MatchingEntity> builder = new TypedTableModelBuilder<MatchingEntity>();
         builder.addColumn(ENTITY_KIND);
         builder.addColumn(ENTITY_TYPE);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 6c96e826435fb9fb33dee4ee92de23ec0e660a85..7a0fa9d889b58d0cade03cf3d846e4f2e4244e9e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -532,7 +532,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
     public final List<MatchingEntity> listMatchingEntities(final String sessionToken,
             final SearchableEntity[] searchableEntities, final String queryText,
-            final boolean useWildcardSearchMode)
+            final boolean useWildcardSearchMode, int maxSize)
     {
         checkSession(sessionToken);
         final List<MatchingEntity> list = new ArrayList<MatchingEntity>();
@@ -545,7 +545,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                 List<MatchingEntity> entities =
                         getDAOFactory().getHibernateSearchDAO().searchEntitiesByTerm(
                                 searchableEntity, queryText, dataProvider, useWildcardSearchMode,
-                                list.size());
+                                list.size(), maxSize);
                 list.addAll(entities);
             }
         } catch (final DataAccessException ex)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index 839f828031bfc698fab2d6f9ff925c6533c07429..499be84789e2f2774ed9d40e6da052b5f5bcac92 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -279,11 +279,11 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
 
     public final List<MatchingEntity> listMatchingEntities(final String sessionToken,
             final SearchableEntity[] searchableEntities, final String queryText,
-            final boolean useWildcardSearchMode)
+            final boolean useWildcardSearchMode, int maxSIze)
     {
         logAccess(sessionToken, "list_matching_entities",
-                "SEARCHABLE-ENTITIES(%s) QUERY-TEXT(%s) WILDCARD_MODE(%s)",
-                abbreviate(searchableEntities), queryText, useWildcardSearchMode);
+                "SEARCHABLE-ENTITIES(%s) QUERY-TEXT(%s) WILDCARD_MODE(%s) MAX_SIZE(%s)",
+                abbreviate(searchableEntities), queryText, useWildcardSearchMode, maxSIze);
         return null;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IHibernateSearchDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IHibernateSearchDAO.java
index b7733af01b493af8054a0b34914070653c47c3e8..afd801ea7fb69d6da8c411784e3fc6151ff26366 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IHibernateSearchDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IHibernateSearchDAO.java
@@ -38,10 +38,11 @@ public interface IHibernateSearchDAO
      * using all the indexed fields.
      * 
      * @param searchTerm could be something like "<code>C11 AND System User</code>".
+     * @param maxSize Maximum number of entries. 
      */
     public List<MatchingEntity> searchEntitiesByTerm(final SearchableEntity searchableEntity,
             final String searchTerm, final HibernateSearchDataProvider dataProvider,
-            boolean useWildcardSearchMode, int alreadyFoundEntities) throws DataAccessException;
+            boolean useWildcardSearchMode, int alreadyFoundEntities, int maxSize) throws DataAccessException;
 
     /** search for entity ids using the specified criteria */
     public List<Long> searchForEntityIds(DetailedSearchCriteria criteria, EntityKind entityKind);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
index 399608c21cd0fd73faf3b689dc5584f24cb8705c..234d811411fc4cf5f256caaa1c1aa7168f065d66 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
@@ -105,7 +105,7 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
 
     public List<MatchingEntity> searchEntitiesByTerm(final SearchableEntity searchableEntity,
             final String searchTerm, final HibernateSearchDataProvider dataProvider,
-            final boolean useWildcardSearchMode, final int alreadyFoundEntities)
+            final boolean useWildcardSearchMode, final int alreadyFoundEntities, final int maxSize)
             throws DataAccessException
     {
         assert searchableEntity != null : "Unspecified searchable entity";
@@ -119,7 +119,7 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
                                 throws HibernateException, SQLException
                         {
                             return doSearchEntitiesByTerm(session, searchableEntity, searchTerm,
-                                    dataProvider, useWildcardSearchMode, alreadyFoundEntities);
+                                    dataProvider, useWildcardSearchMode, alreadyFoundEntities, maxSize);
                         }
                     }));
         if (operationLog.isDebugEnabled())
@@ -134,7 +134,7 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
     private final List<MatchingEntity> doSearchEntitiesByTerm(final Session session,
             final SearchableEntity searchableEntity, final String userQuery,
             final HibernateSearchDataProvider dataProvider, final boolean useWildcardSearchMode,
-            int alreadyFoundEntities) throws DataAccessException, UserFailureException
+            int alreadyFoundEntities, int maxSize) throws DataAccessException, UserFailureException
     {
         final FullTextSession fullTextSession = Search.getFullTextSession(session);
         Analyzer analyzer = LuceneQueryBuilder.createSearchAnalyzer();
@@ -153,7 +153,7 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
                 List<MatchingEntity> hits =
                         searchTermInField(fullTextSession, fieldName, searchQuery,
                                 searchableEntity, analyzer, indexProvider.getReader(),
-                                dataProvider, result.size() + alreadyFoundEntities);
+                                dataProvider, result.size() + alreadyFoundEntities, maxSize);
                 result.addAll(hits);
             }
             return result;
@@ -166,10 +166,12 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
     private final List<MatchingEntity> searchTermInField(final FullTextSession fullTextSession,
             final String fieldName, final String searchTerm,
             final SearchableEntity searchableEntity, Analyzer analyzer, IndexReader indexReader,
-            final HibernateSearchDataProvider dataProvider, int alreadyFoundResults)
+            final HibernateSearchDataProvider dataProvider, int alreadyFoundResults, int maxSize)
             throws DataAccessException, UserFailureException
     {
-        int maxResults = Math.max(0, hibernateSearchContext.getMaxResults() - alreadyFoundResults);
+        int maxResults =
+                Math.max(0, Math.min(maxSize, hibernateSearchContext.getMaxResults())
+                        - alreadyFoundResults);
         if (maxResults == 0)
         {
             return new ArrayList<MatchingEntity>();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index 97efed44048e4b74008724c7109302add888796f..51087382c5523d92c9f6804d38d67636eb51a3a0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -345,13 +345,14 @@ public interface ICommonServer extends IServer
 
     /**
      * Performs an <i>Hibernate Search</i> based on given parameters.
+     * @param maxSize 
      */
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = MatchingEntityValidator.class)
     public List<MatchingEntity> listMatchingEntities(final String sessionToken,
             final SearchableEntity[] searchableEntities, final String queryText,
-            final boolean useWildcardSearchMode);
+            final boolean useWildcardSearchMode, int maxSize);
 
     /**
      * List experiment types.
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java
index 8d8f6bbc36b2ccbf073443406ae30251ae232770..186c613ac5cda90bc425b1cf29585d846b6e636c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAOTest.java
@@ -118,7 +118,7 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest
         boolean fail = true;
         try
         {
-            hibernateSearchDAO.searchEntitiesByTerm(null, null, createDataProvider(), true, 0);
+            hibernateSearchDAO.searchEntitiesByTerm(null, null, createDataProvider(), true, 0, Integer.MAX_VALUE);
         } catch (final AssertionError ex)
         {
             fail = false;
@@ -128,7 +128,7 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest
         try
         {
             hibernateSearchDAO.searchEntitiesByTerm(SearchableEntity.MATERIAL, "",
-                    createDataProvider(), true, 0);
+                    createDataProvider(), true, 0, Integer.MAX_VALUE);
         } catch (final AssertionError ex)
         {
             fail = false;
@@ -148,7 +148,7 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest
         final String lastName = "John";
         final List<MatchingEntity> hits =
                 hibernateSearchDAO.searchEntitiesByTerm(SearchableEntity.SAMPLE, term,
-                        createDataProvider(), false, 0);
+                        createDataProvider(), false, 0, Integer.MAX_VALUE);
         assertTrue(hits.size() > 0);
         for (MatchingEntity matchingEntity : hits)
         {
@@ -174,7 +174,7 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest
         final IHibernateSearchDAO hibernateSearchDAO = daoFactory.getHibernateSearchDAO();
         final List<MatchingEntity> hits =
                 hibernateSearchDAO.searchEntitiesByTerm(SearchableEntity.EXPERIMENT, query,
-                        createDataProvider(), useWildcardMode, 0);
+                        createDataProvider(), useWildcardMode, 0, Integer.MAX_VALUE);
         assertEquals(5, hits.size());
         for (MatchingEntity matchingEntity : hits)
         {
@@ -190,7 +190,7 @@ public final class HibernateSearchDAOTest extends AbstractDAOTest
         String propertyValue = "adenovirus";
         final List<MatchingEntity> hits =
                 hibernateSearchDAO.searchEntitiesByTerm(SearchableEntity.MATERIAL, propertyValue,
-                        createDataProvider(), true, 0);
+                        createDataProvider(), true, 0, Integer.MAX_VALUE);
         assertEquals(2, hits.size());
         for (MatchingEntity matchingEntity : hits)
         {