diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/rights/GetRightsExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/rights/GetRightsExecutor.java
index 77bcd6fdfe3f7f86c0a92085d5d8de138d25a5fc..6a37e6e240fd442b172a8e255ea24ebd9b9afe4a 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/rights/GetRightsExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/rights/GetRightsExecutor.java
@@ -38,13 +38,16 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.IDataSetId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.IProjectId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectIdentifier;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.Right;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.Rights;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.fetchoptions.RightsFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.ISampleId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.ISpaceId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.dataset.IDataSetAuthorizationExecutor;
@@ -52,6 +55,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.dataset.IMapDataSetB
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.experiment.IExperimentAuthorizationExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.experiment.IMapExperimentByIdExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.project.IMapProjectByIdExecutor;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.project.IProjectAuthorizationExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.sample.IMapSampleByIdExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.sample.ISampleAuthorizationExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.space.IMapSpaceByIdExecutor;
@@ -65,6 +69,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory;
 
 /**
  * @author Franz-Josef Elmer
@@ -78,6 +83,9 @@ public class GetRightsExecutor implements IGetRightsExecutor
     @Autowired
     private IMapProjectByIdExecutor mapProjectByIdExecutor;
 
+    @Autowired
+    private IProjectAuthorizationExecutor projectAuthorizationExecutor;
+    
     @Autowired
     private IMapSampleByIdExecutor mapSampleByIdExecutor;
 
@@ -123,6 +131,10 @@ public class GetRightsExecutor implements IGetRightsExecutor
     private Map<Class<? extends IObjectId>, IHandler> getHandlersByObjectIdClassMap()
     {
         Map<Class<? extends IObjectId>, IHandler> map = new LinkedHashMap<>();
+        
+        IHandler projectHandler = new ProjectHandler();
+        map.put(ProjectIdentifier.class, projectHandler);
+        map.put(ProjectPermId.class, projectHandler);
 
         IHandler sampleHandler = new SampleHandler();
         map.put(SampleIdentifier.class, sampleHandler);
@@ -339,6 +351,57 @@ public class GetRightsExecutor implements IGetRightsExecutor
 
         }
     }
+    
+    private class ProjectHandler extends AbstractHandler<IProjectId, ProjectPE>
+    {
+        ProjectHandler()
+        {
+            super(IProjectId.class);
+        }
+
+        @Override
+        Map<IProjectId, ProjectPE> getEntitiesByIds(IOperationContext context, Collection<IProjectId> ids)
+        {
+            return mapProjectByIdExecutor.map(context, ids);
+        }
+
+        @Override
+        void canUpdate(IOperationContext context, IProjectId id, ProjectPE entity)
+        {
+            projectAuthorizationExecutor.canUpdate(context, id, entity);
+        }
+
+        @Override
+        ProjectPE createDummyEntity(IOperationContext context, IProjectId id)
+        {
+            if (id instanceof ProjectPermId)
+            {
+                throw new UserFailureException("Unknown project with perm id " + id + ".");
+            }
+            if (id instanceof ProjectIdentifier == false)
+            {
+                throw new UserFailureException("Project identifier of unsupported type ("
+                        + id.getClass().getName() + "): " + id);
+            }
+            ISpaceId spaceId = new SpacePermId(ProjectIdentifierFactory.parse(((ProjectIdentifier) id).getIdentifier())
+                    .getSpaceCode());
+            SpacePE spacePE = mapSpaceByIdExecutor.map(context, Arrays.asList(spaceId)).get(spaceId);
+            if (spacePE == null)
+            {
+                throw new UserFailureException("Unknown space in project identifier '" + id + "'.");
+            }
+            ProjectPE projectPE = new ProjectPE();
+            projectPE.setSpace(spacePE);
+            projectPE.setCode("DUMMY");
+            return projectPE;
+        }
+
+        @Override
+        void canCreate(IOperationContext context, ProjectPE entity)
+        {
+            projectAuthorizationExecutor.canCreate(context, entity);
+        }
+    }
 
     private class DataSetHandler implements IHandler
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetRightsTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetRightsTest.java
index d8bdb27da0954b010b491d23661e592d7eee35ef..420582c87d67759473179e58a8c3171de6fcc248 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetRightsTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetRightsTest.java
@@ -28,6 +28,8 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.IObjectId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentPermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectIdentifier;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.Rights;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.fetchoptions.RightsFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
@@ -38,6 +40,52 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
  */
 public class GetRightsTest extends AbstractTest
 {
+    @Test
+    public void testGetProjectRights()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_ROLE_V3, PASSWORD);
+        IObjectId s1 = new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT");
+        IObjectId s2 = new ProjectIdentifier("/CISD/NEMO");
+        IObjectId s3 = new SampleIdentifier("/CISD/NEW");
+        IObjectId s4 = new SampleIdentifier("/TEST-SPACE/NEW");
+
+        // When
+        Map<IObjectId, Rights> map = v3api.getRights(sessionToken, Arrays.asList(s1, s2, s3, s4), new RightsFetchOptions());
+
+        // Then
+        assertEquals(map.get(s1).getRights().toString(), "[]");
+        assertEquals(map.get(s2).getRights().toString(), "[UPDATE]");
+        assertEquals(map.get(s3).getRights().toString(), "[CREATE]");
+        assertEquals(map.get(s4).getRights().toString(), "[]");
+    }
+
+    @Test
+    public void testGetProjectCreationRightForUnknownProjectPermId()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_ROLE_V3, PASSWORD);
+        IObjectId s1 = new ProjectPermId("123-45");
+
+        // When
+        assertUserFailureException(Void -> v3api.getRights(sessionToken, Arrays.asList(s1), new RightsFetchOptions()),
+                // Then
+                "Unknown project with perm id 123-45.");
+    }
+
+    @Test
+    public void testGetProjectCreationRightInMissingSpace()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_ROLE_V3, PASSWORD);
+        IObjectId s1 = new ProjectIdentifier("/NO-SPACE/NEW");
+
+        // When
+        assertUserFailureException(Void -> v3api.getRights(sessionToken, Arrays.asList(s1), new RightsFetchOptions()),
+                // Then
+                "Unknown space in project identifier '/NO-SPACE/NEW'.");
+    }
+
     @Test
     public void testGetSampleRights()
     {