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 f2435b3e31d7116eecd26642059e92302c073a93..3fb6ad3ecfb6f82d417367884db4b8393208bbe1 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
@@ -749,6 +749,10 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         final Session session = getSession(sessionToken);
 
         final PersonPE person = getDAOFactory().getPersonDAO().tryFindPersonByUserId(userId);
+        if (person == null)
+        {
+            throw new UserFailureException("Unknown user: " + userId);
+        }
 
         final ISampleLister sampleLister =
                 businessObjectFactory.createSampleLister(session, person.getId());
@@ -1485,6 +1489,10 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     {
         final Session session = getSession(sessionToken);
         final PersonPE person = getDAOFactory().getPersonDAO().tryFindPersonByUserId(userId);
+        if (person == null)
+        {
+            throw new UserFailureException("Unknown user: " + userId);
+        }
 
         SearchHelper searchHelper =
                 new SearchHelper(session, businessObjectFactory, getDAOFactory());
@@ -1592,6 +1600,10 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         IMetaprojectDAO mpd = this.getDAOFactory().getMetaprojectDAO();
 
         final PersonPE person = getDAOFactory().getPersonDAO().tryFindPersonByUserId(userId);
+        if (person == null)
+        {
+            throw new UserFailureException("Unknown user: " + userId);
+        }
 
         Collection<MetaprojectAssignmentPE> assignments =
                 mpd.listMetaprojectAssignmentsForEntities(person, resultSet,
@@ -2647,8 +2659,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     {
         List<EntityTypePE> types = new ArrayList<EntityTypePE>();
         if ((entityKind.equals(EntityKind.SAMPLE) || entityKind.equals(EntityKind.DATA_SET) || entityKind
-                .equals(EntityKind.MATERIAL))
-                && EntityType.isDefinedInFileEntityTypeCode(type))
+                .equals(EntityKind.MATERIAL)) && EntityType.isDefinedInFileEntityTypeCode(type))
         {
             types.addAll(getDAOFactory().getEntityTypeDAO(
                     DtoConverters.convertEntityKind(entityKind)).listEntityTypes());
@@ -4033,14 +4044,31 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public List<Metaproject> listMetaprojects(String sessionToken)
     {
         Session session = getSession(sessionToken);
+        PersonPE owner = session.tryGetPerson();
+        return listMetaProjects(owner);
+    }
+
+    @Override
+    @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
+    public List<Metaproject> listMetaprojectsOnBehalfOfUser(String sessionToken, String userId)
+    {
+        checkSession(sessionToken);
+        PersonPE user = getDAOFactory().getPersonDAO().tryFindPersonByUserId(userId);
+        if (user == null)
+        {
+            throw new UserFailureException("Unknown user: " + userId);
+        }
+        return listMetaProjects(user);
+    }
 
+    private List<Metaproject> listMetaProjects(PersonPE owner)
+    {
         IDAOFactory daoFactory = getDAOFactory();
         IMetaprojectDAO metaprojectDAO = daoFactory.getMetaprojectDAO();
-        PersonPE owner = session.tryGetPerson();
 
         List<MetaprojectPE> metaprojectPEs = metaprojectDAO.listMetaprojects(owner);
 
@@ -4048,7 +4076,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public List<MetaprojectAssignmentsCount> listMetaprojectAssignmentsCounts(String sessionToken)
     {
         List<Metaproject> metaprojects = listMetaprojects(sessionToken);
@@ -4064,7 +4092,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public MetaprojectAssignmentsCount getMetaprojectAssignmentsCount(String sessionToken,
             IMetaprojectId metaprojectId)
     {
@@ -4073,7 +4101,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public MetaprojectAssignments getMetaprojectAssignments(String sessionToken,
             IMetaprojectId metaprojectId)
     {
@@ -4082,9 +4110,33 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
+    public MetaprojectAssignments getMetaprojectAssignmentsOnBehalfOfUser(String sessionToken,
+            IMetaprojectId metaprojectId, String userId)
+    {
+        Session session = getSession(sessionToken);
+        PersonPE user = getDAOFactory().getPersonDAO().tryFindPersonByUserId(userId);
+        if (user == null)
+        {
+            throw new UserFailureException("Unknown user: " + userId);
+        }
+        return getMetaprojectAssignments(session, metaprojectId,
+                EnumSet.allOf(MetaprojectAssignmentsFetchOption.class), user);
+    }
+
+    @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public MetaprojectAssignments getMetaprojectAssignments(String sessionToken,
             IMetaprojectId metaprojectId, EnumSet<MetaprojectAssignmentsFetchOption> fetchOptions)
+    {
+        Session session = getSession(sessionToken);
+        return getMetaprojectAssignments(session, metaprojectId, fetchOptions,
+                session.tryGetPerson());
+    }
+
+    private MetaprojectAssignments getMetaprojectAssignments(Session session,
+            IMetaprojectId metaprojectId, EnumSet<MetaprojectAssignmentsFetchOption> fetchOptions,
+            PersonPE user)
     {
         if (metaprojectId == null)
         {
@@ -4095,9 +4147,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
             throw new UserFailureException("Fetch options cannot be null");
         }
 
-        Metaproject metaproject = getMetaproject(sessionToken, metaprojectId);
-
-        Session session = getSession(sessionToken);
+        Metaproject metaproject = getMetaproject(session, metaprojectId, user);
 
         MetaprojectAssignmentsHelper helper =
                 new MetaprojectAssignmentsHelper(getDAOFactory(), managedPropertyEvaluatorFactory);
@@ -4107,7 +4157,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public void addToMetaproject(String sessionToken, IMetaprojectId metaprojectId,
             MetaprojectAssignmentsIds assignmentsToAdd)
     {
@@ -4136,7 +4186,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public void removeFromMetaproject(String sessionToken, IMetaprojectId metaprojectId,
             MetaprojectAssignmentsIds assignmentsToRemove)
     {
@@ -4165,7 +4215,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId, String reason)
     {
         if (metaprojectId == null)
@@ -4184,7 +4234,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public void deleteMetaprojects(String sessionToken, List<IMetaprojectId> metaprojectIds,
             String reason)
     {
@@ -4200,7 +4250,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public Metaproject registerMetaproject(String sessionToken,
             IMetaprojectRegistration registration)
     {
@@ -4214,7 +4264,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public Metaproject updateMetaproject(String sessionToken, IMetaprojectId metaprojectId,
             IMetaprojectUpdates updates)
     {
@@ -4232,16 +4282,20 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public Metaproject getMetaproject(String sessionToken, IMetaprojectId metaprojectId)
+    {
+        Session session = getSession(sessionToken);
+        return getMetaproject(session, metaprojectId, session.tryGetPerson());
+    }
+
+    private Metaproject getMetaproject(Session session, IMetaprojectId metaprojectId, PersonPE user)
     {
         if (metaprojectId == null)
         {
             throw new UserFailureException("Metaproject id cannot be null");
         }
 
-        Session session = getSession(sessionToken);
-
         IMetaprojectBO metaprojectBO = getBusinessObjectFactory().createMetaprojectBO(session);
         MetaprojectPE metaprojectPE = metaprojectBO.tryFindByMetaprojectId(metaprojectId);
 
@@ -4251,7 +4305,8 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                     + " doesn't exist");
         }
 
-        AuthorizationServiceUtils authorizationUtils = getAuthorizationService(session);
+        AuthorizationServiceUtils authorizationUtils =
+                new AuthorizationServiceUtils(getDAOFactory(), user);
         authorizationUtils.checkAccessMetaproject(metaprojectPE);
         return MetaprojectTranslator.translate(metaprojectPE);
     }
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 6f82d14fda27344f657ff9e7adc373fa867006dd..155835317c0150cddc7b3c739a9824804c056aed 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
@@ -1581,6 +1581,13 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         return null;
     }
 
+    @Override
+    public List<Metaproject> listMetaprojectsOnBehalfOfUser(String sessionToken, String userId)
+    {
+        logAccess(sessionToken, "listMetaprojectsOnBehalfOfUser", "USER(%s)", userId);
+        return null;
+    }
+
     @Override
     public List<MetaprojectAssignmentsCount> listMetaprojectAssignmentsCounts(String sessionToken)
     {
@@ -1621,6 +1628,15 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         return null;
     }
 
+    @Override
+    public MetaprojectAssignments getMetaprojectAssignmentsOnBehalfOfUser(String sessionToken,
+            IMetaprojectId metaprojectId, String userId)
+    {
+        logAccess(sessionToken, "getMetaprojectAssignmentsOnBehalfOfUser",
+                "METAPROJECT_ID(%s) USER(%s)", metaprojectId, userId);
+        return null;
+    }
+
     @Override
     public void addToMetaproject(String sessionToken, IMetaprojectId metaprojectId,
             MetaprojectAssignmentsIds assignmentsToAdd)
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 f0e1dc4c950bba40c38f5e0bb26ad04688b6adcf..f7992e9c4e33cb77c9cf1f854f993e8683d5e7a7 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
@@ -137,7 +137,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 public class GeneralInformationService extends AbstractServer<IGeneralInformationService> implements
         IGeneralInformationService
 {
-    public static final int MINOR_VERSION = 23;
+    public static final int MINOR_VERSION = 24;
 
     @Resource(name = ch.systemsx.cisd.openbis.generic.shared.ResourceNames.COMMON_SERVER)
     private ICommonServer commonServer;
@@ -1085,7 +1085,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public List<Metaproject> listMetaprojects(String sessionToken)
     {
         return commonServer.listMetaprojects(sessionToken);
@@ -1093,12 +1093,37 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
+    public List<Metaproject> listMetaprojectsOnBehalfOfUser(String sessionToken, String userId)
+    {
+        return commonServer.listMetaprojectsOnBehalfOfUser(sessionToken, userId);
+    }
+
+    @Override
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public MetaprojectAssignments getMetaproject(String sessionToken, IMetaprojectId metaprojectId)
     {
         ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignments assignments =
                 commonServer.getMetaprojectAssignments(sessionToken, metaprojectId);
+        return translate(assignments);
+    }
 
+    @Override
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
+    public MetaprojectAssignments getMetaprojectOnBehalfOfUser(String sessionToken,
+            IMetaprojectId metaprojectId, String userId)
+    {
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignments assignments =
+                commonServer.getMetaprojectAssignmentsOnBehalfOfUser(sessionToken, metaprojectId,
+                        userId);
+        return translate(assignments);
+    }
+
+    private MetaprojectAssignments translate(
+            ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignments assignments)
+    {
         MetaprojectAssignments result = new MetaprojectAssignments();
         result.setMetaproject(assignments.getMetaproject());
         result.setExperiments(Translator.translateExperiments(assignments.getExperiments()));
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 ced2a04548ec53283355c343447aa7221030a2ec..649474ebfe5f812ffcf62cedb47e9fff9ef59e6e 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
@@ -391,6 +391,13 @@ class GeneralInformationServiceLogger extends AbstractServerLogger implements
         return null;
     }
 
+    @Override
+    public List<Metaproject> listMetaprojectsOnBehalfOfUser(String sessionToken, String userId)
+    {
+        logAccess(sessionToken, "listMetaprojectsOnBehalfOfUser", "USER(%s)", userId);
+        return null;
+    }
+
     @Override
     public MetaprojectAssignments getMetaproject(String sessionToken, IMetaprojectId metaprojectId)
     {
@@ -398,6 +405,15 @@ class GeneralInformationServiceLogger extends AbstractServerLogger implements
         return null;
     }
 
+    @Override
+    public MetaprojectAssignments getMetaprojectOnBehalfOfUser(String sessionToken,
+            IMetaprojectId metaprojectId, String userId)
+    {
+        logAccess(sessionToken, "getMetaprojectOnBehalfOfUser", "METAPROJECT_ID(%s) USER(%s)",
+                metaprojectId, userId);
+        return null;
+    }
+
     @Override
     public List<Attachment> listAttachmentsForProject(String sessionToken, IProjectId projectId,
             boolean allVersions)
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 945e6b6d9777b84f6e3070f705044041088da111..926034f6023d4ebb80c9c283884b793b1a6692b4 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
@@ -1445,11 +1445,17 @@ public interface ICommonServer extends IServer
             ExternalDataManagementSystem edms);
 
     /**
-     * Lists all metaprojects registered for given user.
+     * Lists all metaprojects registered for session user.
      */
     @Transactional(readOnly = true)
     public List<Metaproject> listMetaprojects(String sessionToken);
 
+    /**
+     * Lists all metaprojects registered for given user.
+     */
+    @Transactional(readOnly = true)
+    public List<Metaproject> listMetaprojectsOnBehalfOfUser(String sessionToken, String userId);
+
     /**
      * Lists all metaproject assignments counts for given user.
      */
@@ -1470,6 +1476,13 @@ public interface ICommonServer extends IServer
     public MetaprojectAssignments getMetaprojectAssignments(String sessionToken,
             IMetaprojectId metaprojectId);
 
+    /**
+     * Returns object containing all entities assigned to given metaproject of specified user.
+     */
+    @Transactional(readOnly = true)
+    public MetaprojectAssignments getMetaprojectAssignmentsOnBehalfOfUser(String sessionToken,
+            IMetaprojectId metaprojectId, String userId);
+
     /**
      * Returns object containing chosen entities assigned to given metaproject.
      */
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
index a886056c5ddb4d03576c6e0e5208ef42e1f61219..125299e8beec266307874eea8d3e35708f8ae4ce 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
@@ -70,6 +70,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.experiment.Experime
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.experiment.ExperimentPermIdId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.experiment.ExperimentTechIdId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.metaproject.MetaprojectIdentifierId;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.metaproject.MetaprojectTechIdId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.project.ProjectIdentifierId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.project.ProjectPermIdId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.sample.SampleIdentifierId;
@@ -77,7 +78,9 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.sample.SamplePermId
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.sample.SampleTechIdId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleCode;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
@@ -1661,6 +1664,44 @@ public class GeneralInformationServiceTest extends SystemTestCase
         assertTrue(metaprojectAssignments.getExperiments().get(0).toString().contains("STUB"));
     }
 
+    @Test
+    public void testGetMetaprojectsOnBehalfOfUser()
+    {
+        String instanceObserverId = "instance-observer";
+        commonServer.registerPerson(systemSessionToken, instanceObserverId);
+        commonServer.registerInstanceRole(systemSessionToken, RoleCode.OBSERVER,
+                Grantee.createPerson(instanceObserverId));
+        sessionToken =
+                generalInformationService.tryToAuthenticateForAllServices(instanceObserverId, "a");
+
+        List<Metaproject> metaProjects =
+                generalInformationService.listMetaprojectsOnBehalfOfUser(sessionToken, "test");
+        Collections.sort(metaProjects, new Comparator<Metaproject>()
+            {
+                @Override
+                public int compare(Metaproject o1, Metaproject o2)
+                {
+                    return o1.getCode().compareTo(o2.getCode());
+                }
+            });
+
+        assertEquals("ANOTHER_TEST_METAPROJECTS", metaProjects.get(0).getCode());
+        assertEquals("TEST_METAPROJECTS", metaProjects.get(1).getCode());
+        assertEquals(2, metaProjects.size());
+        MetaprojectAssignments mas =
+                generalInformationService.getMetaprojectOnBehalfOfUser(sessionToken,
+                        new MetaprojectTechIdId(metaProjects.get(1).getId()), "test");
+        assertEquals("[MaterialIdentifier [materialCode=AD3, "
+                + "materialTypeIdentifier=MaterialTypeIdentifier [materialTypeCode=VIRUS]]]", mas
+                .getMaterials().toString());
+        assertEntities("[/CISD/NEMO/EXP11, /TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST]",
+                mas.getExperiments());
+        assertEquals("[Sample[/TEST-SPACE/EV-TEST,VALIDATE_CHILDREN,{},parents=?,children=?]]", mas
+                .getSamples().toString());
+        assertEquals("[DataSet[20120619092259000-22,/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST,"
+                + "<null>,HCS_IMAGE,{}]]", mas.getDataSets().toString());
+    }
+
     @Test
     public void testGetMetaprojectReturnsMetaprojectForNameWithDifferentCase()
     {
diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java
index b7161aad381cd0e79703d91ca76e646e51e7fe65..bcd22b34c42cce15c725691f1d3c4ad45ec5a218 100644
--- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java
+++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java
@@ -492,6 +492,13 @@ public interface IGeneralInformationService extends IRpcService
      */
     public List<Metaproject> listMetaprojects(String sessionToken);
 
+    /**
+     * Lists all metaprojects belonging to specified user.
+     * 
+     * @since 1.24
+     */
+    public List<Metaproject> listMetaprojectsOnBehalfOfUser(String sessionToken, String userId);
+    
     /**
      * Returns all entities tagged with given metaproject.
      * 
@@ -499,6 +506,15 @@ public interface IGeneralInformationService extends IRpcService
      */
     public MetaprojectAssignments getMetaproject(String sessionToken, IMetaprojectId metaprojectId);
 
+    /**
+     * Returns all entities tagged with given metaproject for specified user.
+     * 
+     * @throws UserFailureException when a metaproject with the specified id doesn't exist.
+     * @since 1.24
+     */
+    public MetaprojectAssignments getMetaprojectOnBehalfOfUser(String sessionToken,
+            IMetaprojectId metaprojectId, String userId);
+    
     /**
      * Lists attachments of specified project.
      *