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 befeb9d113a5e258c6a2d135efd27dada61b77b1..1bf05c3c7569f4c72414834d0dfabd5919fd9016 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
@@ -23,7 +23,7 @@ import java.util.List;
  * 
  * @author Christian Ribeaud
  */
-final class DefaultResultSet<K, T> implements IResultSet<K, T>
+public final class DefaultResultSet<K, T> implements IResultSet<K, T>
 {
     private final K resultSetKey;
 
@@ -31,7 +31,7 @@ final class DefaultResultSet<K, T> implements IResultSet<K, T>
 
     private final int totalLength;
 
-    DefaultResultSet(final K resultSetKey, final List<T> list, final int totalLength)
+    public DefaultResultSet(final K resultSetKey, final List<T> list, final int totalLength)
     {
         assert resultSetKey != null : "Unspecified result set key";
         assert list != null : "Unspecified list.";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java
index 815b32e4b6b7791e7f82b9742507e4c9f761ba74..95d655472de2cc3c6ab85d6df082785887c3bf8f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java
@@ -22,6 +22,11 @@ import ch.systemsx.cisd.common.utilities.FieldComparator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Sample;
 
+/**
+ * A {@link IFieldComparator} suitable for {@link Sample}.
+ * 
+ * @author Christian Ribeaud
+ */
 final class SampleComparator implements IFieldComparator<Sample>
 {
     private FieldComparator<Sample> fieldComparator;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/AbstractClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/AbstractClientService.java
index 84efa6bbeba4c8bd400a906ac5ad08a5c18e7857..b39590e34b278ed8d7cfdc3bf9d51d759d8f1417 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/AbstractClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/AbstractClientService.java
@@ -21,6 +21,7 @@ import javax.servlet.http.HttpSession;
 
 import org.apache.log4j.Logger;
 
+import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.exceptions.InvalidSessionException;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
@@ -55,6 +56,12 @@ public abstract class AbstractClientService implements IClientService
     {
     }
 
+    @Private
+    protected AbstractClientService(final IRequestContextProvider requestContextProvider)
+    {
+        this.requestContextProvider = requestContextProvider;
+    }
+
     private final SessionContext createSessionContext(final Session session)
     {
         final SessionContext sessionContext = new SessionContext();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
index bc181b56c13f1d5fee96cbe6b5c85ec206fafa09..266d221adc4f614b604bb5765829fac24ec618e1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
@@ -25,7 +25,10 @@ import javax.annotation.Resource;
 
 import org.springframework.stereotype.Component;
 
+import ch.rinn.restrictions.Friend;
+import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.common.servlet.IRequestContextProvider;
 import ch.systemsx.cisd.common.utilities.BeanUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.IGenericClientService;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalData;
@@ -41,17 +44,17 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleGeneration;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleToRegister;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SearchableEntity;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSetManager;
-import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.DtoConverters;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.GroupTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.ListSampleCriteriaTranslator;
-import ch.systemsx.cisd.openbis.generic.client.web.server.util.SampleToRegisterTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.PersonTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.ResultSetTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.RoleAssignmentTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.RoleCodeTranslator;
+import ch.systemsx.cisd.openbis.generic.client.web.server.util.SampleToRegisterTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.SampleTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.SampleTypeTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.SearchableEntityTranslator;
@@ -61,7 +64,6 @@ import ch.systemsx.cisd.openbis.generic.shared.IGenericServer;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.GroupPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.ListSampleCriteriaDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleGenerationDTO;
@@ -80,6 +82,7 @@ import ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames;
  * @author Franz-Josef Elmer
  */
 @Component(value = ResourceNames.GENERIC_SERVICE)
+@Friend(toClasses = AbstractClientService.class)
 public final class GenericClientService extends AbstractClientService implements
         IGenericClientService
 {
@@ -87,6 +90,18 @@ public final class GenericClientService extends AbstractClientService implements
     @Resource(name = ResourceNames.GENERIC_SERVER)
     private IGenericServer genericServer;
 
+    public GenericClientService()
+    {
+    }
+
+    @Private
+    GenericClientService(final IGenericServer genericServer,
+            final IRequestContextProvider requestContextProvider)
+    {
+        super(requestContextProvider);
+        this.genericServer = genericServer;
+    }
+
     @SuppressWarnings("unchecked")
     private final <K> IResultSetManager<K> getResultSetManager()
     {
@@ -277,8 +292,6 @@ public final class GenericClientService extends AbstractClientService implements
     {
         try
         {
-            final ListSampleCriteriaDTO criteria =
-                    ListSampleCriteriaTranslator.translate(listCriteria);
             final IResultSetManager<String> resultSetManager = getResultSetManager();
             final IResultSet<String, Sample> result =
                     resultSetManager.getResultSet(listCriteria, new IOriginalDataProvider<Sample>()
@@ -290,10 +303,12 @@ public final class GenericClientService extends AbstractClientService implements
 
                             public final List<Sample> getOriginalData()
                             {
-                                final List<SamplePE> samplePEs =
-                                        genericServer.listSamples(getSessionToken(), criteria);
-                                final List<Sample> list = new ArrayList<Sample>(samplePEs.size());
-                                for (final SamplePE sample : samplePEs)
+                                final List<SamplePE> samples =
+                                        genericServer.listSamples(getSessionToken(),
+                                                ListSampleCriteriaTranslator
+                                                        .translate(listCriteria));
+                                final List<Sample> list = new ArrayList<Sample>(samples.size());
+                                for (final SamplePE sample : samples)
                                 {
                                     list.add(SampleTranslator.translate(sample));
                                 }
@@ -409,7 +424,8 @@ public final class GenericClientService extends AbstractClientService implements
         try
         {
             final String sessionToken = getSessionToken();
-            genericServer.registerSample(sessionToken, SampleToRegisterTranslator.translate(sample));
+            genericServer
+                    .registerSample(sessionToken, SampleToRegisterTranslator.translate(sample));
         } catch (final UserFailureException e)
         {
             throw UserFailureExceptionTranslator.translate(e);
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 e6e0957aebe33a38c6640e2cdd8d9f2462f6d906..649498b453d2a37823885ffabf072028f1fdbc3a 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
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.server.resultset;
 
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertNotNull;
 import static org.testng.AssertJUnit.assertTrue;
 
 import java.util.ArrayList;
@@ -47,7 +48,7 @@ public final class CachedResultSetManagerTest
 {
     private IResultSetConfig<String> resultSetConfig;
 
-    private IOriginalDataProvider<?> resultSetRetriever;
+    private IOriginalDataProvider<?> originalDataProvider;
 
     private IResultSetManager<String> resultSetManager;
 
@@ -88,7 +89,7 @@ public final class CachedResultSetManagerTest
     {
         context = new Mockery();
         resultSetConfig = context.mock(IResultSetConfig.class);
-        resultSetRetriever = context.mock(IOriginalDataProvider.class);
+        originalDataProvider = context.mock(IOriginalDataProvider.class);
         resultSetManager = createResultSetManager();
     }
 
@@ -157,14 +158,14 @@ public final class CachedResultSetManagerTest
                     one(resultSetConfig).getResultSetKey();
                     will(returnValue(null));
 
-                    one(resultSetRetriever).getOriginalData();
+                    one(originalDataProvider).getOriginalData();
                     will(returnValue(Collections.emptyList()));
 
                     allowResultSetCreation(this);
                 }
             });
         final IResultSet<String, ?> resultSet =
-                resultSetManager.getResultSet(resultSetConfig, resultSetRetriever);
+                resultSetManager.getResultSet(resultSetConfig, originalDataProvider);
         assertEquals(0, resultSet.getList().size());
         assertEquals(0, resultSet.getTotalLength());
         assertTrue(StringUtils.isNotEmpty(resultSet.getResultSetKey()));
@@ -172,7 +173,7 @@ public final class CachedResultSetManagerTest
     }
 
     @Test
-    public final void testGetResult()
+    public final void testGetResultWithAlreadyCachedData()
     {
         context.checking(new Expectations()
             {
@@ -184,13 +185,38 @@ public final class CachedResultSetManagerTest
                 }
             });
         final IResultSet<String, ?> resultSet =
-                resultSetManager.getResultSet(resultSetConfig, resultSetRetriever);
+                resultSetManager.getResultSet(resultSetConfig, originalDataProvider);
         assertEquals(2, resultSet.getList().size());
         assertEquals(3, resultSet.getTotalLength());
         assertEquals("1", resultSet.getResultSetKey());
         context.assertIsSatisfied();
     }
 
+    @Test
+    public final void testGetResultWithoutCachedData()
+    {
+        final String value = "value";
+        context.checking(new Expectations()
+            {
+                {
+                    one(resultSetConfig).getResultSetKey();
+                    will(returnValue(null));
+
+                    one(originalDataProvider).getOriginalData();
+                    will(returnValue(Collections.singletonList(value)));
+
+                    allowResultSetCreation(this);
+                }
+            });
+        final IResultSet<String, ?> resultSet =
+                resultSetManager.getResultSet(resultSetConfig, originalDataProvider);
+        assertEquals(1, resultSet.getList().size());
+        assertEquals(1, resultSet.getTotalLength());
+        assertNotNull(resultSet.getResultSetKey());
+        assertEquals(value, resultSet.getList().get(0));
+        context.assertIsSatisfied();
+    }
+
     @Test
     public final void testRemoveData()
     {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..708704251a55d2bf8a96b115fc15714f81aa43db
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2008 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.plugin.generic.client.web.server;
+
+import static org.testng.AssertJUnit.assertEquals;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.rinn.restrictions.Friend;
+import ch.systemsx.cisd.common.servlet.IRequestContextProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DatabaseInstance;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListSampleCriteria;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DefaultResultSet;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSetManager;
+import ch.systemsx.cisd.openbis.generic.server.SessionConstants;
+import ch.systemsx.cisd.openbis.generic.shared.IGenericServer;
+
+/**
+ * Test cases for corresponding {@link GenericClientService} class.
+ * 
+ * @author Christian Ribeaud
+ */
+@Friend(toClasses = GenericClientService.class)
+public final class GenericClientServiceTest
+{
+    private Mockery context;
+
+    private IGenericServer genericServer;
+
+    private IRequestContextProvider requestContextProvider;
+
+    private GenericClientService genericClientService;
+
+    private HttpServletRequest servletRequest;
+
+    private HttpSession httpSession;
+
+    private IResultSetManager<String> resultSetManager;
+
+    private final static ListSampleCriteria createListCriteria()
+    {
+        final ListSampleCriteria criteria = new ListSampleCriteria();
+        final SampleType sampleType = createSampleType();
+        criteria.setSampleType(sampleType);
+        return criteria;
+    }
+
+    private final static SampleType createSampleType()
+    {
+        final SampleType sampleType = new SampleType();
+        sampleType.setCode("MASTER_PLATE");
+        final DatabaseInstance databaseInstance = new DatabaseInstance();
+        databaseInstance.setCode("DB1");
+        sampleType.setDatabaseInstance(databaseInstance);
+        return sampleType;
+    }
+
+    private final void prepareGetSession(final Expectations expectations)
+    {
+        expectations.one(requestContextProvider).getHttpServletRequest();
+        expectations.will(Expectations.returnValue(servletRequest));
+
+        expectations.one(servletRequest).getSession(false);
+        expectations.will(Expectations.returnValue(httpSession));
+    }
+
+    private final void prepareGetResultSetManager(final Expectations expectations)
+    {
+        expectations.one(httpSession).getAttribute(SessionConstants.OPENBIS_RESULT_SET_MANAGER);
+        expectations.will(Expectations.returnValue(resultSetManager));
+    }
+
+    private final static List<Sample> createSampleList()
+    {
+        return Collections.emptyList();
+    }
+
+    @BeforeMethod
+    @SuppressWarnings("unchecked")
+    public final void setUp()
+    {
+        context = new Mockery();
+        genericServer = context.mock(IGenericServer.class);
+        requestContextProvider = context.mock(IRequestContextProvider.class);
+        servletRequest = context.mock(HttpServletRequest.class);
+        httpSession = context.mock(HttpSession.class);
+        resultSetManager = context.mock(IResultSetManager.class);
+        genericClientService = new GenericClientService(genericServer, requestContextProvider);
+    }
+
+    @AfterMethod
+    public final void tearDown()
+    {
+        // To following line of code should also be called at the end of each test method.
+        // Otherwise one do not known which test failed.
+        context.assertIsSatisfied();
+    }
+
+    @Test
+    public final void testListSamples()
+    {
+        final String resultSetKey = "1";
+        final DefaultResultSet<String, Sample> defaultResultSet =
+                new DefaultResultSet<String, Sample>(resultSetKey, createSampleList(), 0);
+        final ListSampleCriteria listCriteria = createListCriteria();
+        context.checking(new Expectations()
+            {
+                {
+                    prepareGetSession(this);
+                    prepareGetResultSetManager(this);
+
+                    one(resultSetManager).getResultSet(with(listCriteria),
+                            getOriginalDataProvider());
+                    will(returnValue(defaultResultSet));
+                }
+
+                @SuppressWarnings("unchecked")
+                private final IOriginalDataProvider<Sample> getOriginalDataProvider()
+                {
+                    return with(any(IOriginalDataProvider.class));
+                }
+
+            });
+        final ResultSet<Sample> resultSet = genericClientService.listSamples(listCriteria);
+        assertEquals(0, resultSet.getList().size());
+        assertEquals(resultSetKey, resultSet.getResultSetKey());
+        assertEquals(0, resultSet.getTotalLength());
+        context.assertIsSatisfied();
+    }
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
index 7c69b33edef86ccdb8668ad477802e7df68f7638..59d19b610c4c90969f8f36beb0601ffdd0b7028e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
@@ -36,10 +36,9 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
-import ch.systemsx.cisd.openbis.plugin.screening.server.ScreeningServer;
 
 /**
- * Test cases for corresponding {@link ScreeningServer} class.
+ * Test cases for corresponding {@link GenericServer} class.
  * 
  * @author Franz-Josef Elmer
  */