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 92992584d65eaa438f7ae47e16d712ae55df6141..77143e16fafbc0d499c9f867caeac0c5fe3c4c41 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
@@ -97,7 +97,6 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.HibernateSearchData
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.EncapsulatedCommonServer;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.MasterDataRegistrationScriptRunner;
 import ch.systemsx.cisd.openbis.generic.server.util.GroupIdentifierHelper;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.validator.ProjectValidator;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
@@ -526,30 +525,6 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         return ProjectTranslator.translate(projects);
     }
 
-    @Override
-    public final List<Project> listProjectsForUser(final String sessionToken, String userId)
-    {
-        checkSession(sessionToken);
-        final List<ProjectPE> allProjectPEs = getDAOFactory().getProjectDAO().listProjects();
-        // Have to sort the PEs because Project does not have a compare method
-        Collections.sort(allProjectPEs);
-        List<Project> allProjects = ProjectTranslator.translate(allProjectPEs);
-
-        PersonPE person = getDAOFactory().getPersonDAO().tryFindPersonByUserId(userId);
-        ProjectValidator validator = new ProjectValidator();
-
-        ArrayList<Project> projects = new ArrayList<Project>();
-        for (Project project : allProjects)
-        {
-            if (validator.doValidation(person, project))
-            {
-                projects.add(project);
-            }
-        }
-
-        return projects;
-    }
-
     @Override
     public final List<SampleType> listSampleTypes(final String sessionToken)
     {
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 ba4e554ecb00efc6672095dccf5b4a253e25cc44..22b95a2d566751a33a699c0d2a5876ea48cd140c 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
@@ -381,13 +381,6 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         return null;
     }
 
-    @Override
-    public List<Project> listProjectsForUser(String sessionToken, String userId)
-    {
-        logAccess(sessionToken, "list_projects_for_user", "USER_ID(%s)", userId);
-        return null;
-    }
-
     @Override
     public List<ExperimentType> listExperimentTypes(final String sessionToken)
     {
@@ -1438,4 +1431,5 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
                 edms.getCode());
 
     }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
index 417398e47c361099bf65ad0ceaad55ed88cde9ac..3548852c48d83b747e679237c5b5401d8ae4d354 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
@@ -181,7 +181,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = SimpleSpaceValidator.class)
-    @Capability("LIST_SPACES")
     public List<SpaceWithProjectsAndRoleAssignments> listSpacesWithProjectsAndRoleAssignments(
             String sessionToken, String databaseInstanceCodeOrNull)
     {
@@ -290,7 +289,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = SampleByIdentiferValidator.class)
-    @Capability("SEARCH_FOR_SAMPLES")
     public List<Sample> searchForSamples(String sessionToken, SearchCriteria searchCriteria)
     {
         return searchForSamples(sessionToken, searchCriteria,
@@ -301,14 +299,13 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = SampleByIdentiferValidator.class)
-    @Capability("SEARCH_FOR_SAMPLES")
     public List<Sample> searchForSamples(String sessionToken, SearchCriteria searchCriteria,
-            EnumSet<SampleFetchOption> fetchOption)
+            EnumSet<SampleFetchOption> fetchOptions)
     {
         Session session = getSession(sessionToken);
 
         EnumSet<SampleFetchOption> sampleFetchOptions =
-                (fetchOption != null) ? fetchOption : EnumSet.noneOf(SampleFetchOption.class);
+                (fetchOptions != null) ? fetchOptions : EnumSet.noneOf(SampleFetchOption.class);
         DetailedSearchCriteria detailedSearchCriteria =
                 SearchCriteriaToDetailedSearchCriteriaTranslator.convert(
                         SearchableEntityKind.SAMPLE, searchCriteria);
@@ -320,6 +317,31 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
         return createSampleLister().getSamples(sampleIDs, sampleFetchOptions);
     }
 
+    @Override
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
+    @Capability("SEARCH_ON_BEHALF_OF_USER")
+    public List<Sample> searchForSamplesOnBehalfOfUser(String sessionToken,
+            SearchCriteria searchCriteria,
+            EnumSet<SampleFetchOption> fetchOptions, String userId)
+    {
+        final List<Sample> unfilteredSamples =
+                searchForSamples(sessionToken, searchCriteria, fetchOptions);
+
+        // Filter for user
+        final PersonPE person = getDAOFactory().getPersonDAO().tryFindPersonByUserId(userId);
+        final SampleByIdentiferValidator validator = new SampleByIdentiferValidator();
+        final ArrayList<Sample> samples = new ArrayList<Sample>();
+        for (Sample sample : unfilteredSamples)
+        {
+            if (validator.doValidation(person, sample))
+            {
+                samples.add(sample);
+            }
+        }
+        return samples;
+    }
+
     protected ISampleLister createSampleLister()
     {
         return new SampleLister(getDAOFactory());
@@ -329,7 +351,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = SampleByIdentiferValidator.class)
-    @Capability("LIST_SAMPLES")
     public List<Sample> listSamplesForExperiment(String sessionToken,
             @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class)
             String experimentIdentifierString)
@@ -352,7 +373,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = DataSetByExperimentIdentifierValidator.class)
-    @Capability("LIST_DATA_SETS")
     public List<DataSet> listDataSets(String sessionToken,
             @AuthorizationGuard(guardClass = SamplePredicate.class)
             List<Sample> samples)
@@ -364,7 +384,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = ExperimentByIdentiferValidator.class)
-    @Capability("LIST_EXPERIMENTS")
     public List<Experiment> listExperiments(String sessionToken,
             @AuthorizationGuard(guardClass = ProjectPredicate.class)
             List<Project> projects, String experimentTypeString)
@@ -376,7 +395,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = ExperimentByIdentiferValidator.class)
-    @Capability("LIST_EXPERIMENTS")
     public List<Experiment> listExperimentsHavingDataSets(String sessionToken,
             @AuthorizationGuard(guardClass = ProjectPredicate.class)
             List<Project> projects, String experimentTypeString)
@@ -388,7 +406,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = ExperimentByIdentiferValidator.class)
-    @Capability("LIST_EXPERIMENTS")
     public List<Experiment> listExperimentsHavingSamples(String sessionToken,
             @AuthorizationGuard(guardClass = ProjectPredicate.class)
             List<Project> projects, String experimentTypeString)
@@ -467,7 +484,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = DataSetByExperimentIdentifierValidator.class)
-    @Capability("LIST_DATA_SETS")
     public List<DataSet> listDataSetsForSample(String sessionToken,
             @AuthorizationGuard(guardClass = SamplePredicate.class)
             Sample sample, boolean areOnlyDirectlyConnectedIncluded)
@@ -561,7 +577,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = DataSetByExperimentIdentifierValidator.class)
-    @Capability("LIST_DATA_SETS")
     public List<DataSet> listDataSets(String sessionToken,
             @AuthorizationGuard(guardClass = SamplePredicate.class)
             List<Sample> samples, EnumSet<Connections> connections)
@@ -583,7 +598,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = DataSetByExperimentIdentifierValidator.class)
-    @Capability("LIST_DATA_SETS")
     public List<DataSet> listDataSetsForExperiments(String sessionToken,
             @AuthorizationGuard(guardClass = ExperimentPredicate.class)
             List<Experiment> experiments, EnumSet<Connections> connections)
@@ -605,7 +619,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = DataSetByExperimentIdentifierValidator.class)
-    @Capability("GET_DATA_SET_META_DATA")
     public List<DataSet> getDataSetMetaData(String sessionToken, List<String> dataSetCodes)
     {
         Session session = getSession(sessionToken);
@@ -632,7 +645,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = DataSetByExperimentIdentifierValidator.class)
-    @Capability("GET_DATA_SET_META_DATA")
     public List<DataSet> getDataSetMetaData(String sessionToken, List<String> dataSetCodes,
             EnumSet<DataSetFetchOption> fetchOptions)
     {
@@ -682,7 +694,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = DataSetByExperimentIdentifierValidator.class)
-    @Capability("SEARCH_FOR_DATA_SETS")
     public List<DataSet> searchForDataSets(String sessionToken, SearchCriteria searchCriteria)
     {
         checkSession(sessionToken);
@@ -697,11 +708,34 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
         return Translator.translate(privateDataSets, EnumSet.noneOf(Connections.class));
     }
 
+    @Override
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
+    @Capability("SEARCH_ON_BEHALF_OF_USER")
+    public List<DataSet> searchForDataSetsOnBehalfOfUser(String sessionToken,
+            SearchCriteria searchCriteria, String userId)
+    {
+
+        final List<DataSet> unfilteredDatasets = searchForDataSets(sessionToken, searchCriteria);
+        // Filter for user
+        final PersonPE person = getDAOFactory().getPersonDAO().tryFindPersonByUserId(userId);
+        final DataSetByExperimentIdentifierValidator validator =
+                new DataSetByExperimentIdentifierValidator();
+        final ArrayList<DataSet> datasets = new ArrayList<DataSet>();
+        for (DataSet sample : unfilteredDatasets)
+        {
+            if (validator.doValidation(person, sample))
+            {
+                datasets.add(sample);
+            }
+        }
+        return datasets;
+    }
+
     @Override
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = ExperimentByIdentiferValidator.class)
-    @Capability("LIST_EXPERIMENTS")
     public List<Experiment> listExperiments(String sessionToken,
             @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class)
             List<String> experimentIdentifiers)
@@ -721,7 +755,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = ProjectByIdentiferValidator.class)
-    @Capability("LIST_PROJECTS")
     public List<Project> listProjects(String sessionToken)
     {
         checkSession(sessionToken);
@@ -732,17 +765,28 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Override
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
-    @Capability("LIST_PROJECTS_FOR_USER")
-    public List<Project> listProjectsForUser(String sessionToken, String userId)
+    @Capability("SEARCH_ON_BEHALF_OF_USER")
+    public List<Project> listProjectsOnBehalfOfUser(String sessionToken, String userId)
     {
-        checkSession(sessionToken);
-        return Translator.translateProjects(commonServer.listProjectsForUser(sessionToken, userId));
+        final List<Project> unfilteredProjects = listProjects(sessionToken);
+
+        // filter by user
+        final PersonPE person = getDAOFactory().getPersonDAO().tryFindPersonByUserId(userId);
+        final ProjectByIdentiferValidator validator = new ProjectByIdentiferValidator();
+        final ArrayList<Project> projects = new ArrayList<Project>();
+        for (Project project : unfilteredProjects)
+        {
+            if (validator.doValidation(person, project))
+            {
+                projects.add(project);
+            }
+        }
+        return projects;
     }
 
     @Override
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    @Capability("GET_MATERIALS_BY_CODES")
     public List<Material> getMaterialByCodes(String sessionToken,
             List<MaterialIdentifier> materialIdentifier)
     {
@@ -775,7 +819,6 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
     @Override
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    @Capability("SEARCH_FOR_MATERIALS")
     public List<Material> searchForMaterials(String sessionToken, SearchCriteria searchCriteria)
     {
         DetailedSearchCriteria detailedSearchCriteria =
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java
index c97ad7c01e5114262f6daf551be64dcc0d80a1f8..22515827e416665dd25dcca0832b66cb86cbb172 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java
@@ -119,6 +119,16 @@ class GeneralInformationServiceLogger extends AbstractServerLogger implements
         return null;
     }
 
+    @Override
+    public List<Sample> searchForSamplesOnBehalfOfUser(String sessionToken,
+            SearchCriteria searchCriteria, EnumSet<SampleFetchOption> fetchOptions, String userId)
+    {
+        logAccess(sessionToken, "search-for-samples-on-behalf-of-user",
+                "SEARCH_CRITERIA(%s) FETCH_OPTIONS(%s) USER(%S)",
+                searchCriteria, fetchOptions, userId);
+        return null;
+    }
+
     @Override
     public List<DataSet> listDataSets(String sessionToken, List<Sample> samples)
     {
@@ -220,6 +230,15 @@ class GeneralInformationServiceLogger extends AbstractServerLogger implements
         return null;
     }
 
+    @Override
+    public List<DataSet> searchForDataSetsOnBehalfOfUser(String sessionToken,
+            SearchCriteria searchCriteria, String userId)
+    {
+        logAccess(sessionToken, "search-for-data-sets-on-behalf-of-user",
+                "SEARCH_CRITERIA(%s) USER(%s)", searchCriteria, userId);
+        return null;
+    }
+
     @Override
     public List<Experiment> listExperiments(String sessionToken, List<String> experimentIdentifiers)
     {
@@ -236,9 +255,9 @@ class GeneralInformationServiceLogger extends AbstractServerLogger implements
     }
 
     @Override
-    public List<Project> listProjectsForUser(String sessionToken, String userId)
+    public List<Project> listProjectsOnBehalfOfUser(String sessionToken, String userId)
     {
-        logAccess(sessionToken, "list-projects-for-user", "USER_ID(%s)", userId);
+        logAccess(sessionToken, "list-projects-on-behalf-of-user", "USER(%s)", userId);
         return null;
     }
 
@@ -275,4 +294,5 @@ class GeneralInformationServiceLogger extends AbstractServerLogger implements
         logAccess(sessionToken, "search-for-materials", "SEARCH_CRITERIA(%s)", searchCriteria);
         return null;
     }
+
 }
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 6594f10590e2033fe3b86ea887a58d28d3e7cc83..fe6155f942710cf23f3b3988556633d7f26c9bdd 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
@@ -258,15 +258,6 @@ public interface ICommonServer extends IServer
     @ReturnValueFilter(validatorClass = ProjectValidator.class)
     public List<Project> listProjects(String sessionToken);
 
-    /**
-     * Returns all projects.
-     * 
-     * @return a sorted list of {@link Project}.
-     */
-    @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
-    public List<Project> listProjectsForUser(String sessionToken, String userId);
-
     /**
      * Registers a new person.
      */