diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceAbstractTestCases.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceAbstractTestCases.java
deleted file mode 100644
index 3fbcd584d86a692473f0099cc6b47d75f1cb6be3..0000000000000000000000000000000000000000
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceAbstractTestCases.java
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
- * Copyright 2010 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.remoteapitest.api.v1;
-
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.testng.AssertJUnit;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import ch.systemsx.cisd.common.utilities.ToStringComparator;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyType;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyTypeGroup;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Role;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SpaceWithProjectsAndRoleAssignments;
-
-/**
- * This class contains a set of generic tests cases for {@link IGeneralInformationService}. The test
- * cases require an instance of {@link IGeneralInformationService} to be injected from an external
- * source and thus cannot run on their own.
- * 
- * @author Franz-Josef Elmer
- * @author Kaloyan Enimanev
- */
-// exclude from running directly as TestNG test.
-@Test(groups =
-    { "abstract", "broken" })
-public class GeneralInformationServiceAbstractTestCases extends AssertJUnit
-{
-    /**
-     * Helps delaying the initialization of the {@link IGeneralInformationService} field until the
-     * necessary infrastructure has been bootstrapped.
-     */
-    public static interface IGeneralInformationServiceFactory
-    {
-        IGeneralInformationService createService();
-    }
-
-    private final IGeneralInformationServiceFactory serviceHolder;
-
-    private IGeneralInformationService generalInformationService;
-
-    private String sessionToken;
-
-    public GeneralInformationServiceAbstractTestCases(
-            IGeneralInformationServiceFactory serviceHolder)
-    {
-        this.serviceHolder = serviceHolder;
-    }
-
-    @BeforeMethod
-    public void beforeMethod() throws MalformedURLException
-    {
-        generalInformationService = serviceHolder.createService();
-        sessionToken = generalInformationService.tryToAuthenticateForAllServices("test", "a");
-    }
-
-    @AfterMethod
-    public void afterMethod() throws MalformedURLException
-    {
-        generalInformationService.logout(sessionToken);
-    }
-
-    @Test
-    public void testListNamedRoleSets()
-    {
-        Map<String, Set<Role>> namedRoleSets =
-                generalInformationService.listNamedRoleSets(sessionToken);
-
-        assertEquals("[ADMIN(instance), ADMIN(space)]", namedRoleSets.get("SPACE_ADMIN").toString());
-    }
-
-    @Test
-    public void testListSpacesWithProjectsAndRoleAssignments()
-    {
-        List<SpaceWithProjectsAndRoleAssignments> spaces =
-                generalInformationService.listSpacesWithProjectsAndRoleAssignments(sessionToken,
-                        null);
-
-        Collections.sort(spaces, new Comparator<SpaceWithProjectsAndRoleAssignments>()
-            {
-                public int compare(SpaceWithProjectsAndRoleAssignments s1,
-                        SpaceWithProjectsAndRoleAssignments s2)
-                {
-                    return s1.getCode().compareTo(s2.getCode());
-                }
-            });
-        checkSpace("CISD", "[/CISD/DEFAULT, /CISD/NEMO, /CISD/NOE]",
-                "[ADMIN(instance), ADMIN(space), ETL_SERVER(instance), ETL_SERVER(space)]",
-                spaces.get(0));
-        checkSpace("TESTGROUP", "[/TESTGROUP/TESTPROJ]",
-                "[ADMIN(instance), ADMIN(space), ETL_SERVER(instance)]", spaces.get(1));
-        assertEquals(2, spaces.size());
-    }
-
-    @Test
-    public void testListProjects()
-    {
-        List<Project> result = generalInformationService.listProjects(sessionToken);
-        assertEquals(true, result.size() > 0);
-        String expectedSampleIdentifier = "/TESTGROUP/TESTPROJ";
-        for (Project project : result)
-        {
-            if (expectedSampleIdentifier.equals(project.toString()))
-            {
-                return;
-            }
-        }
-        fail("result didn't contain project " + expectedSampleIdentifier);
-    }
-
-    @Test
-    public void testSearchForSamples()
-    {
-        SearchCriteria sc = new SearchCriteria();
-        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "*"));
-        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(true, result.size() > 0);
-        String expectedSampleIdentifier = "/CISD/CL1";
-        for (Sample sample : result)
-        {
-            if (expectedSampleIdentifier.equals(sample.getIdentifier()))
-            {
-                return;
-            }
-        }
-        fail("result didn't contain sample " + expectedSampleIdentifier);
-    }
-
-    @Test(dependsOnMethods = "testSearchForSamples")
-    public void testSearchForSamplesWithNoCriterion()
-    {
-        SearchCriteria sc = new SearchCriteria();
-        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "*"));
-        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
-
-        // if no criterion was specified all samples should be returned as well
-        SearchCriteria scWithNoCriterion = new SearchCriteria();
-        List<Sample> resultWithNoCriterion =
-                generalInformationService.searchForSamples(sessionToken, scWithNoCriterion);
-        assertEquals(result, resultWithNoCriterion);
-    }
-
-    @Test
-    public void testSearchForSamplesByProperty()
-    {
-        // Search for Samples first
-        SearchCriteria sc = new SearchCriteria();
-        sc.addMatchClause(MatchClause.createPropertyMatch("ORGANISM", "HUMAN"));
-        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(1, result.size());
-    }
-
-    @Test
-    public void testSearchForSamplesByExperimentCode()
-    {
-        // Search for Samples with only experiment's code limiting the results
-        SearchCriteria sc = new SearchCriteria();
-        SearchCriteria ec = new SearchCriteria();
-        ec.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "EXP-TEST-1"));
-        sc.addSubCriteria(SearchSubCriteria.createExperimentCriteria(ec));
-        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(1, result.size());
-        assertEquals("/CISD/NEMO/EXP-TEST-1", result.get(0).getExperimentIdentifierOrNull());
-    }
-
-    @Test
-    public void testSearchForSamplesByExperimentProperty()
-    {
-        // Search for Samples with only experiment's property limiting the results
-        SearchCriteria sc = new SearchCriteria();
-        SearchCriteria ec = new SearchCriteria();
-        ec.addMatchClause(MatchClause.createPropertyMatch("DESCRIPTION", "A simple experiment"));
-        sc.addSubCriteria(SearchSubCriteria.createExperimentCriteria(ec));
-        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(2, result.size());
-    }
-
-    @Test
-    public void testSearchForSamplesByParentCode()
-    {
-        // Search for Samples with only parent's code limiting the results
-        SearchCriteria sc = new SearchCriteria();
-        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "*"));
-        SearchCriteria pc = new SearchCriteria();
-        pc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "MP002-1"));
-        sc.addSubCriteria(SearchSubCriteria.createSampleParentCriteria(pc));
-        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(2, result.size());
-    }
-
-    @Test
-    public void testSearchForSamplesByChildCode()
-    {
-        // Search for Samples with only child's code limiting the results
-        SearchCriteria sc = new SearchCriteria();
-        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "*"));
-        SearchCriteria cc = new SearchCriteria();
-        cc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "3VCP*"));
-        sc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(cc));
-        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(2, result.size());
-    }
-
-    @Test
-    public void testSearchForSamplesByContainerCode()
-    {
-        // Search for Samples with only container's code limiting the results
-        SearchCriteria sc = new SearchCriteria();
-        SearchCriteria cc = new SearchCriteria();
-        cc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "CL1"));
-        sc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(cc));
-        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(2, result.size());
-        for (Sample s : result)
-        {
-            assertTrue(s.getCode() + "doesn't start with 'CL1:'", s.getCode().startsWith("CL1:"));
-        }
-    }
-
-    @Test
-    public void testSearchForSamplesByExperimentAndParentCode()
-    {
-        // Search for Samples first
-        SearchCriteria sc = new SearchCriteria();
-        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(true, result.size() > 600);
-        // Add experiment criteria limiting results to 7
-        SearchCriteria ec = new SearchCriteria();
-        ec.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "EXP-REUSE"));
-        sc.addSubCriteria(SearchSubCriteria.createExperimentCriteria(ec));
-        List<Sample> result2 = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(7, result2.size());
-        // Add parent criteria limiting results to only 2
-        SearchCriteria pc = new SearchCriteria();
-        pc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "DP1-A"));
-        sc.addSubCriteria(SearchSubCriteria.createSampleParentCriteria(pc));
-        List<Sample> result3 = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(2, result3.size());
-    }
-
-    @Test
-    public void testListDataSetsForAllSamples()
-    {
-        // Search for Samples first
-        SearchCriteria sc = new SearchCriteria();
-        List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc);
-        List<DataSet> result = generalInformationService.listDataSets(sessionToken, samples);
-        assertEquals(true, result.size() > 0);
-    }
-
-    @Test
-    public void testListDataSetsWithParentsForAllSamples()
-    {
-        // Search for Samples first
-        SearchCriteria sc = new SearchCriteria();
-        List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc);
-        List<DataSet> result =
-                generalInformationService.listDataSets(sessionToken, samples,
-                        EnumSet.of(Connections.PARENTS));
-        assertEquals(true, result.size() > 0);
-        // See if some sample has parents
-        boolean parentCodesFound = false;
-        for (DataSet dataSet : result)
-        {
-            if (false == dataSet.getParentCodes().isEmpty())
-            {
-                parentCodesFound = true;
-                break;
-            }
-        }
-
-        assertTrue("No parent codes should have been found", (false == parentCodesFound));
-    }
-
-    @Test
-    public void testListDataSetsForSample()
-    {
-        // Search for Samples first
-        SearchCriteria sc = new SearchCriteria();
-        sc.addMatchClause(MatchClause.createPropertyMatch("ORGANISM", "HUMAN"));
-        List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc);
-        List<DataSet> result =
-                generalInformationService.listDataSetsForSample(sessionToken, samples.get(0), true);
-        assertEquals(true, result.size() > 0);
-    }
-
-    @Test
-    public void testListDataSetsForEmptySampleList()
-    {
-        List<Sample> samples = new ArrayList<Sample>();
-        List<DataSet> result = generalInformationService.listDataSets(sessionToken, samples);
-        assertEquals(true, result.size() == 0);
-    }
-
-    private static final String DEFAULT_PLATE_GEOMETRY_VALUE = "384_WELLS_16X24";
-
-    @Test
-    public void testSearchForDataSetsByProperty()
-    {
-        // Search for Samples first
-        SearchCriteria sc = new SearchCriteria();
-        sc.addMatchClause(MatchClause.createPropertyMatch("$PLATE_GEOMETRY",
-                DEFAULT_PLATE_GEOMETRY_VALUE));
-        List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc);
-        assertEquals(true, samples.size() > 0);
-        List<DataSet> result = generalInformationService.listDataSets(sessionToken, samples);
-        assertEquals(true, result.size() == 0);
-    }
-
-    private void checkSpace(String expectedCode, String expectedProjects, String expectedRoles,
-            SpaceWithProjectsAndRoleAssignments space)
-    {
-        assertEquals(expectedCode, space.getCode());
-        List<Project> projects = space.getProjects();
-        Collections.sort(projects, new Comparator<Project>()
-            {
-                public int compare(Project p1, Project p2)
-                {
-                    return p1.getCode().compareTo(p2.getCode());
-                }
-            });
-        assertEquals(expectedProjects, projects.toString());
-        List<Role> roles = new ArrayList<Role>(space.getRoles("test"));
-        Collections.sort(roles, new Comparator<Role>()
-            {
-                public int compare(Role r1, Role r2)
-                {
-                    return r1.toString().compareTo(r2.toString());
-                }
-            });
-        assertEquals(expectedRoles, roles.toString());
-    }
-
-    @Test
-    public void testListExperiments()
-    {
-        List<SpaceWithProjectsAndRoleAssignments> spaces =
-                generalInformationService.listSpacesWithProjectsAndRoleAssignments(sessionToken,
-                        null);
-        ArrayList<Project> projects = new ArrayList<Project>();
-        for (SpaceWithProjectsAndRoleAssignments space : spaces)
-        {
-            projects.addAll(space.getProjects());
-        }
-        List<Experiment> result =
-                generalInformationService.listExperiments(sessionToken, projects, "SIRNA_HCS");
-        assertEquals(true, result.size() > 0);
-        Experiment resultExperiment = result.get(0);
-        boolean identifierIsOk = "/CISD/DEFAULT/EXP-REUSE".equals(resultExperiment.getIdentifier());
-        identifierIsOk |= "/CISD/NEMO/EXP-TEST-2".equals(resultExperiment.getIdentifier());
-        assertEquals("Experiment should be: " + resultExperiment.getIdentifier(), true,
-                identifierIsOk);
-    }
-
-    @Test
-    public void testListExperimentsByIdentifier()
-    {
-        List<SpaceWithProjectsAndRoleAssignments> spaces =
-                generalInformationService.listSpacesWithProjectsAndRoleAssignments(sessionToken,
-                        null);
-        ArrayList<Project> projects = new ArrayList<Project>();
-        for (SpaceWithProjectsAndRoleAssignments space : spaces)
-        {
-            projects.addAll(space.getProjects());
-        }
-        List<Experiment> experimentsByProject =
-                generalInformationService.listExperiments(sessionToken, projects, "SIRNA_HCS");
-        assertEquals(true, experimentsByProject.size() > 0);
-
-        List<String> experimentIdentifiers = new ArrayList<String>();
-        for (Experiment exp : experimentsByProject)
-        {
-            experimentIdentifiers.add(exp.getIdentifier());
-        }
-
-        List<Experiment> results =
-                generalInformationService.listExperiments(sessionToken, experimentIdentifiers);
-        Comparator<Experiment> experimentCompare = new Comparator<Experiment>()
-            {
-
-                public int compare(Experiment o1, Experiment o2)
-                {
-                    return o1.getIdentifier().compareTo(o2.getIdentifier());
-                }
-            };
-        Collections.sort(experimentsByProject, experimentCompare);
-        Collections.sort(results, experimentCompare);
-        assertEquals(experimentsByProject, results);
-    }
-
-    @Test
-    public void testListDataSetTypes()
-    {
-        List<DataSetType> dataSetTypes = generalInformationService.listDataSetTypes(sessionToken);
-        assertEquals(4, dataSetTypes.size());
-
-        Collections.sort(dataSetTypes, new ToStringComparator());
-        DataSetType dataSetType = dataSetTypes.get(1);
-        assertEquals("HCS_IMAGE", dataSetType.getCode());
-
-        List<PropertyTypeGroup> propertyTypeGroups = dataSetType.getPropertyTypeGroups();
-        assertEquals(1, propertyTypeGroups.size());
-
-        PropertyTypeGroup propertyTypeGroup = propertyTypeGroups.get(0);
-        assertEquals(null, propertyTypeGroup.getName());
-
-        List<PropertyType> propertyTypes = propertyTypeGroup.getPropertyTypes();
-        assertEquals(4, propertyTypes.size());
-
-        PropertyType propertyType;
-        propertyType = propertyTypes.get(0);
-        assertEquals("COMMENT", propertyType.getCode());
-        assertEquals("Comment", propertyType.getLabel());
-        assertEquals("Any other comments", propertyType.getDescription());
-
-        propertyType = propertyTypes.get(1);
-        assertEquals("ANY_MATERIAL", propertyType.getCode());
-        assertEquals("any_material", propertyType.getLabel());
-        assertEquals("any_material", propertyType.getDescription());
-    }
-
-    @Test
-    public void testSearchForDataSetsByCode()
-    {
-        SearchCriteria sc = new SearchCriteria();
-        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "*"));
-        List<DataSet> result = generalInformationService.searchForDataSets(sessionToken, sc);
-        assertTrue(result.size() > 0);
-        String expectedDataSetCode = "20081105092159188-3";
-        for (DataSet dataSet : result)
-        {
-            if (expectedDataSetCode.equals(dataSet.getCode()))
-            {
-                return;
-            }
-        }
-        fail("result didn't contain data set" + expectedDataSetCode);
-    }
-
-    @Test
-    public void testSearchForDataSetsByExperiments()
-    {
-        SearchCriteria searchCriteria = new SearchCriteria();
-        SearchCriteria expCriteria = new SearchCriteria();
-        expCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
-                "EXP-TEST-1"));
-        searchCriteria.addSubCriteria(SearchSubCriteria.createExperimentCriteria(expCriteria));
-        List<DataSet> result =
-                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
-        assertEquals(1, result.size());
-
-        DataSet dataSet = result.get(0);
-        assertEquals("20081105092159111-1", dataSet.getCode());
-        assertEquals("/CISD/NEMO/EXP-TEST-1", dataSet.getExperimentIdentifier());
-
-    }
-
-    @Test
-    public void testSearchForDataSetsBySamples()
-    {
-        SearchCriteria searchCriteria = new SearchCriteria();
-        SearchCriteria sampleCriteria = new SearchCriteria();
-        sampleCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
-                "CP-TEST-1"));
-        searchCriteria.addSubCriteria(SearchSubCriteria.createSampleCriteria(sampleCriteria));
-        List<DataSet> result =
-                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
-        assertEquals(1, result.size());
-
-        DataSet dataSet = result.get(0);
-        assertEquals("20081105092159111-1", dataSet.getCode());
-        assertEquals("/CISD/NEMO/EXP-TEST-1", dataSet.getExperimentIdentifier());
-        assertEquals("/CISD/CP-TEST-1", dataSet.getSampleIdentifierOrNull());
-    }
-
-    @Test
-    public void testSearchForDataSetsByParent()
-    {
-        SearchCriteria searchCriteria = new SearchCriteria();
-
-        SearchCriteria parentCriteria = new SearchCriteria();
-        parentCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
-                "20081105092159333-3"));
-        searchCriteria
-                .addSubCriteria(SearchSubCriteria.createDataSetParentCriteria(parentCriteria));
-
-        List<DataSet> result =
-                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
-
-        assertEquals(2, result.size());
-        assertEquals(
-                "[DataSet[20081105092259000-8,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=no comment}], "
-                        + "DataSet[20081105092259000-9,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=no comment}]]",
-                result.toString());
-    }
-
-    @Test
-    public void testSearchForDataSetsByChild()
-    {
-        SearchCriteria searchCriteria = new SearchCriteria();
-        SearchCriteria childCriteria = new SearchCriteria();
-        childCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
-                "20081105092259000-9"));
-        searchCriteria.addSubCriteria(SearchSubCriteria.createDataSetChildCriteria(childCriteria));
-
-        List<DataSet> result =
-                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
-        assertEquals(3, result.size());
-        assertEquals(
-                "[DataSet[20081105092159111-1,/CISD/NEMO/EXP-TEST-1,/CISD/CP-TEST-1,HCS_IMAGE,{ANY_MATERIAL=null, BACTERIUM=null, COMMENT=no comment, GENDER=null}], "
-                        + "DataSet[20081105092159222-2,/CISD/NOE/EXP-TEST-2,/CISD/CP-TEST-2,HCS_IMAGE,{COMMENT=no comment}], "
-                        + "DataSet[20081105092159333-3,/CISD/NEMO/EXP-TEST-2,/CISD/CP-TEST-3,HCS_IMAGE,{COMMENT=no comment}]]",
-                result.toString());
-    }
-
-    @Test
-    public void testSearchForDataSetsByParentAndChild()
-    {
-        SearchCriteria searchCriteria = new SearchCriteria();
-
-        SearchCriteria parentCriteria = new SearchCriteria();
-        parentCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
-                "20081105092159333-3"));
-        searchCriteria
-                .addSubCriteria(SearchSubCriteria.createDataSetParentCriteria(parentCriteria));
-
-        SearchCriteria childCriteria = new SearchCriteria();
-        childCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
-                "20081105092259900-1"));
-        searchCriteria.addSubCriteria(SearchSubCriteria.createDataSetChildCriteria(childCriteria));
-
-        List<DataSet> result =
-                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
-        assertEquals(1, result.size());
-        assertEquals(
-                "[DataSet[20081105092259000-9,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=no comment}]]",
-                result.toString());
-    }
-
-    @Test
-    public void testSearchForDataSetsByContainer()
-    {
-        SearchCriteria searchCriteria = new SearchCriteria();
-        SearchCriteria containerCriteria = new SearchCriteria();
-
-        containerCriteria.addMatchClause(MatchClause.createAttributeMatch(
-                MatchClauseAttribute.CODE, "20110509092359990-10"));
-        searchCriteria.addSubCriteria(SearchSubCriteria
-                .createDataSetContainerCriteria(containerCriteria));
-
-        List<DataSet> result =
-                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
-        assertEquals(2, result.size());
-        assertEquals(
-                "[DataSet[20110509092359990-11,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=non-virtual comment}], "
-                        + "DataSet[20110509092359990-12,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=non-virtual comment}]]",
-                result.toString());
-    }
-
-}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceHttpInvokerApiTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceHttpInvokerApiTest.java
index 103b9669a08352b223fbafc696240199f1c7b55e..8d5978855a2c8bb86a20b9e4ced971710629f8de 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceHttpInvokerApiTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceHttpInvokerApiTest.java
@@ -25,9 +25,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Factory;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.api.client.ServiceFinder;
@@ -42,8 +39,6 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
-import ch.systemsx.cisd.openbis.remoteapitest.RemoteApiTestCase;
-import ch.systemsx.cisd.openbis.remoteapitest.api.v1.GeneralInformationServiceAbstractTestCases.IGeneralInformationServiceFactory;
 
 /**
  * Verifies that an instance of {@link IGeneralInformationService} is published via
@@ -53,64 +48,52 @@ import ch.systemsx.cisd.openbis.remoteapitest.api.v1.GeneralInformationServiceAb
  */
 @Test(groups =
     { "remote api" })
-public class GeneralInformationServiceHttpInvokerApiTest extends RemoteApiTestCase implements
-        IGeneralInformationServiceFactory
+public class GeneralInformationServiceHttpInvokerApiTest extends
+        GeneralInformationServiceJsonApiTest
 {
 
     private static final String SERVICE_URL = "http://localhost:8888/";
 
-    private IGeneralInformationService service;
-
-    private String sessionToken;
-
-    @BeforeMethod
-    public void beforeMethod()
-    {
-        service = createService();
-        sessionToken = service.tryToAuthenticateForAllServices("test", "a");
-    }
-
-    @AfterMethod
-    public void afterMethod()
+    @Override
+    protected IGeneralInformationService createService()
     {
-        service.logout(sessionToken);
-    }
-
-    @Factory
-    public Object[] createTestCases()
-    {
-        return new Object[]
-            { new GeneralInformationServiceAbstractTestCases(this) };
+        ServiceFinder generalInformationServiceFinder =
+                new ServiceFinder("openbis", IGeneralInformationService.SERVICE_URL);
+        return generalInformationServiceFinder.createService(IGeneralInformationService.class,
+                SERVICE_URL, 5000);
     }
 
     @Test
     public void testRegistrationDetailsAvailable()
     {
         // project
-        List<Project> projects = service.listProjects(sessionToken);
+        List<Project> projects = generalInformationService.listProjects(sessionToken);
         assertTrue(projects.size() > 0);
         checkRegistrationDetails(projects.get(0).getRegistrationDetails());
 
         // experiment
-        List<Experiment> experiments = service.listExperiments(sessionToken, projects, "SIRNA_HCS");
+        List<Experiment> experiments =
+                generalInformationService.listExperiments(sessionToken, projects, "SIRNA_HCS");
         assertTrue(experiments.size() > 0);
         checkRegistrationDetails(experiments.get(0).getRegistrationDetails());
 
         // sample
         SearchCriteria sc = new SearchCriteria();
         sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "CP-TEST-1"));
-        List<Sample> samples = service.searchForSamples(sessionToken, sc);
+        List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc);
         assertTrue(samples.size() > 0);
         Sample sample = samples.get(0);
         checkRegistrationDetails(sample.getRegistrationDetails());
 
         // data set
-        List<DataSet> dataSets = service.listDataSetsForSample(sessionToken, sample, false);
+        List<DataSet> dataSets =
+                generalInformationService.listDataSetsForSample(sessionToken, sample, false);
         assertTrue(dataSets.size() > 0);
         assertNotNull(dataSets.get(0).getRegistrationDetails().getRegistrationDate());
 
         // vocabularies
-        Map<Vocabulary, List<VocabularyTerm>> termMap = service.getVocabularyTermsMap(sessionToken);
+        Map<Vocabulary, List<VocabularyTerm>> termMap =
+                generalInformationService.getVocabularyTermsMap(sessionToken);
         ArrayList<Vocabulary> vocabs = new ArrayList<Vocabulary>(termMap.keySet().size());
         vocabs.addAll(termMap.keySet());
         List<VocabularyTerm> terms = termMap.get(vocabs.get(0));
@@ -130,11 +113,4 @@ public class GeneralInformationServiceHttpInvokerApiTest extends RemoteApiTestCa
 
     }
 
-    public IGeneralInformationService createService()
-    {
-        ServiceFinder generalInformationServiceFinder =
-                new ServiceFinder("openbis", IGeneralInformationService.SERVICE_URL);
-        return generalInformationServiceFinder.createService(IGeneralInformationService.class,
-                SERVICE_URL, 5000);
-    }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
index 1a18f404b5acd0a0c03aaa9d428511c52ffe6d82..3a3f6e5e2e962f2a77a6ca4ba1d7e6402e1d8c16 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
@@ -16,18 +16,44 @@
 
 package ch.systemsx.cisd.openbis.remoteapitest.api.v1;
 
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.AssertJUnit.fail;
+
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
-import org.testng.annotations.Factory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.googlecode.jsonrpc4j.JsonRpcHttpClient;
 import com.googlecode.jsonrpc4j.ProxyUtil;
 
+import ch.systemsx.cisd.common.utilities.ToStringComparator;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyType;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyTypeGroup;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Role;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SpaceWithProjectsAndRoleAssignments;
 import ch.systemsx.cisd.openbis.remoteapitest.RemoteApiTestCase;
-import ch.systemsx.cisd.openbis.remoteapitest.api.v1.GeneralInformationServiceAbstractTestCases.IGeneralInformationServiceFactory;
 
 /**
  * Verifies that an instance of {@link IGeneralInformationService} is published via JSON-RPC and
@@ -37,20 +63,16 @@ import ch.systemsx.cisd.openbis.remoteapitest.api.v1.GeneralInformationServiceAb
  */
 @Test(groups =
     { "remote api" })
-public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase implements
-        IGeneralInformationServiceFactory
+public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase
 {
     private static final String SERVICE_URL = "http://localhost:8888/openbis/"
             + IGeneralInformationService.JSON_SERVICE_URL;
 
-    @Factory
-    public Object[] createTestCases()
-    {
-        return new Object[]
-            { new GeneralInformationServiceAbstractTestCases(this) };
-    }
+    protected IGeneralInformationService generalInformationService;
 
-    public IGeneralInformationService createService()
+    protected String sessionToken;
+
+    protected IGeneralInformationService createService()
     {
         try
         {
@@ -64,4 +86,514 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase impl
         }
     }
 
+    @BeforeMethod
+    public void beforeMethod() throws MalformedURLException
+    {
+        generalInformationService = createService();
+        sessionToken = generalInformationService.tryToAuthenticateForAllServices("test", "a");
+    }
+
+    @AfterMethod
+    public void afterMethod() throws MalformedURLException
+    {
+        generalInformationService.logout(sessionToken);
+    }
+
+    @Test
+    public void testListNamedRoleSets()
+    {
+        Map<String, Set<Role>> namedRoleSets =
+                generalInformationService.listNamedRoleSets(sessionToken);
+
+        assertEquals("[ADMIN(instance), ADMIN(space)]", namedRoleSets.get("SPACE_ADMIN").toString());
+    }
+
+    @Test
+    public void testListSpacesWithProjectsAndRoleAssignments()
+    {
+        List<SpaceWithProjectsAndRoleAssignments> spaces =
+                generalInformationService.listSpacesWithProjectsAndRoleAssignments(sessionToken,
+                        null);
+
+        Collections.sort(spaces, new Comparator<SpaceWithProjectsAndRoleAssignments>()
+            {
+                public int compare(SpaceWithProjectsAndRoleAssignments s1,
+                        SpaceWithProjectsAndRoleAssignments s2)
+                {
+                    return s1.getCode().compareTo(s2.getCode());
+                }
+            });
+        checkSpace("CISD", "[/CISD/DEFAULT, /CISD/NEMO, /CISD/NOE]",
+                "[ADMIN(instance), ADMIN(space), ETL_SERVER(instance), ETL_SERVER(space)]",
+                spaces.get(0));
+        checkSpace("TESTGROUP", "[/TESTGROUP/TESTPROJ]",
+                "[ADMIN(instance), ADMIN(space), ETL_SERVER(instance)]", spaces.get(1));
+        assertEquals(2, spaces.size());
+    }
+
+    @Test
+    public void testListProjects()
+    {
+        List<Project> result = generalInformationService.listProjects(sessionToken);
+        assertEquals(true, result.size() > 0);
+        String expectedSampleIdentifier = "/TESTGROUP/TESTPROJ";
+        for (Project project : result)
+        {
+            if (expectedSampleIdentifier.equals(project.toString()))
+            {
+                return;
+            }
+        }
+        fail("result didn't contain project " + expectedSampleIdentifier);
+    }
+
+    @Test
+    public void testSearchForSamples()
+    {
+        SearchCriteria sc = new SearchCriteria();
+        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "*"));
+        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(true, result.size() > 0);
+        String expectedSampleIdentifier = "/CISD/CL1";
+        for (Sample sample : result)
+        {
+            if (expectedSampleIdentifier.equals(sample.getIdentifier()))
+            {
+                return;
+            }
+        }
+        fail("result didn't contain sample " + expectedSampleIdentifier);
+    }
+
+    @Test(dependsOnMethods = "testSearchForSamples")
+    public void testSearchForSamplesWithNoCriterion()
+    {
+        SearchCriteria sc = new SearchCriteria();
+        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "*"));
+        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
+
+        // if no criterion was specified all samples should be returned as well
+        SearchCriteria scWithNoCriterion = new SearchCriteria();
+        List<Sample> resultWithNoCriterion =
+                generalInformationService.searchForSamples(sessionToken, scWithNoCriterion);
+        assertEquals(result, resultWithNoCriterion);
+    }
+
+    @Test
+    public void testSearchForSamplesByProperty()
+    {
+        // Search for Samples first
+        SearchCriteria sc = new SearchCriteria();
+        sc.addMatchClause(MatchClause.createPropertyMatch("ORGANISM", "HUMAN"));
+        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(1, result.size());
+    }
+
+    @Test
+    public void testSearchForSamplesByExperimentCode()
+    {
+        // Search for Samples with only experiment's code limiting the results
+        SearchCriteria sc = new SearchCriteria();
+        SearchCriteria ec = new SearchCriteria();
+        ec.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "EXP-TEST-1"));
+        sc.addSubCriteria(SearchSubCriteria.createExperimentCriteria(ec));
+        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(1, result.size());
+        assertEquals("/CISD/NEMO/EXP-TEST-1", result.get(0).getExperimentIdentifierOrNull());
+    }
+
+    @Test
+    public void testSearchForSamplesByExperimentProperty()
+    {
+        // Search for Samples with only experiment's property limiting the results
+        SearchCriteria sc = new SearchCriteria();
+        SearchCriteria ec = new SearchCriteria();
+        ec.addMatchClause(MatchClause.createPropertyMatch("DESCRIPTION", "A simple experiment"));
+        sc.addSubCriteria(SearchSubCriteria.createExperimentCriteria(ec));
+        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(2, result.size());
+    }
+
+    @Test
+    public void testSearchForSamplesByParentCode()
+    {
+        // Search for Samples with only parent's code limiting the results
+        SearchCriteria sc = new SearchCriteria();
+        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "*"));
+        SearchCriteria pc = new SearchCriteria();
+        pc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "MP002-1"));
+        sc.addSubCriteria(SearchSubCriteria.createSampleParentCriteria(pc));
+        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(2, result.size());
+    }
+
+    @Test
+    public void testSearchForSamplesByChildCode()
+    {
+        // Search for Samples with only child's code limiting the results
+        SearchCriteria sc = new SearchCriteria();
+        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "*"));
+        SearchCriteria cc = new SearchCriteria();
+        cc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "3VCP*"));
+        sc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(cc));
+        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(2, result.size());
+    }
+
+    @Test
+    public void testSearchForSamplesByContainerCode()
+    {
+        // Search for Samples with only container's code limiting the results
+        SearchCriteria sc = new SearchCriteria();
+        SearchCriteria cc = new SearchCriteria();
+        cc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "CL1"));
+        sc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(cc));
+        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(2, result.size());
+        for (Sample s : result)
+        {
+            assertTrue(s.getCode() + "doesn't start with 'CL1:'", s.getCode().startsWith("CL1:"));
+        }
+    }
+
+    @Test
+    public void testSearchForSamplesByExperimentAndParentCode()
+    {
+        // Search for Samples first
+        SearchCriteria sc = new SearchCriteria();
+        List<Sample> result = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(true, result.size() > 600);
+        // Add experiment criteria limiting results to 7
+        SearchCriteria ec = new SearchCriteria();
+        ec.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "EXP-REUSE"));
+        sc.addSubCriteria(SearchSubCriteria.createExperimentCriteria(ec));
+        List<Sample> result2 = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(7, result2.size());
+        // Add parent criteria limiting results to only 2
+        SearchCriteria pc = new SearchCriteria();
+        pc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "DP1-A"));
+        sc.addSubCriteria(SearchSubCriteria.createSampleParentCriteria(pc));
+        List<Sample> result3 = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(2, result3.size());
+    }
+
+    @Test
+    public void testListDataSetsForAllSamples()
+    {
+        // Search for Samples first
+        SearchCriteria sc = new SearchCriteria();
+        List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc);
+        List<DataSet> result = generalInformationService.listDataSets(sessionToken, samples);
+        assertEquals(true, result.size() > 0);
+    }
+
+    @Test
+    public void testListDataSetsWithParentsForAllSamples()
+    {
+        // Search for Samples first
+        SearchCriteria sc = new SearchCriteria();
+        List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc);
+        List<DataSet> result =
+                generalInformationService.listDataSets(sessionToken, samples,
+                        EnumSet.of(Connections.PARENTS));
+        assertEquals(true, result.size() > 0);
+        // See if some sample has parents
+        boolean parentCodesFound = false;
+        for (DataSet dataSet : result)
+        {
+            if (false == dataSet.getParentCodes().isEmpty())
+            {
+                parentCodesFound = true;
+                break;
+            }
+        }
+
+        assertTrue("No parent codes should have been found", (false == parentCodesFound));
+    }
+
+    @Test
+    public void testListDataSetsForSample()
+    {
+        // Search for Samples first
+        SearchCriteria sc = new SearchCriteria();
+        sc.addMatchClause(MatchClause.createPropertyMatch("ORGANISM", "HUMAN"));
+        List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc);
+        List<DataSet> result =
+                generalInformationService.listDataSetsForSample(sessionToken, samples.get(0), true);
+        assertEquals(true, result.size() > 0);
+    }
+
+    @Test
+    public void testListDataSetsForEmptySampleList()
+    {
+        List<Sample> samples = new ArrayList<Sample>();
+        List<DataSet> result = generalInformationService.listDataSets(sessionToken, samples);
+        assertEquals(true, result.size() == 0);
+    }
+
+    private static final String DEFAULT_PLATE_GEOMETRY_VALUE = "384_WELLS_16X24";
+
+    @Test
+    public void testSearchForDataSetsByProperty()
+    {
+        // Search for Samples first
+        SearchCriteria sc = new SearchCriteria();
+        sc.addMatchClause(MatchClause.createPropertyMatch("$PLATE_GEOMETRY",
+                DEFAULT_PLATE_GEOMETRY_VALUE));
+        List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc);
+        assertEquals(true, samples.size() > 0);
+        List<DataSet> result = generalInformationService.listDataSets(sessionToken, samples);
+        assertEquals(true, result.size() == 0);
+    }
+
+    private void checkSpace(String expectedCode, String expectedProjects, String expectedRoles,
+            SpaceWithProjectsAndRoleAssignments space)
+    {
+        assertEquals(expectedCode, space.getCode());
+        List<Project> projects = space.getProjects();
+        Collections.sort(projects, new Comparator<Project>()
+            {
+                public int compare(Project p1, Project p2)
+                {
+                    return p1.getCode().compareTo(p2.getCode());
+                }
+            });
+        assertEquals(expectedProjects, projects.toString());
+        List<Role> roles = new ArrayList<Role>(space.getRoles("test"));
+        Collections.sort(roles, new Comparator<Role>()
+            {
+                public int compare(Role r1, Role r2)
+                {
+                    return r1.toString().compareTo(r2.toString());
+                }
+            });
+        assertEquals(expectedRoles, roles.toString());
+    }
+
+    @Test
+    public void testListExperiments()
+    {
+        List<SpaceWithProjectsAndRoleAssignments> spaces =
+                generalInformationService.listSpacesWithProjectsAndRoleAssignments(sessionToken,
+                        null);
+        ArrayList<Project> projects = new ArrayList<Project>();
+        for (SpaceWithProjectsAndRoleAssignments space : spaces)
+        {
+            projects.addAll(space.getProjects());
+        }
+        List<Experiment> result =
+                generalInformationService.listExperiments(sessionToken, projects, "SIRNA_HCS");
+        assertEquals(true, result.size() > 0);
+        Experiment resultExperiment = result.get(0);
+        boolean identifierIsOk = "/CISD/DEFAULT/EXP-REUSE".equals(resultExperiment.getIdentifier());
+        identifierIsOk |= "/CISD/NEMO/EXP-TEST-2".equals(resultExperiment.getIdentifier());
+        assertEquals("Experiment should be: " + resultExperiment.getIdentifier(), true,
+                identifierIsOk);
+    }
+
+    @Test
+    public void testListExperimentsByIdentifier()
+    {
+        List<SpaceWithProjectsAndRoleAssignments> spaces =
+                generalInformationService.listSpacesWithProjectsAndRoleAssignments(sessionToken,
+                        null);
+        ArrayList<Project> projects = new ArrayList<Project>();
+        for (SpaceWithProjectsAndRoleAssignments space : spaces)
+        {
+            projects.addAll(space.getProjects());
+        }
+        List<Experiment> experimentsByProject =
+                generalInformationService.listExperiments(sessionToken, projects, "SIRNA_HCS");
+        assertEquals(true, experimentsByProject.size() > 0);
+
+        List<String> experimentIdentifiers = new ArrayList<String>();
+        for (Experiment exp : experimentsByProject)
+        {
+            experimentIdentifiers.add(exp.getIdentifier());
+        }
+
+        List<Experiment> results =
+                generalInformationService.listExperiments(sessionToken, experimentIdentifiers);
+        Comparator<Experiment> experimentCompare = new Comparator<Experiment>()
+            {
+
+                public int compare(Experiment o1, Experiment o2)
+                {
+                    return o1.getIdentifier().compareTo(o2.getIdentifier());
+                }
+            };
+        Collections.sort(experimentsByProject, experimentCompare);
+        Collections.sort(results, experimentCompare);
+        assertEquals(experimentsByProject, results);
+    }
+
+    @Test
+    public void testListDataSetTypes()
+    {
+        List<DataSetType> dataSetTypes = generalInformationService.listDataSetTypes(sessionToken);
+        assertEquals(4, dataSetTypes.size());
+
+        Collections.sort(dataSetTypes, new ToStringComparator());
+        DataSetType dataSetType = dataSetTypes.get(1);
+        assertEquals("HCS_IMAGE", dataSetType.getCode());
+
+        List<PropertyTypeGroup> propertyTypeGroups = dataSetType.getPropertyTypeGroups();
+        assertEquals(1, propertyTypeGroups.size());
+
+        PropertyTypeGroup propertyTypeGroup = propertyTypeGroups.get(0);
+        assertEquals(null, propertyTypeGroup.getName());
+
+        List<PropertyType> propertyTypes = propertyTypeGroup.getPropertyTypes();
+        assertEquals(4, propertyTypes.size());
+
+        PropertyType propertyType;
+        propertyType = propertyTypes.get(0);
+        assertEquals("COMMENT", propertyType.getCode());
+        assertEquals("Comment", propertyType.getLabel());
+        assertEquals("Any other comments", propertyType.getDescription());
+
+        propertyType = propertyTypes.get(1);
+        assertEquals("ANY_MATERIAL", propertyType.getCode());
+        assertEquals("any_material", propertyType.getLabel());
+        assertEquals("any_material", propertyType.getDescription());
+    }
+
+    @Test
+    public void testSearchForDataSetsByCode()
+    {
+        SearchCriteria sc = new SearchCriteria();
+        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "*"));
+        List<DataSet> result = generalInformationService.searchForDataSets(sessionToken, sc);
+        assertTrue(result.size() > 0);
+        String expectedDataSetCode = "20081105092159188-3";
+        for (DataSet dataSet : result)
+        {
+            if (expectedDataSetCode.equals(dataSet.getCode()))
+            {
+                return;
+            }
+        }
+        fail("result didn't contain data set" + expectedDataSetCode);
+    }
+
+    @Test
+    public void testSearchForDataSetsByExperiments()
+    {
+        SearchCriteria searchCriteria = new SearchCriteria();
+        SearchCriteria expCriteria = new SearchCriteria();
+        expCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
+                "EXP-TEST-1"));
+        searchCriteria.addSubCriteria(SearchSubCriteria.createExperimentCriteria(expCriteria));
+        List<DataSet> result =
+                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
+        assertEquals(1, result.size());
+
+        DataSet dataSet = result.get(0);
+        assertEquals("20081105092159111-1", dataSet.getCode());
+        assertEquals("/CISD/NEMO/EXP-TEST-1", dataSet.getExperimentIdentifier());
+
+    }
+
+    @Test
+    public void testSearchForDataSetsBySamples()
+    {
+        SearchCriteria searchCriteria = new SearchCriteria();
+        SearchCriteria sampleCriteria = new SearchCriteria();
+        sampleCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
+                "CP-TEST-1"));
+        searchCriteria.addSubCriteria(SearchSubCriteria.createSampleCriteria(sampleCriteria));
+        List<DataSet> result =
+                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
+        assertEquals(1, result.size());
+
+        DataSet dataSet = result.get(0);
+        assertEquals("20081105092159111-1", dataSet.getCode());
+        assertEquals("/CISD/NEMO/EXP-TEST-1", dataSet.getExperimentIdentifier());
+        assertEquals("/CISD/CP-TEST-1", dataSet.getSampleIdentifierOrNull());
+    }
+
+    @Test
+    public void testSearchForDataSetsByParent()
+    {
+        SearchCriteria searchCriteria = new SearchCriteria();
+
+        SearchCriteria parentCriteria = new SearchCriteria();
+        parentCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
+                "20081105092159333-3"));
+        searchCriteria
+                .addSubCriteria(SearchSubCriteria.createDataSetParentCriteria(parentCriteria));
+
+        List<DataSet> result =
+                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
+
+        assertEquals(2, result.size());
+        assertEquals(
+                "[DataSet[20081105092259000-8,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=no comment}], "
+                        + "DataSet[20081105092259000-9,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=no comment}]]",
+                result.toString());
+    }
+
+    @Test
+    public void testSearchForDataSetsByChild()
+    {
+        SearchCriteria searchCriteria = new SearchCriteria();
+        SearchCriteria childCriteria = new SearchCriteria();
+        childCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
+                "20081105092259000-9"));
+        searchCriteria.addSubCriteria(SearchSubCriteria.createDataSetChildCriteria(childCriteria));
+
+        List<DataSet> result =
+                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
+        assertEquals(3, result.size());
+        assertEquals(
+                "[DataSet[20081105092159111-1,/CISD/NEMO/EXP-TEST-1,/CISD/CP-TEST-1,HCS_IMAGE,{ANY_MATERIAL=null, BACTERIUM=null, COMMENT=no comment, GENDER=null}], "
+                        + "DataSet[20081105092159222-2,/CISD/NOE/EXP-TEST-2,/CISD/CP-TEST-2,HCS_IMAGE,{COMMENT=no comment}], "
+                        + "DataSet[20081105092159333-3,/CISD/NEMO/EXP-TEST-2,/CISD/CP-TEST-3,HCS_IMAGE,{COMMENT=no comment}]]",
+                result.toString());
+    }
+
+    @Test
+    public void testSearchForDataSetsByParentAndChild()
+    {
+        SearchCriteria searchCriteria = new SearchCriteria();
+
+        SearchCriteria parentCriteria = new SearchCriteria();
+        parentCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
+                "20081105092159333-3"));
+        searchCriteria
+                .addSubCriteria(SearchSubCriteria.createDataSetParentCriteria(parentCriteria));
+
+        SearchCriteria childCriteria = new SearchCriteria();
+        childCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
+                "20081105092259900-1"));
+        searchCriteria.addSubCriteria(SearchSubCriteria.createDataSetChildCriteria(childCriteria));
+
+        List<DataSet> result =
+                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
+        assertEquals(1, result.size());
+        assertEquals(
+                "[DataSet[20081105092259000-9,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=no comment}]]",
+                result.toString());
+    }
+
+    @Test
+    public void testSearchForDataSetsByContainer()
+    {
+        SearchCriteria searchCriteria = new SearchCriteria();
+        SearchCriteria containerCriteria = new SearchCriteria();
+
+        containerCriteria.addMatchClause(MatchClause.createAttributeMatch(
+                MatchClauseAttribute.CODE, "20110509092359990-10"));
+        searchCriteria.addSubCriteria(SearchSubCriteria
+                .createDataSetContainerCriteria(containerCriteria));
+
+        List<DataSet> result =
+                generalInformationService.searchForDataSets(sessionToken, searchCriteria);
+        assertEquals(2, result.size());
+        assertEquals(
+                "[DataSet[20110509092359990-11,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=non-virtual comment}], "
+                        + "DataSet[20110509092359990-12,/CISD/DEFAULT/EXP-REUSE,<null>,HCS_IMAGE,{COMMENT=non-virtual comment}]]",
+                result.toString());
+    }
+
 }