diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dssapi/v3/DataStoreServerApi.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dssapi/v3/DataStoreServerApi.java
index f1d90764103faf759231e58d54f671df1380b6b6..f92dea95b818c2ba16fbd5e2df28f877d6f9d903 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dssapi/v3/DataStoreServerApi.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dssapi/v3/DataStoreServerApi.java
@@ -160,7 +160,7 @@ public class DataStoreServerApi extends AbstractDssServiceRpc<IDataStoreServerAp
     }
 
     @Transactional(readOnly = true)
-    @RolesAllowed({ RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
+    @RolesAllowed({ RoleWithHierarchy.PROJECT_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
     @Override
     public SearchResult<DataSetFile> searchFiles(String sessionToken, DataSetFileSearchCriteria searchCriteria, DataSetFileFetchOptions fetchOptions)
     {
@@ -254,7 +254,7 @@ public class DataStoreServerApi extends AbstractDssServiceRpc<IDataStoreServerAp
     }
 
     @Transactional(readOnly = true)
-    @RolesAllowed({ RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
+    @RolesAllowed({ RoleWithHierarchy.PROJECT_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
     @Override
     public InputStream downloadFiles(String sessionToken, List<? extends IDataSetFileId> fileIds,
             DataSetFileDownloadOptions downloadOptions)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/RoleAssignmentImmutable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/RoleAssignmentImmutable.java
index cee582aab9fb44eaaf48123ef386e4d876653d84..30be6ad6c36e7d650fbb045b5435fd3bc9753ad2 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/RoleAssignmentImmutable.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/RoleAssignmentImmutable.java
@@ -22,7 +22,6 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISpaceImmutab
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IUserImmutable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleAssignment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleCode;
 
 /**
  * @author Chandrasekhar Ramakrishnan
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/CommonAuthorizationSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/CommonAuthorizationSystemTest.java
index 11c39904aa8c037e3038a86e0c69e0001c535e2a..d8ee918e31c00308a321d52ea874d083da3d83b6 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/CommonAuthorizationSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/CommonAuthorizationSystemTest.java
@@ -593,7 +593,7 @@ public class CommonAuthorizationSystemTest extends SystemTestCase
 
     public static void assertAuthorizationFailureExceptionThatNoRoles(Throwable t)
     {
-        assertException(t, AuthorizationFailureException.class, ".*No role assignments could be found for user.*");
+        assertException(t, AuthorizationFailureException.class, ".*None of method roles.*could be found in roles of user.*");
     }
 
     public static void assertUserFailureExceptionThatProjectDoesNotExist(Throwable t)
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/ProjectAuthorizationUser.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/ProjectAuthorizationUser.java
index 3a6e6890c8f8e5959368323c40d62be35afd7ed1..a1801948263a6e659e103126e8969cb008b033e8 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/ProjectAuthorizationUser.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/ProjectAuthorizationUser.java
@@ -61,6 +61,11 @@ public class ProjectAuthorizationUser
         return hasInstanceRole();
     }
 
+    public boolean isSpaceUser()
+    {
+        return hasSpaceRole();
+    }
+
     public boolean isSpaceUser(String spaceCode)
     {
         return hasSpaceRole(spaceCode);
@@ -76,6 +81,16 @@ public class ProjectAuthorizationUser
         return isSpaceUser(AUTH_SPACE_2);
     }
 
+    public boolean isDisabledProjectUser()
+    {
+        return isProjectUser() && false == hasPAEnabled();
+    }
+
+    public boolean isProjectUser()
+    {
+        return hasProjectRole();
+    }
+
     public boolean isProjectUser(String spaceCode, String projectCode)
     {
         return hasProjectRole(spaceCode, projectCode);
@@ -191,7 +206,7 @@ public class ProjectAuthorizationUser
     {
         for (RoleAssignmentPE role : person.getAllPersonRoles())
         {
-            if (role.getSpace() == null && role.getProject() == null)
+            if (role.getRoleWithHierarchy().isInstanceLevel())
             {
                 return true;
             }
@@ -211,6 +226,18 @@ public class ProjectAuthorizationUser
         return false;
     }
 
+    private boolean hasSpaceRole()
+    {
+        for (RoleAssignmentPE role : person.getAllPersonRoles())
+        {
+            if (role.getSpace() != null)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private boolean hasSpaceRole(String spaceCode)
     {
         for (RoleAssignmentPE role : person.getAllPersonRoles())
@@ -223,6 +250,18 @@ public class ProjectAuthorizationUser
         return false;
     }
 
+    private boolean hasProjectRole()
+    {
+        for (RoleAssignmentPE role : person.getAllPersonRoles())
+        {
+            if (role.getProject() != null)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private boolean hasProjectRole(String spaceCode, String projectCode)
     {
         for (RoleAssignmentPE role : person.getAllPersonRoles())
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/common/DataSetUtil.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/common/DataSetUtil.java
index f1d46105b003ac479437ec36e3caa08b18d0ae3e..83963d7b235d7458cf46249ee20e64c8485b0496 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/common/DataSetUtil.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/common/DataSetUtil.java
@@ -37,6 +37,7 @@ public class DataSetUtil
         DataPE dataSetPE = test.getDataSet(spacePE, projectPE, (DataSetKind) param);
 
         DataSetInitializer initializer = new DataSetInitializer();
+        initializer.setId(dataSetPE.getId());
         initializer.setCode(dataSetPE.getCode());
         initializer.setDataSetTypeCode(dataSetPE.getDataSetType().getCode());
         initializer.setRegistrationDetails(new EntityRegistrationDetails(new EntityRegistrationDetailsInitializer()));
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestAssertionsDefault.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestAssertionsDefault.java
index 1ad36491dd92c63349e225f9b7adf56bb591f779..9723cbc752d00f1e1db556c4e47210ceed01a695 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestAssertionsDefault.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestAssertionsDefault.java
@@ -34,19 +34,37 @@ public class CommonPredicateSystemTestAssertionsDefault<O> extends CommonPredica
     @Override
     public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
     {
-        CommonAuthorizationSystemTest.assertException(t, UserFailureException.class, "Unspecified value");
+        if (user.isDisabledProjectUser())
+        {
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+        } else
+        {
+            CommonAuthorizationSystemTest.assertException(t, UserFailureException.class, "Unspecified value");
+        }
     }
 
     @Override
     public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
     {
-        CommonAuthorizationSystemTest.assertException(t, UserFailureException.class, "Unspecified value");
+        if (user.isDisabledProjectUser())
+        {
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+        } else
+        {
+            CommonAuthorizationSystemTest.assertException(t, UserFailureException.class, "Unspecified value");
+        }
     }
 
     @Override
     public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
     {
-        CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+        if (user.isDisabledProjectUser())
+        {
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+        } else
+        {
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+        }
     }
 
     @Override
@@ -69,25 +87,31 @@ public class CommonPredicateSystemTestAssertionsDefault<O> extends CommonPredica
 
     private void assertWithObject(ProjectAuthorizationUser user, Throwable t, Object param, ProjectIdentifier... projects)
     {
-        if (user.isInstanceUser())
+        if (user.isDisabledProjectUser())
         {
-            CommonAuthorizationSystemTest.assertNoException(t);
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
         } else
         {
-            boolean hasAccess = true;
-
-            for (ProjectIdentifier project : projects)
-            {
-                hasAccess = hasAccess && (user.isSpaceUser(project.getSpaceCode())
-                        || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()));
-            }
-
-            if (hasAccess)
+            if (user.isInstanceUser())
             {
                 CommonAuthorizationSystemTest.assertNoException(t);
             } else
             {
-                CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                boolean hasAccess = true;
+
+                for (ProjectIdentifier project : projects)
+                {
+                    hasAccess = hasAccess && (user.isSpaceUser(project.getSpaceCode())
+                            || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()));
+                }
+
+                if (hasAccess)
+                {
+                    CommonAuthorizationSystemTest.assertNoException(t);
+                } else
+                {
+                    CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                }
             }
         }
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestDataSetAssertions.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestDataSetAssertions.java
index b2b268ec5454e1e66c6576c226f4b183b70c80e6..3075ba64d5b19cc89d67a4a16924a145c16bbb3b 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestDataSetAssertions.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestDataSetAssertions.java
@@ -56,49 +56,55 @@ public class CommonPredicateSystemTestDataSetAssertions<O> extends CommonPredica
 
     private void assertWithObject(ProjectAuthorizationUser user, Throwable t, Object param, ProjectIdentifier... projects)
     {
-        if (DataSetKind.SPACE_SAMPLE.equals(param))
+        if (user.isDisabledProjectUser())
         {
-            if (user.isInstanceUser())
-            {
-                CommonAuthorizationSystemTest.assertNoException(t);
-            } else
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+        } else
+        {
+            if (DataSetKind.SPACE_SAMPLE.equals(param))
             {
-                boolean hasAccess = true;
-
-                for (ProjectIdentifier project : projects)
-                {
-                    hasAccess = hasAccess && user.isSpaceUser(project.getSpaceCode());
-                }
-
-                if (hasAccess)
+                if (user.isInstanceUser())
                 {
                     CommonAuthorizationSystemTest.assertNoException(t);
                 } else
                 {
-                    CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    boolean hasAccess = true;
+
+                    for (ProjectIdentifier project : projects)
+                    {
+                        hasAccess = hasAccess && user.isSpaceUser(project.getSpaceCode());
+                    }
+
+                    if (hasAccess)
+                    {
+                        CommonAuthorizationSystemTest.assertNoException(t);
+                    } else
+                    {
+                        CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    }
                 }
-            }
-        } else
-        {
-            if (user.isInstanceUser())
-            {
-                CommonAuthorizationSystemTest.assertNoException(t);
             } else
             {
-                boolean hasAccess = true;
-
-                for (ProjectIdentifier project : projects)
-                {
-                    hasAccess = hasAccess && (user.isSpaceUser(project.getSpaceCode())
-                            || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()));
-                }
-
-                if (hasAccess)
+                if (user.isInstanceUser())
                 {
                     CommonAuthorizationSystemTest.assertNoException(t);
                 } else
                 {
-                    CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    boolean hasAccess = true;
+
+                    for (ProjectIdentifier project : projects)
+                    {
+                        hasAccess = hasAccess && (user.isSpaceUser(project.getSpaceCode())
+                                || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()));
+                    }
+
+                    if (hasAccess)
+                    {
+                        CommonAuthorizationSystemTest.assertNoException(t);
+                    } else
+                    {
+                        CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    }
                 }
             }
         }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestSampleAssertions.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestSampleAssertions.java
index 1214b2a1d286d7ebef9b45fb50a805dd19a987a4..99c4e528c57696318bb7079734e2baae74a6683f 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestSampleAssertions.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestSampleAssertions.java
@@ -56,61 +56,67 @@ public class CommonPredicateSystemTestSampleAssertions<O> extends CommonPredicat
 
     private void assertWithObject(ProjectAuthorizationUser user, Throwable t, Object param, ProjectIdentifier... projects)
     {
-        if (SampleKind.SHARED_READ.equals(param))
+        if (user.isDisabledProjectUser())
         {
-            CommonAuthorizationSystemTest.assertNoException(t);
-        } else if (SampleKind.SHARED_READ_WRITE.equals(param))
-        {
-            if (user.isInstanceUser())
-            {
-                CommonAuthorizationSystemTest.assertNoException(t);
-            } else
-            {
-                CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
-            }
-        } else if (SampleKind.SPACE.equals(param) || SampleKind.SPACE_CONTAINED.equals(param))
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+        } else
         {
-            if (user.isInstanceUser())
+            if (SampleKind.SHARED_READ.equals(param))
             {
                 CommonAuthorizationSystemTest.assertNoException(t);
-            } else
+            } else if (SampleKind.SHARED_READ_WRITE.equals(param))
             {
-                boolean hasAccess = true;
-
-                for (ProjectIdentifier project : projects)
-                {
-                    hasAccess = hasAccess && user.isSpaceUser(project.getSpaceCode());
-                }
-
-                if (hasAccess)
+                if (user.isInstanceUser())
                 {
                     CommonAuthorizationSystemTest.assertNoException(t);
                 } else
                 {
                     CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
                 }
-            }
-        } else
-        {
-            if (user.isInstanceUser())
+            } else if (SampleKind.SPACE.equals(param) || SampleKind.SPACE_CONTAINED.equals(param))
             {
-                CommonAuthorizationSystemTest.assertNoException(t);
-            } else
-            {
-                boolean hasAccess = true;
-
-                for (ProjectIdentifier project : projects)
+                if (user.isInstanceUser())
                 {
-                    hasAccess = hasAccess && (user.isSpaceUser(project.getSpaceCode())
-                            || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()));
-                }
+                    CommonAuthorizationSystemTest.assertNoException(t);
+                } else
+                {
+                    boolean hasAccess = true;
 
-                if (hasAccess)
+                    for (ProjectIdentifier project : projects)
+                    {
+                        hasAccess = hasAccess && user.isSpaceUser(project.getSpaceCode());
+                    }
+
+                    if (hasAccess)
+                    {
+                        CommonAuthorizationSystemTest.assertNoException(t);
+                    } else
+                    {
+                        CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    }
+                }
+            } else
+            {
+                if (user.isInstanceUser())
                 {
                     CommonAuthorizationSystemTest.assertNoException(t);
                 } else
                 {
-                    CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    boolean hasAccess = true;
+
+                    for (ProjectIdentifier project : projects)
+                    {
+                        hasAccess = hasAccess && (user.isSpaceUser(project.getSpaceCode())
+                                || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()));
+                    }
+
+                    if (hasAccess)
+                    {
+                        CommonAuthorizationSystemTest.assertNoException(t);
+                    } else
+                    {
+                        CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    }
                 }
             }
         }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestSpaceAssertions.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestSpaceAssertions.java
index cf9958445f02289db2adc0af0cb526a716e12247..ac6ef6a13990cf45c216c699efa8cc3c84f1a79c 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestSpaceAssertions.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/CommonPredicateSystemTestSpaceAssertions.java
@@ -55,24 +55,30 @@ public class CommonPredicateSystemTestSpaceAssertions<O> extends CommonPredicate
 
     private void assertWithObject(ProjectAuthorizationUser user, Throwable t, Object param, ProjectIdentifier... projects)
     {
-        if (user.isInstanceUser())
+        if (user.isDisabledProjectUser())
         {
-            CommonAuthorizationSystemTest.assertNoException(t);
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
         } else
         {
-            boolean hasAccess = true;
-
-            for (ProjectIdentifier project : projects)
-            {
-                hasAccess = hasAccess && user.isSpaceUser(project.getSpaceCode());
-            }
-
-            if (hasAccess)
+            if (user.isInstanceUser())
             {
                 CommonAuthorizationSystemTest.assertNoException(t);
             } else
             {
-                CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                boolean hasAccess = true;
+
+                for (ProjectIdentifier project : projects)
+                {
+                    hasAccess = hasAccess && user.isSpaceUser(project.getSpaceCode());
+                }
+
+                if (hasAccess)
+                {
+                    CommonAuthorizationSystemTest.assertNoException(t);
+                } else
+                {
+                    CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                }
             }
         }
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataPEPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataPEPredicateSystemTest.java
index 43962ab6c3b0eb3cab8d1d5d98ac69a9b232f524..f1dcc54d5e847c753ba506818b4f8cb8991ade15 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataPEPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataPEPredicateSystemTest.java
@@ -103,7 +103,10 @@ public class DataPEPredicateSystemTest extends CommonPredicateSystemTest<DataPE>
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
@@ -115,7 +118,10 @@ public class DataPEPredicateSystemTest extends CommonPredicateSystemTest<DataPE>
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetCodeCollectionPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetCodeCollectionPredicateSystemTest.java
index 87afbb4f696e822c6a5cb10dcb262b4f68a283e5..c818a8038b9a8e91682edd9b4ddc2c23c4fede8d 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetCodeCollectionPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetCodeCollectionPredicateSystemTest.java
@@ -72,19 +72,37 @@ public class DataSetCodeCollectionPredicateSystemTest extends CommonPredicateSys
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No data set codes specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No data set codes specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetCodePredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetCodePredicateSystemTest.java
index 85a244d92417738623e81a8055c38a490d74b95d..a0fa84667e69ce05b82a97f9380447e1bc2b3bdf 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetCodePredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetCodePredicateSystemTest.java
@@ -66,13 +66,25 @@ public class DataSetCodePredicateSystemTest extends CommonPredicateSystemTest<St
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No data set code specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No data set code specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetTechIdCollectionPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetTechIdCollectionPredicateSystemTest.java
index 9c7a1bf97001e49a23991cea01ae95bb651806e9..c14226dc42eb8f33791b658c7bcdf019aa1f0c64 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetTechIdCollectionPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetTechIdCollectionPredicateSystemTest.java
@@ -73,19 +73,37 @@ public class DataSetTechIdCollectionPredicateSystemTest extends CommonPredicateS
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No data set technical ids specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No data set technical ids specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetTechIdPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetTechIdPredicateSystemTest.java
index fdb732bcf60349a16eaad394ff192625f33a4fe3..14640377672cbf3c6be9b04b26e5f49e19af9d5b 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetTechIdPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetTechIdPredicateSystemTest.java
@@ -67,13 +67,25 @@ public class DataSetTechIdPredicateSystemTest extends CommonPredicateSystemTest<
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No data set technical id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No data set technical id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateSystemTest.java
index 5a1d6e81e664ea15b4299d78788fd01426c90087..bc4c64dca68906d6aaaf23a495fa95f9b356412a 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateSystemTest.java
@@ -52,7 +52,10 @@ public abstract class DataSetUpdatesCollectionPredicateSystemTest extends Common
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
@@ -64,7 +67,13 @@ public abstract class DataSetUpdatesCollectionPredicateSystemTest extends Common
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No data set updates collection specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No data set updates collection specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithDataSetTechIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithDataSetTechIdSystemTest.java
index 5fb66b1d0fb12ea79cc6650e322af5838d794b79..2302c8b298b301e6dc614ee9855a35e6b19c187b 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithDataSetTechIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithDataSetTechIdSystemTest.java
@@ -60,7 +60,13 @@ public class DataSetUpdatesCollectionPredicateWithDataSetTechIdSystemTest extend
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithExperimentIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithExperimentIdentifierSystemTest.java
index faab933e2ca9c03195b1dd87c7fab11c99271295..8e4d164b8d12b2434bd41c209e912f5ac4592748 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithExperimentIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithExperimentIdentifierSystemTest.java
@@ -54,7 +54,10 @@ public class DataSetUpdatesCollectionPredicateWithExperimentIdentifierSystemTest
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithSampleIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithSampleIdentifierSystemTest.java
index 55ea9daa43b1b5c66286946460acf3a4d7b99634..8a4d9697d0412b0599b03aa38a4efb96554789ef 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithSampleIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesCollectionPredicateWithSampleIdentifierSystemTest.java
@@ -60,7 +60,10 @@ public class DataSetUpdatesCollectionPredicateWithSampleIdentifierSystemTest ext
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateSystemTest.java
index ef363b175870e1e5f3c76f718008f55712d8c920..d400f35bdd0797afc7ebba6fcc1332a9e3727292 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateSystemTest.java
@@ -46,7 +46,13 @@ public abstract class DataSetUpdatesPredicateSystemTest extends CommonPredicateS
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No data set updates specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No data set updates specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithDataSetTechIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithDataSetTechIdSystemTest.java
index 1d5782fca239000bb32fb64bf9c2a62a0214f14c..f697f52fc61a84e10fa35eebcc3b2c1a4b605d95 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithDataSetTechIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithDataSetTechIdSystemTest.java
@@ -60,7 +60,13 @@ public class DataSetUpdatesPredicateWithDataSetTechIdSystemTest extends DataSetU
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithExperimentIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithExperimentIdentifierSystemTest.java
index fe98708029451b8cd0a9fa9480fd0ae92e2cbf2d..d95e66fa79dd785f69c9de2275d834f443ceff4a 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithExperimentIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithExperimentIdentifierSystemTest.java
@@ -58,7 +58,10 @@ public class DataSetUpdatesPredicateWithExperimentIdentifierSystemTest extends D
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithSampleIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithSampleIdentifierSystemTest.java
index ef257f363414be0ddf9079ce94001b9468bdf94f..6b7511dc7455aa7d83cc4b9b79d520473e07a607 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithSampleIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/DataSetUpdatesPredicateWithSampleIdentifierSystemTest.java
@@ -60,7 +60,10 @@ public class DataSetUpdatesPredicateWithSampleIdentifierSystemTest extends DataS
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateSystemTest.java
index 638b6c05f71d07e7323942157d8d506a4b051c19..d1206eda1d5586af479fb61f9e05c606c55a74fd 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateSystemTest.java
@@ -77,19 +77,37 @@ public abstract class NewDataSetsWithTypePredicateSystemTest<O> extends CommonPr
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateWithExperimentIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateWithExperimentIdentifierSystemTest.java
index 24d49c8ebb27892f623523e5724d1ab0d223b1dd..24ae61a76996eb60a87b06c248c884d91ff96d34 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateWithExperimentIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateWithExperimentIdentifierSystemTest.java
@@ -65,7 +65,10 @@ public class NewDataSetsWithTypePredicateWithExperimentIdentifierSystemTest exte
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateWithSampleIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateWithSampleIdentifierSystemTest.java
index 5ee8cc700e1c8cb1aeac54f741ef866c7aca4432..b3c22155c30bcfd0fc227a63990dec241e0328f9 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateWithSampleIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewDataSetsWithTypePredicateWithSampleIdentifierSystemTest.java
@@ -71,7 +71,10 @@ public class NewDataSetsWithTypePredicateWithSampleIdentifierSystemTest extends
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateSystemTest.java
index c51329a3db60bb7f8bef4943c6f1dc22937f9109..d1620dde845cdbc23459f161bf2252464762a964 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateSystemTest.java
@@ -36,19 +36,37 @@ public abstract class NewExternalDataPredicateSystemTest<O> extends CommonPredic
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No new data set specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No new data set specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
 
             };
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithParentDataSetCodesSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithParentDataSetCodesSystemTest.java
index 2931ffae5999ba3357ab53c20d53cacc8f438e81..43f0a39e4faa87203f40dff28955948989c39927 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithParentDataSetCodesSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithParentDataSetCodesSystemTest.java
@@ -68,7 +68,10 @@ public class NewExternalDataPredicateWithParentDataSetCodesSystemTest extends Ne
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithSampleIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithSampleIdentifierSystemTest.java
index a43f25a11ab465be272f382ed03b37e44acd1c94..2953f8fcf1be0ea5064cf4554da474df27833b60 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithSampleIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithSampleIdentifierSystemTest.java
@@ -74,7 +74,10 @@ public class NewExternalDataPredicateWithSampleIdentifierSystemTest extends NewE
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (SampleKind.SHARED_READ_WRITE.equals(param))
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (SampleKind.SHARED_READ_WRITE.equals(param))
                     {
                         if (user.isInstanceUser())
                         {
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithSamplePermIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithSamplePermIdSystemTest.java
index 376d846673f0f3c0d5edc97ac4ca6a857c3e0da6..435f21e92f753518bc9e618ec8ba87c8e714c922 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithSamplePermIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/dataset/NewExternalDataPredicateWithSamplePermIdSystemTest.java
@@ -74,7 +74,10 @@ public class NewExternalDataPredicateWithSamplePermIdSystemTest extends NewExter
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/DeletionTechIdCollectionPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/DeletionTechIdCollectionPredicateSystemTest.java
index 2f9267ec1668cdb97de2913acdf366efb08fce87..bd90af6115190d42223bbee1e8c2949fcab2ad90 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/DeletionTechIdCollectionPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/DeletionTechIdCollectionPredicateSystemTest.java
@@ -74,19 +74,37 @@ public abstract class DeletionTechIdCollectionPredicateSystemTest extends Common
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No deletion technical id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No deletion technical id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/RevertDeletionPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/RevertDeletionPredicateSystemTest.java
index 1b74cff00164b15bf8c54eed0e8b95c78de2364c..584117de94b3b78a2045b9cb62dc882302b93454 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/RevertDeletionPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/RevertDeletionPredicateSystemTest.java
@@ -74,7 +74,10 @@ public abstract class RevertDeletionPredicateSystemTest extends CommonPredicateS
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
@@ -86,13 +89,25 @@ public abstract class RevertDeletionPredicateSystemTest extends CommonPredicateS
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No revert deletion technical id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No revert deletion technical id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/V3DeletionIdPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/V3DeletionIdPredicateSystemTest.java
index cecb827b1dba7ee867a3caa4069cc0133dfd728d..08c7cd41649c056d923b8810cdd31ca3dc4c86e1 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/V3DeletionIdPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/deletion/V3DeletionIdPredicateSystemTest.java
@@ -74,19 +74,37 @@ public abstract class V3DeletionIdPredicateSystemTest extends CommonPredicateSys
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No v3 deletion id object specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No v3 deletion id object specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentAugmentedCodePredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentAugmentedCodePredicateSystemTest.java
index 4490ffbe28c671fd33bd1bf413e112a0b07ede9a..7315944aceaeff6b61ef7a939406e32b74f7f3a6 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentAugmentedCodePredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentAugmentedCodePredicateSystemTest.java
@@ -60,13 +60,22 @@ public class ExperimentAugmentedCodePredicateSystemTest extends CommonPredicateS
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No experiment specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No experiment specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateSystemTest.java
index 4bd3bc3c2ccb3d1034019fa821ffeee56e73d120..79dd01571aa38641cb18c88de4823e6955248c65 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateSystemTest.java
@@ -47,7 +47,13 @@ public abstract class ExperimentIdPredicateSystemTest<O extends IExperimentId> e
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No experiment id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No experiment id specified.");
+                    }
                 }
 
             };
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithAugmentedCodeSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithAugmentedCodeSystemTest.java
index a0b82aca2cb0972a777a228204efdf2df19bed6c..505aea537cb0b448bce580416be4c46844ad15c6 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithAugmentedCodeSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithAugmentedCodeSystemTest.java
@@ -51,7 +51,10 @@ public class ExperimentIdPredicateWithAugmentedCodeSystemTest extends Experiment
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithPermIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithPermIdSystemTest.java
index 19e55cfc79c606c454e9224dcc9749feca1c21de..765e175be2030a8d361a9feb93312f61fa782182 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithPermIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithPermIdSystemTest.java
@@ -51,7 +51,13 @@ public class ExperimentIdPredicateWithPermIdSystemTest extends ExperimentIdPredi
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithTechIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithTechIdSystemTest.java
index be843897d7f2a3badf38d74a0cdbfa64acf54561..01168a38e81e455ab35b985b3d9243f3a8077d67 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithTechIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentIdPredicateWithTechIdSystemTest.java
@@ -51,7 +51,13 @@ public class ExperimentIdPredicateWithTechIdSystemTest extends ExperimentIdPredi
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertUserFailureExceptionThatExperimentDoesNotExist(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertUserFailureExceptionThatExperimentDoesNotExist(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentListPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentListPredicateSystemTest.java
index 7bdc9bb04ac82970c110fb9c6fa7454de2348da7..cac493d95395108287cd054403e5cab165a449a1 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentListPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentListPredicateSystemTest.java
@@ -86,13 +86,25 @@ public class ExperimentListPredicateSystemTest extends CommonPredicateSystemTest
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No experiment specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No experiment specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPEOrNullPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPEOrNullPredicateSystemTest.java
index 60b555a27ec24d62fe9a4a27c840eedaa2133816..878401e3b1f6e1e92e4d94deb2a159b6b5510636 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPEOrNullPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPEOrNullPredicateSystemTest.java
@@ -72,13 +72,22 @@ public class ExperimentPEOrNullPredicateSystemTest extends CommonPredicateSystem
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPEPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPEPredicateSystemTest.java
index 713de47733877e5bf4fa9456008cc6da821e32e6..5ddb08586c1acb412b6287ec99c72ef4f23d086f 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPEPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPEPredicateSystemTest.java
@@ -72,7 +72,10 @@ public class ExperimentPEPredicateSystemTest extends CommonPredicateSystemTest<E
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
@@ -84,7 +87,10 @@ public class ExperimentPEPredicateSystemTest extends CommonPredicateSystemTest<E
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPermIdPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPermIdPredicateSystemTest.java
index b9440a5ae36399efffeb3855be9a4dc938a5438f..48c25ddc30ad7ac2c65241c6673391bf156bab37 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPermIdPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentPermIdPredicateSystemTest.java
@@ -62,13 +62,25 @@ public class ExperimentPermIdPredicateSystemTest extends CommonPredicateSystemTe
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No experiment perm id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No experiment perm id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentTechIdCollectionPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentTechIdCollectionPredicateSystemTest.java
index e64963890e65745efc1bfd666e24279ccb7fec56..5acd8e07ea8fe28f2d1d5f58a095f6c3e64564a6 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentTechIdCollectionPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentTechIdCollectionPredicateSystemTest.java
@@ -68,19 +68,37 @@ public class ExperimentTechIdCollectionPredicateSystemTest extends CommonPredica
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No EXPERIMENT technical id collection specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No EXPERIMENT technical id collection specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentTechIdPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentTechIdPredicateSystemTest.java
index 20a94c30f7429a38abba6dd7cf42f0d77390562b..85a80c818d03b9ac609cab9e0e2f453c34d6ee1c 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentTechIdPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentTechIdPredicateSystemTest.java
@@ -62,13 +62,25 @@ public class ExperimentTechIdPredicateSystemTest extends CommonPredicateSystemTe
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No technical id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No technical id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertUserFailureExceptionThatExperimentDoesNotExist(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertUserFailureExceptionThatExperimentDoesNotExist(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateSystemTest.java
index a53c08266fbbe8bcb7e321cab047c66006b707ce..0291230074587587acf1f71d3f102a0700d7e908 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateSystemTest.java
@@ -46,7 +46,13 @@ public abstract class ExperimentUpdatesPredicateSystemTest extends CommonPredica
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No experiment updates specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No experiment updates specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateWithExperimentTechIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateWithExperimentTechIdSystemTest.java
index e3a2c7b741aeea03ef98fa7bbcd28b0c82c97ab7..4cfe68d40ece2c75f1fc0438b505021b32a19540 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateWithExperimentTechIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateWithExperimentTechIdSystemTest.java
@@ -56,7 +56,10 @@ public class ExperimentUpdatesPredicateWithExperimentTechIdSystemTest extends Ex
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateWithProjectIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateWithProjectIdentifierSystemTest.java
index ac87f62a8e0edbdd94a98b481d50cb14379d8383..7ea3013f2b5a7e3f54137e37474dad41a9efc16a 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateWithProjectIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/ExperimentUpdatesPredicateWithProjectIdentifierSystemTest.java
@@ -62,14 +62,19 @@ public class ExperimentUpdatesPredicateWithProjectIdentifierSystemTest extends E
     @Override
     protected void evaluateObjects(ProjectAuthorizationUser user, List<ExperimentUpdatesDTO> objects, Object param)
     {
-        // we want to test projectIdentifier access only therefore here we add assignment to have access to experimentId
+        if (user.isDisabledProjectUser())
+        {
+            super.evaluateObjects(user, objects, param);
+        } else
+        {
+            // we want to test projectIdentifier access only therefore here we add assignment to have access to experimentId
 
-        Set<RoleAssignmentPE> roleAssignments = new HashSet<RoleAssignmentPE>();
-        roleAssignments.addAll(user.getSessionProvider().getSession().tryGetPerson().getRoleAssignments());
-        roleAssignments.add(createSpaceRole(RoleCode.ADMIN, getCommonService().tryFindSpace("TEST-SPACE")));
-        user.getSessionProvider().getSession().tryGetPerson().setRoleAssignments(roleAssignments);
-
-        super.evaluateObjects(user, objects, param);
+            Set<RoleAssignmentPE> roleAssignments = new HashSet<RoleAssignmentPE>();
+            roleAssignments.addAll(user.getSessionProvider().getSession().tryGetPerson().getRoleAssignments());
+            roleAssignments.add(createSpaceRole(RoleCode.ADMIN, getCommonService().tryFindSpace("TEST-SPACE")));
+            user.getSessionProvider().getSession().tryGetPerson().setRoleAssignments(roleAssignments);
+            super.evaluateObjects(user, objects, param);
+        }
     }
 
     @Override
@@ -80,7 +85,10 @@ public class ExperimentUpdatesPredicateWithProjectIdentifierSystemTest extends E
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/NewExperimentPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/NewExperimentPredicateSystemTest.java
index e3a2db3138df573fa72935e0de57e8b7ee95f78f..604b94ab7ae51d179250291482cc3df825e2f4d9 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/NewExperimentPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/NewExperimentPredicateSystemTest.java
@@ -60,13 +60,25 @@ public class NewExperimentPredicateSystemTest extends CommonPredicateSystemTest<
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No new experiment specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No new experiment specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/NewExperimentsWithTypePredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/NewExperimentsWithTypePredicateSystemTest.java
index aa4e0c6491d67aab4d4feb859666398d6a631008..e47e18e5a1f7a6fdc335a1af3cdc1329609b0336 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/NewExperimentsWithTypePredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/NewExperimentsWithTypePredicateSystemTest.java
@@ -72,19 +72,34 @@ public class NewExperimentsWithTypePredicateSystemTest extends CommonPredicateSy
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/UpdatedExperimentsWithTypePredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/UpdatedExperimentsWithTypePredicateSystemTest.java
index f6e7a8fa16bca65d40c68018ac0ec9ac3cf7b654..28df66be2dd3fa868c969abcf4d811166fcce72c 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/UpdatedExperimentsWithTypePredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/experiment/UpdatedExperimentsWithTypePredicateSystemTest.java
@@ -74,19 +74,34 @@ public class UpdatedExperimentsWithTypePredicateSystemTest extends CommonPredica
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/NewProjectPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/NewProjectPredicateSystemTest.java
index df9ef39f497ef0fa27913b2703e6c2f90f30d508..39bedd3dc208641eef0f92fb52c615c0b4d7fbdc 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/NewProjectPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/NewProjectPredicateSystemTest.java
@@ -60,13 +60,25 @@ public class NewProjectPredicateSystemTest extends CommonPredicateSystemTest<New
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No new project specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No new project specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectAugmentedCodePredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectAugmentedCodePredicateSystemTest.java
index 22803bd2f1e15697d9909da19bb5552bfb7b54da..34aebc2bd39abae2432454ffc4ff202d0273c033 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectAugmentedCodePredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectAugmentedCodePredicateSystemTest.java
@@ -59,13 +59,22 @@ public class ProjectAugmentedCodePredicateSystemTest extends CommonPredicateSyst
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithIdentifierSystemTest.java
index 9c84860978a64497539398719ed5592e89a7dc3f..fabf19b19d4f725643a2de9b1066fa6e7f7d7610 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithIdentifierSystemTest.java
@@ -60,13 +60,22 @@ public class ProjectIdPredicateWithIdentifierSystemTest extends CommonPredicateS
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithPermIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithPermIdSystemTest.java
index 527e48a6c5eaf2c78241b0a9105705b26b021922..50e360313c7aa685af2e5a00bd7cdf03ccd80937 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithPermIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithPermIdSystemTest.java
@@ -60,13 +60,25 @@ public class ProjectIdPredicateWithPermIdSystemTest extends CommonPredicateSyste
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithTechIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithTechIdSystemTest.java
index 402130089633e77906b3e042c849e76f46f90689..8acec6ef2278a0b6b387b57599a939f55fe4e86d 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithTechIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdPredicateWithTechIdSystemTest.java
@@ -60,13 +60,25 @@ public class ProjectIdPredicateWithTechIdSystemTest extends CommonPredicateSyste
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertUserFailureExceptionThatProjectDoesNotExist(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertUserFailureExceptionThatProjectDoesNotExist(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdentifierExistingSpacePredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdentifierExistingSpacePredicateSystemTest.java
index 783bf89d1ff1421e8978f235d572d91c286aa062..afbd04c0a95cd19a416ce0d8b05743b590a0d0df 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdentifierExistingSpacePredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdentifierExistingSpacePredicateSystemTest.java
@@ -60,13 +60,25 @@ public class ProjectIdentifierExistingSpacePredicateSystemTest extends CommonPre
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdentifierPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdentifierPredicateSystemTest.java
index 2e58bb5a167143b152dd4a219df428f90dc844fa..24df33709f1fa4e2205559b4217682873e0ff891 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdentifierPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectIdentifierPredicateSystemTest.java
@@ -60,13 +60,22 @@ public class ProjectIdentifierPredicateSystemTest extends CommonPredicateSystemT
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPEPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPEPredicateSystemTest.java
index 88b9f0a5e4fc70998e856337e5c54df8b07807c0..83d6b570054903d3bdabce41fb5f7fb8aba0dd76 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPEPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPEPredicateSystemTest.java
@@ -65,13 +65,22 @@ public class ProjectPEPredicateSystemTest extends CommonPredicateSystemTest<Proj
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPermIdPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPermIdPredicateSystemTest.java
index 180c35fa01f27daabaf7306b4e1ad3b93e65bb4c..99b70128db7e9a8db574f317fb653cb898869baf 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPermIdPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPermIdPredicateSystemTest.java
@@ -60,13 +60,25 @@ public class ProjectPermIdPredicateSystemTest extends CommonPredicateSystemTest<
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project perm id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project perm id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPermIdStringPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPermIdStringPredicateSystemTest.java
index 66c25488d00e06c88b918b55cc9c8ab72dfbe6a9..3cf21bb59dea68544a3a8a4574d34fb412848b96 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPermIdStringPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPermIdStringPredicateSystemTest.java
@@ -59,13 +59,25 @@ public class ProjectPermIdStringPredicateSystemTest extends CommonPredicateSyste
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project perm id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project perm id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPredicateSystemTest.java
index e8a3468a1f45839ee705e10715843e4299a19c14..5c3e0bb375e0a414b8bb507ee8967dd6a567c4ba 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectPredicateSystemTest.java
@@ -60,13 +60,22 @@ public class ProjectPredicateSystemTest extends CommonPredicateSystemTest<Projec
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectTechIdCollectionPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectTechIdCollectionPredicateSystemTest.java
index 42548df128326483dba436b04a508d6deb0c3849..c8b7a592e6f6df252369b371ee189ac665821593 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectTechIdCollectionPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectTechIdCollectionPredicateSystemTest.java
@@ -66,19 +66,37 @@ public class ProjectTechIdCollectionPredicateSystemTest extends CommonPredicateS
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No PROJECT technical id collection specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No PROJECT technical id collection specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectTechIdPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectTechIdPredicateSystemTest.java
index 0cf62c72e84cbc5426a6f4489dde7f2de88c382a..631b83dbff175410eb988cf4c6454436c774cb54 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectTechIdPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectTechIdPredicateSystemTest.java
@@ -60,13 +60,25 @@ public class ProjectTechIdPredicateSystemTest extends CommonPredicateSystemTest<
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No technical id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No technical id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertUserFailureExceptionThatProjectDoesNotExist(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertUserFailureExceptionThatProjectDoesNotExist(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithIdentifierSystemTest.java
index a906c36c808a0f1af9c778c49faaf36564cfa1fe..b6b864fd92f8e71196648e0e7f4b6c453a7bdfad 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithIdentifierSystemTest.java
@@ -64,13 +64,22 @@ public class ProjectUpdatesPredicateWithIdentifierSystemTest extends CommonPredi
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project updates specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project updates specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithPermIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithPermIdSystemTest.java
index d23b9b022ca01c1fc1338a6fb5d2d341135bff44..7fc6ff4ff6bf5730a85183f6047a329119876f9b 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithPermIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithPermIdSystemTest.java
@@ -64,13 +64,25 @@ public class ProjectUpdatesPredicateWithPermIdSystemTest extends CommonPredicate
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project updates specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project updates specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithTechIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithTechIdSystemTest.java
index b7b9535987e463845dd28cd7b8f731fa5f15257d..ea89d570b7d3db3c9bf5c7abfe81f32b65f16e0a 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithTechIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/project/ProjectUpdatesPredicateWithTechIdSystemTest.java
@@ -65,13 +65,25 @@ public class ProjectUpdatesPredicateWithTechIdSystemTest extends CommonPredicate
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No project updates specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No project updates specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertUserFailureExceptionThatProjectDoesNotExist(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertUserFailureExceptionThatProjectDoesNotExist(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ExistingSampleIdentifierPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ExistingSampleIdentifierPredicateSystemTest.java
index ef3f69d8a149028bab87974c4216fa31d8498613..afdf4b1165868f589f1b9d4f09b4c697ea0815f7 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ExistingSampleIdentifierPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ExistingSampleIdentifierPredicateSystemTest.java
@@ -44,7 +44,13 @@ public class ExistingSampleIdentifierPredicateSystemTest extends SampleIdentifie
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateSystemTest.java
index 20d952ecc25106df8d24a55cd7de1083f5592a31..d5b3caa373d5b8113cf00bfc53629eeee665123f 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateSystemTest.java
@@ -46,7 +46,13 @@ public abstract class ListSampleCriteriaPredicateSystemTest extends CommonPredic
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample listing criteria specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample listing criteria specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithExperimentSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithExperimentSystemTest.java
index d0148c2a6e6ded868b2df016d63f4a3312c75775..4c92618d1444c956aac601ad4708a29d6d0ae615 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithExperimentSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithExperimentSystemTest.java
@@ -52,7 +52,13 @@ public class ListSampleCriteriaPredicateWithExperimentSystemTest extends ListSam
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertUserFailureExceptionThatExperimentDoesNotExist(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertUserFailureExceptionThatExperimentDoesNotExist(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithSampleSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithSampleSystemTest.java
index a446607314fd551594cf6e46c50c4700aa21ec1f..afa1a5178f491271db94c8278ea09043bba495e9 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithSampleSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithSampleSystemTest.java
@@ -69,7 +69,13 @@ public abstract class ListSampleCriteriaPredicateWithSampleSystemTest extends Li
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithSpaceSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithSpaceSystemTest.java
index e983328f03d2240e4e69c6561adb94c24967a991..e1de513cc35122fc6e0dcd36a13fae8c2fecc28c 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithSpaceSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSampleCriteriaPredicateWithSpaceSystemTest.java
@@ -55,7 +55,13 @@ public class ListSampleCriteriaPredicateWithSpaceSystemTest extends ListSampleCr
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSamplesByPropertyPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSamplesByPropertyPredicateSystemTest.java
index 244f9039f83864cff72fe911b22728b80cddeba0..d3d9fec671bef3c292316ce5f0b324b0c03be665 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSamplesByPropertyPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/ListSamplesByPropertyPredicateSystemTest.java
@@ -60,13 +60,22 @@ public class ListSamplesByPropertyPredicateSystemTest extends CommonPredicateSys
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No list samples by property specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No list samples by property specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateSystemTest.java
index edb5b9e375f9a52083bced96b7f469bdb972bc7d..062e8836a1f561900a1c53e324ec9135b9f4aa55 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateSystemTest.java
@@ -46,7 +46,13 @@ public abstract class NewSamplePredicateSystemTest extends CommonPredicateSystem
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No new sample specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No new sample specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithExperimentIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithExperimentIdentifierSystemTest.java
index 5ae3fc6d1faae867acd1fcfe2c8d69f7fcb19912..f527aacf73cdd850aa61dc0c4ced9070e75e5e66 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithExperimentIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithExperimentIdentifierSystemTest.java
@@ -56,7 +56,13 @@ public class NewSamplePredicateWithExperimentIdentifierSystemTest extends NewSam
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithProjectIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithProjectIdentifierSystemTest.java
index 8fe48fb7efd5f81d74eae5d9e00f73994e33d17a..a9e86898c644187a4b43cc76591dfbc6796445e1 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithProjectIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithProjectIdentifierSystemTest.java
@@ -53,7 +53,13 @@ public class NewSamplePredicateWithProjectIdentifierSystemTest extends NewSample
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithSampleSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithSampleSystemTest.java
index 093fac8d3407662ff6a7785e6d252b34b668fa77..2dd942b146af345d145751ae05b949b5992671a7 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithSampleSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplePredicateWithSampleSystemTest.java
@@ -41,7 +41,10 @@ public abstract class NewSamplePredicateWithSampleSystemTest extends NewSamplePr
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (SampleKind.SHARED_READ_WRITE.equals(param) && false == user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (SampleKind.SHARED_READ_WRITE.equals(param) && false == user.isInstanceUser())
                     {
                         assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithContainerIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithContainerIdentifierSystemTest.java
index 92d47db6accd4431a5e47ec97a25c25b59ba5051..5a5dbd2b876cc28670b689bbc2b34d33acae6889 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithContainerIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithContainerIdentifierSystemTest.java
@@ -53,7 +53,13 @@ public class NewSamplesWithTypePredicateWithContainerIdentifierSystemTest extend
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithExperimentIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithExperimentIdentifierSystemTest.java
index a490fdb0cf0848d040bf163702798e847f443979..5d26d59157cba53ba6fd67b69e8bc6ba439f72ca 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithExperimentIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithExperimentIdentifierSystemTest.java
@@ -53,7 +53,13 @@ public class NewSamplesWithTypePredicateWithExperimentIdentifierSystemTest exten
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithParentIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithParentIdentifierSystemTest.java
index b8ac384974bb7c424ad296f7167a35e306b08263..3eb4a6e686fe39b23db499a891a07a75b7e5ad84 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithParentIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithParentIdentifierSystemTest.java
@@ -53,7 +53,13 @@ public class NewSamplesWithTypePredicateWithParentIdentifierSystemTest extends N
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithProjectIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithProjectIdentifierSystemTest.java
index d8bc7518d5e9a1f1f9b4d34f782b09684c22536b..9e6ad07ad96d01b4120f059f87a5ea61d7918a99 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithProjectIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithProjectIdentifierSystemTest.java
@@ -53,7 +53,13 @@ public class NewSamplesWithTypePredicateWithProjectIdentifierSystemTest extends
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithSampleIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithSampleIdentifierSystemTest.java
index c8b650c9cf2f0b5a4be3ee0aa0f3a230147f6b59..a087b627bfb969be534b02deac36aca7b526d91d 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithSampleIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/NewSamplesWithTypePredicateWithSampleIdentifierSystemTest.java
@@ -53,7 +53,13 @@ public class NewSamplesWithTypePredicateWithSampleIdentifierSystemTest extends N
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleAugmentedCodePredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleAugmentedCodePredicateSystemTest.java
index e092d3b326182c022535e02ac0c2675e3e7a3d9e..28a94df1ec79900e1bb2a625052539a6c3a24e57 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleAugmentedCodePredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleAugmentedCodePredicateSystemTest.java
@@ -96,13 +96,22 @@ public class SampleAugmentedCodePredicateSystemTest extends CommonPredicateSyste
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateSystemTest.java
index d8d1828433cb01618196b52dfd5925c329a5b138..5990a6c25f371e1fcd6cbb752e780d674f6b34b5 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateSystemTest.java
@@ -52,7 +52,13 @@ public abstract class SampleIdPredicateSystemTest extends CommonPredicateSystemT
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample id specified.");
+                    }
                 }
 
             };
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSampleIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSampleIdentifierSystemTest.java
index ff1525afcca35a8da44746eaf3d7ffd2d5704f05..66eea0f5907402641c0c6fdc86eb898086194aaf 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSampleIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSampleIdentifierSystemTest.java
@@ -54,7 +54,10 @@ public class SampleIdPredicateWithSampleIdentifierSystemTest extends SampleIdPre
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSamplePermIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSamplePermIdSystemTest.java
index a20221f990817446784fd2b8ee59a2726bbbc9eb..3ea074f68691c4eb6a662bb9afc9b7727d0f3dec 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSamplePermIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSamplePermIdSystemTest.java
@@ -55,7 +55,13 @@ public class SampleIdPredicateWithSamplePermIdSystemTest extends SampleIdPredica
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, AuthorizationFailureException.class, ".*There is no sample with perm id 'IDONTEXIST'.*");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, AuthorizationFailureException.class, ".*There is no sample with perm id 'IDONTEXIST'.*");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSampleTechIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSampleTechIdSystemTest.java
index 4c304ec5d2d60e8fa3c1d0772faecb41a036a7de..91b3f706721123c6932f28314c4fe07676abe08d 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSampleTechIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdPredicateWithSampleTechIdSystemTest.java
@@ -54,7 +54,13 @@ public class SampleIdPredicateWithSampleTechIdSystemTest extends SampleIdPredica
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdentifierCollectionPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdentifierCollectionPredicateSystemTest.java
index b9a968ca8c36a4e04f7535558b33533cc9d6d14f..3136af16c336a12a4980baecc298ba77cffbc264 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdentifierCollectionPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdentifierCollectionPredicateSystemTest.java
@@ -51,7 +51,13 @@ public class SampleIdentifierCollectionPredicateSystemTest extends SampleIdentif
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample identifier specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample identifier specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdentifierPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdentifierPredicateSystemTest.java
index 50ac8c962962e93d52ef90a3816c548c1e7e007e..6f083a64db79b0266ca02e12c11993eb3f0a9f16 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdentifierPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleIdentifierPredicateSystemTest.java
@@ -67,13 +67,22 @@ public class SampleIdentifierPredicateSystemTest extends CommonPredicateSystemTe
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample identifier specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample identifier specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleListPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleListPredicateSystemTest.java
index 460d0a5805b5379309f6ed66f307078e6c9d056b..35bb3d34f9ac9d76dec2d9dbc8163da9f0d8c65f 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleListPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleListPredicateSystemTest.java
@@ -73,19 +73,34 @@ public class SampleListPredicateSystemTest extends CommonPredicateSystemTest<Sam
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (SampleKind.SHARED_READ.equals(param))
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (SampleKind.SHARED_READ.equals(param))
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePEOrNullPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePEOrNullPredicateSystemTest.java
index e223660566ecc60e538ef520bac99df7c751e882..f57ca5aeec0212438823198435256ac315514e0d 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePEOrNullPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePEOrNullPredicateSystemTest.java
@@ -50,13 +50,22 @@ public class SamplePEOrNullPredicateSystemTest extends SamplePEPredicateSystemTe
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePEPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePEPredicateSystemTest.java
index 9a96f9ffb5db99a2b61323ea56f910e574855af5..a7abbaf642b81104466f6b716a87e57bae05a8b8 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePEPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePEPredicateSystemTest.java
@@ -105,7 +105,10 @@ public class SamplePEPredicateSystemTest extends CommonPredicateSystemTest<Sampl
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
@@ -117,7 +120,10 @@ public class SamplePEPredicateSystemTest extends CommonPredicateSystemTest<Sampl
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePermIdPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePermIdPredicateSystemTest.java
index 59d472c1bc1fad8eae63ce7725dd635e931c84fc..78227d2734cbefd35a0ad5a2945fb50478da0fd7 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePermIdPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePermIdPredicateSystemTest.java
@@ -68,13 +68,25 @@ public class SamplePermIdPredicateSystemTest extends CommonPredicateSystemTest<P
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample perm id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample perm id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, AuthorizationFailureException.class, ".*There is no sample with perm id 'IDONTEXIST'.*");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, AuthorizationFailureException.class, ".*There is no sample with perm id 'IDONTEXIST'.*");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePredicateSystemTest.java
index 9c75653df73c15344e45ed94f0f4c30e4092dc69..faad316820811a74f20c54501abdac882f92a14b 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SamplePredicateSystemTest.java
@@ -67,13 +67,22 @@ public class SamplePredicateSystemTest extends CommonPredicateSystemTest<Sample>
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (SampleKind.SHARED_READ.equals(param))
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (SampleKind.SHARED_READ.equals(param))
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleTechIdCollectionPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleTechIdCollectionPredicateSystemTest.java
index 5e544bde98276518267818e402cca94290deb9fc..60ddf7dfebb1916d4432c9789591b2548f2d304e 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleTechIdCollectionPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleTechIdCollectionPredicateSystemTest.java
@@ -73,19 +73,37 @@ public class SampleTechIdCollectionPredicateSystemTest extends CommonPredicateSy
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample technical ids specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample technical ids specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleTechIdPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleTechIdPredicateSystemTest.java
index 9d32268917854a04202562d90fe58d66f1346ea0..2225ff49f6decb4ae24ac94b1f93d29d260349b7 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleTechIdPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleTechIdPredicateSystemTest.java
@@ -67,13 +67,25 @@ public class SampleTechIdPredicateSystemTest extends CommonPredicateSystemTest<T
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample technical id specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample technical id specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithContainerIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithContainerIdentifierSystemTest.java
index 587cc39575f4e24fb1c17d905d00eb627fa22099..216266866581333f106c574f34da0b4c37b2e1d2 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithContainerIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithContainerIdentifierSystemTest.java
@@ -51,7 +51,10 @@ public class SampleUpdatesCollectionPredicateWithContainerIdentifierSystemTest e
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
@@ -63,7 +66,13 @@ public class SampleUpdatesCollectionPredicateWithContainerIdentifierSystemTest e
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample updates collection specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample updates collection specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithExperimentIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithExperimentIdentifierSystemTest.java
index e46042b4e513c9573f2c42fc56f413bb68e0a32f..29f53cf79941ace4f78a78c62ca8776a8fbe3bea 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithExperimentIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithExperimentIdentifierSystemTest.java
@@ -51,7 +51,10 @@ public class SampleUpdatesCollectionPredicateWithExperimentIdentifierSystemTest
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
@@ -63,7 +66,13 @@ public class SampleUpdatesCollectionPredicateWithExperimentIdentifierSystemTest
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample updates collection specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample updates collection specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithProjectIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithProjectIdentifierSystemTest.java
index f60fc001189e126cbfb5c9cd6eadff7d4d575918..d89a2fb7ca63b90589bd3bd3d51901eac0af1d54 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithProjectIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithProjectIdentifierSystemTest.java
@@ -51,7 +51,10 @@ public class SampleUpdatesCollectionPredicateWithProjectIdentifierSystemTest ext
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
@@ -63,7 +66,13 @@ public class SampleUpdatesCollectionPredicateWithProjectIdentifierSystemTest ext
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample updates collection specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample updates collection specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithSampleIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithSampleIdentifierSystemTest.java
index 57611f12e9d6c58fba2c6d3584c64033ac1c4c43..180e98511a40f32700c954ccecbc5ef9a82c7851 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithSampleIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithSampleIdentifierSystemTest.java
@@ -51,7 +51,10 @@ public class SampleUpdatesCollectionPredicateWithSampleIdentifierSystemTest exte
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
@@ -63,7 +66,13 @@ public class SampleUpdatesCollectionPredicateWithSampleIdentifierSystemTest exte
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample updates collection specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample updates collection specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithSampleTechIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithSampleTechIdSystemTest.java
index f934916e12c806f065b38f1045fb0759bbb0c358..d358ab39c36da0a3b51835bfdf38a056526ec6d7 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithSampleTechIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesCollectionPredicateWithSampleTechIdSystemTest.java
@@ -51,7 +51,10 @@ public class SampleUpdatesCollectionPredicateWithSampleTechIdSystemTest extends
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
@@ -63,7 +66,13 @@ public class SampleUpdatesCollectionPredicateWithSampleTechIdSystemTest extends
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample updates collection specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample updates collection specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateSystemTest.java
index c04e8568287222181e31eefbfa3046af8535a5fc..b8bfbe14ee69585eac34b40678c25d99d397e3a2 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateSystemTest.java
@@ -46,7 +46,13 @@ public abstract class SampleUpdatesPredicateSystemTest extends CommonPredicateSy
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No sample updates specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No sample updates specified.");
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithContainerIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithContainerIdentifierSystemTest.java
index e83b6dab44488e6843a13a5311bb3495e011800b..b1f6b8bb184e0497d8f7e8c2dc75fbcfd0084b1f 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithContainerIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithContainerIdentifierSystemTest.java
@@ -53,7 +53,10 @@ public class SampleUpdatesPredicateWithContainerIdentifierSystemTest extends Sam
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithExperimentIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithExperimentIdentifierSystemTest.java
index f42460ea144b5c35a3ad61b36fd0a94f55bd96be..1a78156aa08ac79c79ad1a43bc160d7e4e79444d 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithExperimentIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithExperimentIdentifierSystemTest.java
@@ -54,7 +54,10 @@ public class SampleUpdatesPredicateWithExperimentIdentifierSystemTest extends Sa
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithProjectIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithProjectIdentifierSystemTest.java
index 54a4c6f00629996b364291e526c10c12f93edcda..1befad30c57d7a2327d2e6e18b814ac19c91d2f1 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithProjectIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithProjectIdentifierSystemTest.java
@@ -52,7 +52,10 @@ public class SampleUpdatesPredicateWithProjectIdentifierSystemTest extends Sampl
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithSampleIdentifierSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithSampleIdentifierSystemTest.java
index a5a0e69810be65debff2db365584fbad0a96a4ad..c65d9d414f33e7cdb3fd5f4c5beb61c1a205e211 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithSampleIdentifierSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithSampleIdentifierSystemTest.java
@@ -53,7 +53,10 @@ public class SampleUpdatesPredicateWithSampleIdentifierSystemTest extends Sample
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithSampleTechIdSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithSampleTechIdSystemTest.java
index c54a815ed2b0ae7619767306d2bb3cff31e913dc..82b3b99e84197821a3072fe88527e3dde9f75c02 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithSampleTechIdSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/sample/SampleUpdatesPredicateWithSampleTechIdSystemTest.java
@@ -53,7 +53,13 @@ public class SampleUpdatesPredicateWithSampleTechIdSystemTest extends SampleUpda
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/space/SpaceIdentifierPredicateSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/space/SpaceIdentifierPredicateSystemTest.java
index f6fa4e01cff1d776c3c8241357247ff338276269..bdd0f55f6f702e77f41bb70a99ef6d160b725a5d 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/space/SpaceIdentifierPredicateSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/predicate/space/SpaceIdentifierPredicateSystemTest.java
@@ -60,13 +60,22 @@ public class SpaceIdentifierPredicateSystemTest extends CommonPredicateSystemTes
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No space identifier specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No space identifier specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestAssertionsDefault.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestAssertionsDefault.java
index b690afbe71e44ddbddba7757799e7d2ef76a2f74..1fa8be989f3d8c44795abe328bbf4e0f600767f0 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestAssertionsDefault.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestAssertionsDefault.java
@@ -33,8 +33,15 @@ public class CommonValidatorSystemTestAssertionsDefault<O> extends CommonValidat
     @Override
     public void assertWithNullObject(ProjectAuthorizationUser user, O result, Throwable t, Object param)
     {
-        CommonAuthorizationSystemTest.assertNoException(t);
         CommonAuthorizationSystemTest.assertNull(result);
+
+        if (user.isDisabledProjectUser())
+        {
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+        } else
+        {
+            CommonAuthorizationSystemTest.assertNoException(t);
+        }
     }
 
     @Override
@@ -51,20 +58,27 @@ public class CommonValidatorSystemTestAssertionsDefault<O> extends CommonValidat
 
     private void assertWithObject(ProjectAuthorizationUser user, O result, Throwable t, Object param, ProjectIdentifier project)
     {
-        CommonAuthorizationSystemTest.assertNoException(t);
-
-        if (user.isInstanceUser())
+        if (user.isDisabledProjectUser())
         {
-            CommonAuthorizationSystemTest.assertNotNull(result);
+            CommonAuthorizationSystemTest.assertNull(result);
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
         } else
         {
-            if (user.isSpaceUser(project.getSpaceCode())
-                    || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()))
+            CommonAuthorizationSystemTest.assertNoException(t);
+
+            if (user.isInstanceUser())
             {
                 CommonAuthorizationSystemTest.assertNotNull(result);
             } else
             {
-                CommonAuthorizationSystemTest.assertNull(result);
+                if (user.isSpaceUser(project.getSpaceCode())
+                        || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()))
+                {
+                    CommonAuthorizationSystemTest.assertNotNull(result);
+                } else
+                {
+                    CommonAuthorizationSystemTest.assertNull(result);
+                }
             }
         }
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestDataSetAssertions.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestDataSetAssertions.java
index dcfb884dba03ec4aa24b3746e101a4dc0b16d22d..bd59ac6b2d1e1c933ae5deb499555579fa81f750 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestDataSetAssertions.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestDataSetAssertions.java
@@ -50,37 +50,44 @@ public class CommonValidatorSystemTestDataSetAssertions<O> extends CommonValidat
 
     private void assertWithObject(ProjectAuthorizationUser user, O result, Throwable t, Object param, ProjectIdentifier project)
     {
-        CommonAuthorizationSystemTest.assertNoException(t);
-
-        if (DataSetKind.SPACE_SAMPLE.equals(param))
+        if (user.isDisabledProjectUser())
         {
-            if (user.isInstanceUser())
-            {
-                CommonAuthorizationSystemTest.assertNotNull(result);
-            } else
+            CommonAuthorizationSystemTest.assertNull(result);
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+        } else
+        {
+            CommonAuthorizationSystemTest.assertNoException(t);
+
+            if (DataSetKind.SPACE_SAMPLE.equals(param))
             {
-                if (user.isSpaceUser(project.getSpaceCode()))
+                if (user.isInstanceUser())
                 {
                     CommonAuthorizationSystemTest.assertNotNull(result);
                 } else
                 {
-                    CommonAuthorizationSystemTest.assertNull(result);
+                    if (user.isSpaceUser(project.getSpaceCode()))
+                    {
+                        CommonAuthorizationSystemTest.assertNotNull(result);
+                    } else
+                    {
+                        CommonAuthorizationSystemTest.assertNull(result);
+                    }
                 }
-            }
-        } else
-        {
-            if (user.isInstanceUser())
-            {
-                CommonAuthorizationSystemTest.assertNotNull(result);
             } else
             {
-                if (user.isSpaceUser(project.getSpaceCode())
-                        || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()))
+                if (user.isInstanceUser())
                 {
                     CommonAuthorizationSystemTest.assertNotNull(result);
                 } else
                 {
-                    CommonAuthorizationSystemTest.assertNull(result);
+                    if (user.isSpaceUser(project.getSpaceCode())
+                            || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()))
+                    {
+                        CommonAuthorizationSystemTest.assertNotNull(result);
+                    } else
+                    {
+                        CommonAuthorizationSystemTest.assertNull(result);
+                    }
                 }
             }
         }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestMaterialAssertions.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestMaterialAssertions.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b1f7359857f1aac6e27d13fee056d574f65ec79
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestMaterialAssertions.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator;
+
+import static ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.CommonAuthorizationSystemTest.AUTH_PROJECT_1;
+import static ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.CommonAuthorizationSystemTest.AUTH_SPACE_1;
+import static ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.CommonAuthorizationSystemTest.AUTH_SPACE_2;
+
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.CommonAuthorizationSystemTest;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.ProjectAuthorizationUser;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
+
+/**
+ * @author pkupczyk
+ */
+public class CommonValidatorSystemTestMaterialAssertions<O> extends CommonValidatorSystemTestAssertionsDelegate<O>
+{
+
+    public CommonValidatorSystemTestMaterialAssertions(CommonValidatorSystemTestAssertions<O> delegate)
+    {
+        super(delegate);
+    }
+
+    @Override
+    public void assertWithProject11Object(ProjectAuthorizationUser user, O result, Throwable t, Object param)
+    {
+        assertWithObject(user, result, t, param, new ProjectIdentifier(AUTH_SPACE_1, AUTH_PROJECT_1));
+    }
+
+    @Override
+    public void assertWithProject21Object(ProjectAuthorizationUser user, O result, Throwable t, Object param)
+    {
+        assertWithObject(user, result, t, param, new ProjectIdentifier(AUTH_SPACE_2, AUTH_PROJECT_1));
+    }
+
+    private void assertWithObject(ProjectAuthorizationUser user, O result, Throwable t, Object param, ProjectIdentifier project)
+    {
+        if (user.isDisabledProjectUser())
+        {
+            CommonAuthorizationSystemTest.assertNull(result);
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+        } else
+        {
+            CommonAuthorizationSystemTest.assertNotNull(result);
+            CommonAuthorizationSystemTest.assertNoException(t);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestSampleAssertions.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestSampleAssertions.java
index 31dad5e011e2d749b39bb8a2197addc9af5667dc..11cfe37693d49e4d61a270e37f72123c520249b6 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestSampleAssertions.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestSampleAssertions.java
@@ -50,40 +50,47 @@ public class CommonValidatorSystemTestSampleAssertions<O> extends CommonValidato
 
     private void assertWithObject(ProjectAuthorizationUser user, O result, Throwable t, Object param, ProjectIdentifier project)
     {
-        CommonAuthorizationSystemTest.assertNoException(t);
-
-        if (SampleKind.SHARED_READ.equals(param) || SampleKind.SHARED_READ_WRITE.equals(param))
+        if (user.isDisabledProjectUser())
         {
-            CommonAuthorizationSystemTest.assertNotNull(result);
-        } else if (SampleKind.SPACE.equals(param) || SampleKind.SPACE_CONTAINED.equals(param))
+            CommonAuthorizationSystemTest.assertNull(result);
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+        } else
         {
-            if (user.isInstanceUser())
+            CommonAuthorizationSystemTest.assertNoException(t);
+
+            if (SampleKind.SHARED_READ.equals(param) || SampleKind.SHARED_READ_WRITE.equals(param))
             {
                 CommonAuthorizationSystemTest.assertNotNull(result);
-            } else
+            } else if (SampleKind.SPACE.equals(param) || SampleKind.SPACE_CONTAINED.equals(param))
             {
-                if (user.isSpaceUser(project.getSpaceCode()))
+                if (user.isInstanceUser())
                 {
                     CommonAuthorizationSystemTest.assertNotNull(result);
                 } else
                 {
-                    CommonAuthorizationSystemTest.assertNull(result);
+                    if (user.isSpaceUser(project.getSpaceCode()))
+                    {
+                        CommonAuthorizationSystemTest.assertNotNull(result);
+                    } else
+                    {
+                        CommonAuthorizationSystemTest.assertNull(result);
+                    }
                 }
-            }
-        } else
-        {
-            if (user.isInstanceUser())
-            {
-                CommonAuthorizationSystemTest.assertNotNull(result);
             } else
             {
-                if (user.isSpaceUser(project.getSpaceCode())
-                        || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()))
+                if (user.isInstanceUser())
                 {
                     CommonAuthorizationSystemTest.assertNotNull(result);
                 } else
                 {
-                    CommonAuthorizationSystemTest.assertNull(result);
+                    if (user.isSpaceUser(project.getSpaceCode())
+                            || (user.isProjectUser(project.getSpaceCode(), project.getProjectCode()) && user.hasPAEnabled()))
+                    {
+                        CommonAuthorizationSystemTest.assertNotNull(result);
+                    } else
+                    {
+                        CommonAuthorizationSystemTest.assertNull(result);
+                    }
                 }
             }
         }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestSpaceAssertions.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestSpaceAssertions.java
index 6c8bdd22cc620c991c68935ae865c2904a1b174f..1a14ce6ac3f8b4f33657c18bc1d67aa382fe9639 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestSpaceAssertions.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/CommonValidatorSystemTestSpaceAssertions.java
@@ -49,19 +49,26 @@ public class CommonValidatorSystemTestSpaceAssertions<O> extends CommonValidator
 
     private void assertWithObject(ProjectAuthorizationUser user, O result, Throwable t, Object param, ProjectIdentifier project)
     {
-        CommonAuthorizationSystemTest.assertNoException(t);
-
-        if (user.isInstanceUser())
+        if (user.isDisabledProjectUser())
         {
-            CommonAuthorizationSystemTest.assertNotNull(result);
+            CommonAuthorizationSystemTest.assertNull(result);
+            CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
         } else
         {
-            if (user.isSpaceUser(project.getSpaceCode()))
+            CommonAuthorizationSystemTest.assertNoException(t);
+
+            if (user.isInstanceUser())
             {
                 CommonAuthorizationSystemTest.assertNotNull(result);
             } else
             {
-                CommonAuthorizationSystemTest.assertNull(result);
+                if (user.isSpaceUser(project.getSpaceCode()))
+                {
+                    CommonAuthorizationSystemTest.assertNotNull(result);
+                } else
+                {
+                    CommonAuthorizationSystemTest.assertNull(result);
+                }
             }
         }
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/deletion/DeletionValidatorWithSampleSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/deletion/DeletionValidatorWithSampleSystemTest.java
index c6c7c43ed4bd389b41e2b4cef0c12894463a6c81..56bdb134ed67aaa707a0ec8d844a9ee3369660f1 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/deletion/DeletionValidatorWithSampleSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/deletion/DeletionValidatorWithSampleSystemTest.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.deletion;
 
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.CommonAuthorizationSystemTest;
 import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.ProjectAuthorizationUser;
 import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestAssertions;
 import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestSampleAssertions;
@@ -51,40 +52,54 @@ public class DeletionValidatorWithSampleSystemTest extends DeletionValidatorSyst
                 @Override
                 public void assertWithProject11Object(ProjectAuthorizationUser user, Deletion result, Throwable t, Object param)
                 {
-                    if (SampleKind.SHARED_READ.equals(param))
+                    if (user.isDisabledProjectUser())
                     {
-                        assertNoException(t);
-
-                        if (user.isInstanceUser())
+                        CommonAuthorizationSystemTest.assertNull(result);
+                        CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        if (SampleKind.SHARED_READ.equals(param))
                         {
-                            assertNotNull(result);
+                            assertNoException(t);
+
+                            if (user.isInstanceUser())
+                            {
+                                assertNotNull(result);
+                            } else
+                            {
+                                assertNull(result);
+                            }
                         } else
                         {
-                            assertNull(result);
+                            super.assertWithProject11Object(user, result, t, param);
                         }
-                    } else
-                    {
-                        super.assertWithProject11Object(user, result, t, param);
                     }
                 }
 
                 @Override
                 public void assertWithProject21Object(ProjectAuthorizationUser user, Deletion result, Throwable t, Object param)
                 {
-                    if (SampleKind.SHARED_READ.equals(param))
+                    if (user.isDisabledProjectUser())
                     {
-                        assertNoException(t);
-
-                        if (user.isInstanceUser())
+                        CommonAuthorizationSystemTest.assertNull(result);
+                        CommonAuthorizationSystemTest.assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        if (SampleKind.SHARED_READ.equals(param))
                         {
-                            assertNotNull(result);
+                            assertNoException(t);
+
+                            if (user.isInstanceUser())
+                            {
+                                assertNotNull(result);
+                            } else
+                            {
+                                assertNull(result);
+                            }
                         } else
                         {
-                            assertNull(result);
+                            super.assertWithProject21Object(user, result, t, param);
                         }
-                    } else
-                    {
-                        super.assertWithProject21Object(user, result, t, param);
                     }
                 }
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f267d046ea8d39ad8c2d88827763d445b496286b
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorSystemTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.ProjectAuthorizationUser;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTest;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityHistory;
+import ch.systemsx.cisd.openbis.systemtest.authorization.validator.entity.EntityValidatorTestService;
+
+/**
+ * @author pkupczyk
+ */
+public abstract class EntityHistoryValidatorSystemTest extends CommonValidatorSystemTest<EntityHistory>
+{
+
+    @Override
+    protected EntityHistory validateObject(ProjectAuthorizationUser user, EntityHistory object, Object param)
+    {
+        return getBean(EntityValidatorTestService.class).testEntityHistoryValidator(user.getSessionProvider(), object);
+    }
+
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithDataSetSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithDataSetSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..20b99af9bdf5981c88b14c2179956e3bd6e295d5
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithDataSetSystemTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.common.ExternalDataUtil;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestAssertions;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestDataSetAssertions;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityHistory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author pkupczyk
+ */
+public class EntityHistoryValidatorWithDataSetSystemTest extends EntityHistoryValidatorSystemTest
+{
+
+    @Override
+    public Object[] getParams()
+    {
+        return getDataSetKinds();
+    }
+
+    @Override
+    protected EntityHistory createObject(SpacePE spacePE, ProjectPE projectPE, Object param)
+    {
+        EntityHistory history = new EntityHistory();
+        history.setRelatedEntity(ExternalDataUtil.createObject(this, spacePE, projectPE, param));
+        return history;
+    }
+
+    @Override
+    protected CommonValidatorSystemTestAssertions<EntityHistory> getAssertions()
+    {
+        return new CommonValidatorSystemTestDataSetAssertions<EntityHistory>(super.getAssertions());
+    }
+
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithExperimentSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithExperimentSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..b9f21502a8a54ba3f3ef399819489906df13eee9
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithExperimentSystemTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityHistory;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author pkupczyk
+ */
+public class EntityHistoryValidatorWithExperimentSystemTest extends EntityHistoryValidatorSystemTest
+{
+
+    @Override
+    protected EntityHistory createObject(SpacePE spacePE, ProjectPE projectPE, Object param)
+    {
+        Space space = new Space();
+        space.setCode(spacePE.getCode());
+
+        Project project = new Project();
+        project.setCode(projectPE.getCode());
+        project.setSpace(space);
+
+        Experiment experiment = new Experiment();
+        experiment.setProject(project);
+
+        EntityHistory history = new EntityHistory();
+        history.setRelatedEntity(experiment);
+
+        return history;
+    }
+
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithProjectSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithProjectSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c085e18f582c2f0c5b5b13b28bd0b067351a61b6
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithProjectSystemTest.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityHistory;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author pkupczyk
+ */
+public class EntityHistoryValidatorWithProjectSystemTest extends EntityHistoryValidatorSystemTest
+{
+
+    @Override
+    protected EntityHistory createObject(SpacePE spacePE, ProjectPE projectPE, Object param)
+    {
+        Space space = new Space();
+        space.setCode(spacePE.getCode());
+
+        Project project = new Project();
+        project.setCode(projectPE.getCode());
+        project.setSpace(space);
+
+        EntityHistory history = new EntityHistory();
+        history.setRelatedProject(project);
+
+        return history;
+    }
+
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithSampleSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithSampleSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..10d3764ff1ea54783dd91ba2c6394c72129005fa
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithSampleSystemTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.common.SampleUtil;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestAssertions;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestSampleAssertions;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityHistory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author pkupczyk
+ */
+public class EntityHistoryValidatorWithSampleSystemTest extends EntityHistoryValidatorSystemTest
+{
+
+    @Override
+    public Object[] getParams()
+    {
+        return getSampleKinds(SampleKind.SHARED_READ);
+    }
+
+    @Override
+    protected EntityHistory createObject(SpacePE spacePE, ProjectPE projectPE, Object param)
+    {
+        EntityHistory history = new EntityHistory();
+        history.setRelatedEntity(SampleUtil.createObject(this, spacePE, projectPE, param));
+        return history;
+    }
+
+    @Override
+    protected CommonValidatorSystemTestAssertions<EntityHistory> getAssertions()
+    {
+        return new CommonValidatorSystemTestSampleAssertions<EntityHistory>(super.getAssertions());
+    }
+
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithSpaceSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithSpaceSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a816465774c2b77143de82ce465d9e57c40f1ee
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/EntityHistoryValidatorWithSpaceSystemTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestAssertions;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestSpaceAssertions;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityHistory;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author pkupczyk
+ */
+public class EntityHistoryValidatorWithSpaceSystemTest extends EntityHistoryValidatorSystemTest
+{
+
+    @Override
+    protected EntityHistory createObject(SpacePE spacePE, ProjectPE projectPE, Object param)
+    {
+        Space space = new Space();
+        space.setCode(spacePE.getCode());
+
+        EntityHistory history = new EntityHistory();
+        history.setRelatedSpace(space);
+
+        return history;
+    }
+
+    @Override
+    protected CommonValidatorSystemTestAssertions<EntityHistory> getAssertions()
+    {
+        return new CommonValidatorSystemTestSpaceAssertions<EntityHistory>(super.getAssertions());
+    }
+
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d86045deb1aef59f0d519bbc34727e0fe173ea9
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorSystemTest.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.ProjectAuthorizationUser;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTest;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
+import ch.systemsx.cisd.openbis.systemtest.authorization.validator.entity.EntityValidatorTestService;
+
+/**
+ * @author pkupczyk
+ */
+public abstract class MatchingEntityValidatorSystemTest extends CommonValidatorSystemTest<MatchingEntity>
+{
+
+    @Override
+    protected MatchingEntity validateObject(ProjectAuthorizationUser user, MatchingEntity object, Object param)
+    {
+        List<MatchingEntity> list = getBean(EntityValidatorTestService.class).testMatchingEntityValidator(user.getSessionProvider(), object);
+        return list != null && list.size() == 1 ? list.get(0) : null;
+    }
+
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithDataSetSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithDataSetSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4d2e2e7d7054ad2ee43ea60c9325f61ddceb33b
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithDataSetSystemTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestAssertions;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestDataSetAssertions;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author pkupczyk
+ */
+public class MatchingEntityValidatorWithDataSetSystemTest extends MatchingEntityValidatorSystemTest
+{
+
+    @Override
+    public Object[] getParams()
+    {
+        return getDataSetKinds();
+    }
+
+    @Override
+    protected MatchingEntity createObject(SpacePE spacePE, ProjectPE projectPE, Object param)
+    {
+        DataPE dataSetPE = getDataSet(spacePE, projectPE, (DataSetKind) param);
+
+        Space space = null;
+
+        if (dataSetPE.getSpace() != null)
+        {
+            space = new Space();
+            space.setCode(dataSetPE.getSpace().getCode());
+        }
+
+        MatchingEntity entity = new MatchingEntity();
+        entity.setEntityKind(EntityKind.DATA_SET);
+        entity.setId(dataSetPE.getId());
+        entity.setSpace(space);
+
+        return entity;
+    }
+
+    @Override
+    protected CommonValidatorSystemTestAssertions<MatchingEntity> getAssertions()
+    {
+        return new CommonValidatorSystemTestDataSetAssertions<MatchingEntity>(super.getAssertions());
+    }
+
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithExperimentSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithExperimentSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..07e39d088dc91b15077541fef4fcd35c450738d0
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithExperimentSystemTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author pkupczyk
+ */
+public class MatchingEntityValidatorWithExperimentSystemTest extends MatchingEntityValidatorSystemTest
+{
+
+    @Override
+    protected MatchingEntity createObject(SpacePE spacePE, ProjectPE projectPE, Object param)
+    {
+        ExperimentPE experimentPE = getExperiment(spacePE, projectPE);
+
+        Space space = new Space();
+        space.setCode(experimentPE.getProject().getSpace().getCode());
+
+        MatchingEntity entity = new MatchingEntity();
+        entity.setEntityKind(EntityKind.EXPERIMENT);
+        entity.setId(experimentPE.getId());
+        entity.setSpace(space);
+
+        return entity;
+    }
+
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithMaterialSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithMaterialSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..3c935d7d2ee51423d94fa1dd3b07af4a5814b950
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithMaterialSystemTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestAssertions;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestMaterialAssertions;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author pkupczyk
+ */
+public class MatchingEntityValidatorWithMaterialSystemTest extends MatchingEntityValidatorSystemTest
+{
+
+    @Override
+    protected MatchingEntity createObject(SpacePE spacePE, ProjectPE projectPE, Object param)
+    {
+        MatchingEntity entity = new MatchingEntity();
+        entity.setEntityKind(EntityKind.MATERIAL);
+        entity.setId(22L); // BACTERIUM1
+
+        return entity;
+    }
+
+    @Override
+    protected CommonValidatorSystemTestAssertions<MatchingEntity> getAssertions()
+    {
+        return new CommonValidatorSystemTestMaterialAssertions<MatchingEntity>(super.getAssertions());
+    }
+
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithSampleSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithSampleSystemTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c70be4e45f5b58f16a0e0b24a62ec914819f6621
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/authorization/validator/entity/MatchingEntityValidatorWithSampleSystemTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2017 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.datastoreserver.systemtests.authorization.validator.entity;
+
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestAssertions;
+import ch.systemsx.cisd.openbis.datastoreserver.systemtests.authorization.validator.CommonValidatorSystemTestSampleAssertions;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+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;
+
+/**
+ * @author pkupczyk
+ */
+public class MatchingEntityValidatorWithSampleSystemTest extends MatchingEntityValidatorSystemTest
+{
+
+    @Override
+    public Object[] getParams()
+    {
+        return getSampleKinds(SampleKind.SHARED_READ);
+    }
+
+    @Override
+    protected MatchingEntity createObject(SpacePE spacePE, ProjectPE projectPE, Object param)
+    {
+        SamplePE samplePE = getSample(spacePE, projectPE, (SampleKind) param);
+
+        Space space = null;
+
+        if (samplePE.getSpace() != null)
+        {
+            space = new Space();
+            space.setCode(samplePE.getSpace().getCode());
+        }
+
+        MatchingEntity entity = new MatchingEntity();
+        entity.setEntityKind(EntityKind.SAMPLE);
+        entity.setId(samplePE.getId());
+        entity.setSpace(space);
+
+        return entity;
+    }
+
+    @Override
+    protected CommonValidatorSystemTestAssertions<MatchingEntity> getAssertions()
+    {
+        return new CommonValidatorSystemTestSampleAssertions<MatchingEntity>(super.getAssertions());
+    }
+
+}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/internal/InternalOperationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/internal/InternalOperationExecutor.java
index 140aedf49b54ff23c54ec6f4f92a5d82c80f928d..071e9a6f5e3c25b4ea444c194e190e65f29939a5 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/internal/InternalOperationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/internal/InternalOperationExecutor.java
@@ -61,7 +61,7 @@ public class InternalOperationExecutor implements IInternalOperationExecutor
 
         for (RoleAssignmentPE role : roles)
         {
-            if (RoleCode.ADMIN.equals(role.getRole()) && role.getSpace() == null)
+            if (RoleCode.ADMIN.equals(role.getRole()) && role.getRoleWithHierarchy().isInstanceLevel())
             {
                 return true;
             }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/vocabulary/VocabularyTermAuthorizationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/vocabulary/VocabularyTermAuthorizationExecutor.java
index e49f915b5212dfce3aaae376ddce177647030f06..357f5aa91827ec07b12f2ecfb63afbe29025d416 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/vocabulary/VocabularyTermAuthorizationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/vocabulary/VocabularyTermAuthorizationExecutor.java
@@ -90,7 +90,8 @@ public class VocabularyTermAuthorizationExecutor implements IVocabularyTermAutho
 
         for (RoleAssignmentPE role : roles)
         {
-            if (RoleCode.ETL_SERVER.equals(role.getRole()) || (RoleCode.ADMIN.equals(role.getRole()) && role.getSpace() == null))
+            if (RoleCode.ETL_SERVER.equals(role.getRole())
+                    || (RoleCode.ADMIN.equals(role.getRole()) && role.getRoleWithHierarchy().isInstanceLevel()))
             {
                 return true;
             }
@@ -99,7 +100,6 @@ public class VocabularyTermAuthorizationExecutor implements IVocabularyTermAutho
         return false;
     }
 
-
     @Override
     @DatabaseCreateOrDeleteModification(value = { ObjectKind.VOCABULARY_TERM, ObjectKind.DELETION })
     @RolesAllowed({ RoleWithHierarchy.SPACE_POWER_USER, RoleWithHierarchy.SPACE_ETL_SERVER })
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/globalsearch/GlobalSearchObjectTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/globalsearch/GlobalSearchObjectTranslator.java
index c459461c1e64324d2acff9efa780edcbcd1fd367..ad21987b504ed62786efbb57ef7bdbc5fe97f168 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/globalsearch/GlobalSearchObjectTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/globalsearch/GlobalSearchObjectTranslator.java
@@ -81,7 +81,7 @@ public class GlobalSearchObjectTranslator extends AbstractCachingTranslator<Matc
     {
         MatchingEntityValidator validator = new MatchingEntityValidator();
         validator.init(new AuthorizationDataProvider(daoFactory));
-        return validator.doValidation(context.getSession().tryGetPerson(), input);
+        return validator.isValid(context.getSession().tryGetPerson(), input);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
index 874d6e70df9b68266ee6774e9573b85128b40c8d..ba6b1ba197327c67ea2ec8b6febbc6a37dcafe18 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
@@ -922,7 +922,7 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     @ReturnValueFilter(validatorClass = ExpressionValidator.class)
     public List<GridCustomColumn> listGridCustomColumns(String sessionToken, String gridId)
     {
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 3c0f02dc3ec50b1275ad360c264283727a17494d..f0477fe893c4c39593acf1ed552df05d2c973714 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
@@ -81,6 +81,7 @@ import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.SampleUpd
 import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.SpaceIdentifierPredicate;
 import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.SpaceUpdatesPredicate;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.DeletionValidator;
+import ch.systemsx.cisd.openbis.generic.server.authorization.validator.EntityHistoryValidator;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ExperimentByIdentiferValidator;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ExpressionValidator;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ExternalDataValidator;
@@ -489,8 +490,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
             boolean isInstanceAdmin = false;
             for (final RoleAssignmentPE roleAssigment : personPE.getRoleAssignments())
             {
-                if (roleAssigment.getSpace() == null
-                        && roleAssigment.getRole().equals(RoleCode.ADMIN))
+                if (roleAssignment.getRoleWithHierarchy().isInstanceLevel() && roleAssigment.getRole().equals(RoleCode.ADMIN))
                 {
                     isInstanceAdmin = true;
                 }
@@ -520,7 +520,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         if (roleAssignment.getPerson() != null
                 && roleAssignment.getPerson().equals(session.tryGetPerson())
                 && roleAssignment.getRole().equals(RoleCode.ADMIN)
-                && roleAssignment.getSpace() == null)
+                && roleAssignment.getRoleWithHierarchy().isInstanceLevel())
         {
             throw new UserFailureException(
                     "For safety reason you cannot give away your own omnipotence. "
@@ -575,7 +575,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public Map<String, List<IManagedInputWidgetDescription>> listManagedInputWidgetDescriptions(
             String sessionToken, EntityKind entityKind, String entityTypeCode)
     {
@@ -806,7 +806,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<PropertyType> listPropertyTypes(final String sessionToken, boolean withRelations)
     {
         final Session session = getSession(sessionToken);
@@ -826,7 +826,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<EntityTypePropertyType<?>> listEntityTypePropertyTypes(final String sessionToken)
     {
         List<PropertyType> propertyTypes = listPropertyTypes(sessionToken, true);
@@ -834,7 +834,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<EntityTypePropertyType<?>> listEntityTypePropertyTypes(final String sessionToken,
             final EntityType entityType)
     {
@@ -843,11 +843,17 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
+    @ReturnValueFilter(validatorClass = EntityHistoryValidator.class)
     public List<EntityHistory> listEntityHistory(String sessionToken, EntityKind entityKind,
             TechId entityID)
     {
         Session session = getSession(sessionToken);
+
+        AuthorizationServiceUtils authorizationUtils =
+                new AuthorizationServiceUtils(getDAOFactory(), session.tryGetPerson().getUserId());
+        authorizationUtils.checkAccessEntity(entityKind, entityID);
+
         IEntityHistoryDAO entityPropertyHistoryDAO = getDAOFactory().getEntityPropertyHistoryDAO();
         List<AbstractEntityPropertyHistoryPE> result =
                 entityPropertyHistoryDAO.getPropertyHistory(
@@ -907,7 +913,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     @ReturnValueFilter(validatorClass = MatchingEntityValidator.class)
     public List<MatchingEntity> listMatchingEntities(final String sessionToken,
             final SearchableEntity[] searchableEntities, final String queryText,
@@ -1092,7 +1098,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<MaterialType> listMaterialTypes(String sessionToken)
     {
         final List<MaterialTypePE> materialTypes =
@@ -1102,7 +1108,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public MaterialType getMaterialType(String sessionToken, String code)
     {
         final EntityTypePE materialType = findEntityType(EntityKind.MATERIAL, code);
@@ -1121,7 +1127,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<DataType> listDataTypes(final String sessionToken)
     {
         assert sessionToken != null : "Unspecified session token";
@@ -1140,7 +1146,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<FileFormatType> listFileFormatTypes(String sessionToken)
     {
         assert sessionToken != null : "Unspecified session token";
@@ -1160,7 +1166,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<Vocabulary> listVocabularies(final String sessionToken, final boolean withTerms,
             boolean excludeInternal)
     {
@@ -1439,7 +1445,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public int countPropertyTypedEntities(String sessionToken, EntityKind entityKind,
             String propertyTypeCode, String entityTypeCode)
     {
@@ -1505,7 +1511,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @Capability("WRITE_VOCABULARY_TERM")
     public void addVocabularyTerms(String sessionToken, TechId vocabularyId,
             List<VocabularyTerm> vocabularyTerms, Long previousTermOrdinal,
@@ -1526,7 +1532,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     @Capability("WRITE_UNOFFICIAL_VOCABULARY_TERM")
     public void addUnofficialVocabularyTerm(String sessionToken, TechId vocabularyId, String code,
             String label, String description, Long previousTermOrdinal)
@@ -1544,7 +1550,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @Capability("WRITE_VOCABULARY_TERM")
     public void updateVocabularyTerm(final String sessionToken, final IVocabularyTermUpdates updates)
     {
@@ -1558,7 +1564,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @Capability("WRITE_VOCABULARY_TERM")
     public void deleteVocabularyTerms(String sessionToken, TechId vocabularyId,
             List<VocabularyTerm> termsToBeDeleted, List<VocabularyTermReplacement> termsToBeReplaced)
@@ -1574,7 +1580,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @Capability("WRITE_VOCABULARY")
     public void makeVocabularyTermsOfficial(String sessionToken, TechId vocabularyId,
             List<VocabularyTerm> termsToBeOfficial)
@@ -1858,7 +1864,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<Material> listMaterials(String sessionToken, ListMaterialCriteria criteria,
             boolean withProperties)
     {
@@ -1868,7 +1874,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public Collection<TechId> listMaterialIdsByMaterialProperties(String sessionToken, Collection<TechId> materialIds)
     {
         final Session session = getSession(sessionToken);
@@ -1877,7 +1883,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<Material> listMetaprojectMaterials(String sessionToken, IMetaprojectId metaprojectId)
     {
         final Session session = getSession(sessionToken);
@@ -2387,7 +2393,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<VocabularyTermWithStats> listVocabularyTermsWithStatistics(String sessionToken,
             Vocabulary vocabulary)
     {
@@ -2398,7 +2404,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public Set<VocabularyTerm> listVocabularyTerms(String sessionToken, Vocabulary vocabulary)
     {
         final Session session = getSession(sessionToken);
@@ -2408,7 +2414,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<DataSetType> listDataSetTypes(String sessionToken)
     {
         final List<DataSetTypePE> dataSetTypes = listEntityTypes(sessionToken, EntityKind.DATA_SET);
@@ -2417,7 +2423,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public LastModificationState getLastModificationState(String sessionToken)
     {
         checkSession(sessionToken);
@@ -2571,7 +2577,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public Material getMaterialInfo(String sessionToken, MaterialIdentifier identifier)
     {
         Session session = getSession(sessionToken);
@@ -2588,7 +2594,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public Material getMaterialInfo(String sessionToken, TechId materialId)
     {
         final Session session = getSession(sessionToken);
@@ -2604,7 +2610,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public IEntityInformationHolderWithPermId getMaterialInformationHolder(String sessionToken,
             MaterialIdentifier identifier)
     {
@@ -2675,7 +2681,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     public String generateCode(String sessionToken, String prefix, EntityKind entityKind)
     {
         checkSession(sessionToken);
@@ -2768,7 +2774,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public String getTemplateColumns(String sessionToken, EntityKind entityKind, String type,
             boolean autoGenerate, boolean withExperiments, boolean withSpace,
             BatchOperationKind operationKind)
@@ -3029,7 +3035,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<DataStore> listDataStores(String sessionToken)
     {
         checkSession(sessionToken);
@@ -3037,7 +3043,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<DatastoreServiceDescription> listDataStoreServices(String sessionToken,
             DataStoreServiceKind dataStoreServiceKind)
     {
@@ -3208,7 +3214,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<Script> listScripts(String sessionToken, ScriptType scriptTypeOrNull,
             EntityKind entityKindOrNull)
     {
@@ -3340,7 +3346,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     @ReturnValueFilter(validatorClass = ExpressionValidator.class)
     public List<GridCustomFilter> listFilters(String sessionToken, String gridId)
     {
@@ -3352,7 +3358,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @Capability("WRITE_FILTER")
     public void registerFilter(String sessionToken, NewColumnOrFilter filter)
     {
@@ -3361,7 +3367,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @Capability("DELETE_FILTER")
     public void deleteFilters(String sessionToken,
             @AuthorizationGuard(guardClass = DeleteGridCustomFilterPredicate.class) List<TechId> filterIds)
@@ -3371,7 +3377,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @Capability("WRITE_FILTER")
     public void updateFilter(String sessionToken,
             @AuthorizationGuard(guardClass = UpdateGridCustomFilterPredicate.class) IExpressionUpdates updates)
@@ -3383,7 +3389,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     // -- columns
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @Capability("WRITE_CUSTOM_COLUMN")
     public void registerGridCustomColumn(String sessionToken, NewColumnOrFilter column)
     {
@@ -3392,7 +3398,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @Capability("DELETE_CUSTOM_COLUMN")
     public void deleteGridCustomColumns(String sessionToken,
             @AuthorizationGuard(guardClass = DeleteGridCustomColumnPredicate.class) List<TechId> columnIds)
@@ -3402,7 +3408,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @Capability("WRITE_CUSTOM_COLUMN")
     public void updateGridCustomColumn(String sessionToken,
             @AuthorizationGuard(guardClass = UpdateGridCustomColumnPredicate.class) IExpressionUpdates updates)
@@ -3414,7 +3420,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     // --
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public void keepSessionAlive(String sessionToken)
     {
         checkSession(sessionToken);
@@ -3480,7 +3486,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public Script getScriptInfo(String sessionToken, TechId scriptId)
     {
         getSession(sessionToken);
@@ -3692,7 +3698,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     public void updateManagedPropertyOnMaterial(String sessionToken, TechId materialId,
             IManagedProperty managedProperty, IManagedUiAction updateAction)
     {
@@ -3748,7 +3754,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public String getDefaultPutDataStoreBaseURL(String sessionToken)
     {
         checkSession(sessionToken);
@@ -3898,7 +3904,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     @ReturnValueFilter(validatorClass = DeletionValidator.class)
     public List<Deletion> listDeletions(String sessionToken, boolean withDeletedEntities)
     {
@@ -3909,7 +3915,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     @ReturnValueFilter(validatorClass = DeletionValidator.class)
     public List<Deletion> listOriginalDeletions(String sessionToken)
     {
@@ -4054,7 +4060,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<Material> searchForMaterials(String sessionToken, DetailedSearchCriteria criteria)
     {
         final Session session = getSession(sessionToken);
@@ -4173,7 +4179,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<Metaproject> listMetaprojects(String sessionToken)
     {
         Session session = getSession(sessionToken);
@@ -4205,7 +4211,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<MetaprojectAssignmentsCount> listMetaprojectAssignmentsCounts(String sessionToken)
     {
         List<Metaproject> metaprojects = listMetaprojects(sessionToken);
@@ -4221,7 +4227,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public MetaprojectAssignmentsCount getMetaprojectAssignmentsCount(String sessionToken,
             IMetaprojectId metaprojectId)
     {
@@ -4230,7 +4236,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public MetaprojectAssignments getMetaprojectAssignments(String sessionToken,
             IMetaprojectId metaprojectId)
     {
@@ -4254,7 +4260,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public MetaprojectAssignments getMetaprojectAssignments(String sessionToken,
             IMetaprojectId metaprojectId, EnumSet<MetaprojectAssignmentsFetchOption> fetchOptions)
     {
@@ -4344,7 +4350,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId, String reason)
     {
         if (metaprojectId == null)
@@ -4363,7 +4369,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public void deleteMetaprojects(String sessionToken, List<IMetaprojectId> metaprojectIds,
             String reason)
     {
@@ -4393,7 +4399,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public Metaproject updateMetaproject(String sessionToken, IMetaprojectId metaprojectId,
             IMetaprojectUpdates updates)
     {
@@ -4411,7 +4417,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public Metaproject getMetaproject(String sessionToken, IMetaprojectId metaprojectId)
     {
         Session session = getSession(sessionToken);
@@ -4479,7 +4485,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<String> listPredeployedPlugins(String sessionToken, ScriptType scriptType)
     {
         checkSession(sessionToken);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java
index c647d18255b51260f1a048909671ed965c1346cb..9de55dcf7abf0c509eec169b2a58034df7f18cfe 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java
@@ -1572,7 +1572,7 @@ public class ServiceForDataStoreServer extends AbstractCommonServer<IServiceForD
         {
             for (final RoleAssignmentPE roleAssigment : person.getRoleAssignments())
             {
-                if (roleAssigment.getSpace() == null
+                if (roleAssigment.getRoleWithHierarchy().isInstanceLevel()
                         && roleAssigment.getRole().equals(RoleCode.ADMIN))
                 {
                     admins.add(person);
@@ -2167,7 +2167,7 @@ public class ServiceForDataStoreServer extends AbstractCommonServer<IServiceForD
                     boolean isInstanceAdmin = false;
                     for (final RoleAssignmentPE roleAssigment : personPE.getRoleAssignments())
                     {
-                        if (roleAssigment.getSpace() == null
+                        if (roleAssigment.getRoleWithHierarchy().isInstanceLevel()
                                 && roleAssigment.getRole().equals(RoleCode.ADMIN))
                         {
                             isInstanceAdmin = true;
@@ -2668,14 +2668,15 @@ public class ServiceForDataStoreServer extends AbstractCommonServer<IServiceForD
     }
 
     private DataSetKind map(ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind dataSetKind)
-	{
-    	if (dataSetKind != null) {
-    		return DataSetKind.valueOf(dataSetKind.name());
-    	}
-		return null;
-	}
+    {
+        if (dataSetKind != null)
+        {
+            return DataSetKind.valueOf(dataSetKind.name());
+        }
+        return null;
+    }
 
-	private void injectSampleId(DataSetCreation creation, NewExternalData newData)
+    private void injectSampleId(DataSetCreation creation, NewExternalData newData)
     {
         SampleIdentifier sampleIdentifier = newData.getSampleIdentifierOrNull();
         String permId = newData.getSamplePermIdOrNull();
@@ -2936,7 +2937,7 @@ public class ServiceForDataStoreServer extends AbstractCommonServer<IServiceForD
     }
 
     @Override
-    @RolesAllowed(value = { RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
+    @RolesAllowed(value = { RoleWithHierarchy.PROJECT_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
     public List<Material> listMaterials(String sessionToken, ListMaterialCriteria criteria,
             boolean withProperties)
     {
@@ -3118,7 +3119,7 @@ public class ServiceForDataStoreServer extends AbstractCommonServer<IServiceForD
     }
 
     @Override
-    @RolesAllowed({ RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
+    @RolesAllowed({ RoleWithHierarchy.PROJECT_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
     public List<? extends EntityTypePropertyType<?>> listPropertyDefinitionsForType(
             String sessionToken, String code, EntityKind entityKind)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java
index 7b9f62a92f5b0e7218b6c39c20ed1555d90940f6..a2518b55a524842215dd47f817966abe48fecf45 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java
@@ -107,7 +107,7 @@ public class GeneralInformationChangingService extends
 
     @Override
     @Transactional
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @DatabaseCreateOrDeleteModification(value = ObjectKind.VOCABULARY_TERM)
     public void addUnofficialVocabularyTerm(String sessionToken, TechId vocabularyId, String code,
             String label, String description, Long previousTermOrdinal)
@@ -118,7 +118,7 @@ public class GeneralInformationChangingService extends
 
     @Override
     @Transactional
-    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_POWER_USER)
     @DatabaseCreateOrDeleteModification(value = ObjectKind.VOCABULARY_TERM)
     public void addUnofficialVocabularyTerm(String sessionToken, Long vocabularyId,
             NewVocabularyTerm term)
@@ -130,7 +130,7 @@ public class GeneralInformationChangingService extends
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     @SuppressWarnings("deprecation")
     public WebAppSettings getWebAppSettings(String sessionToken, String webAppId)
     {
@@ -141,7 +141,7 @@ public class GeneralInformationChangingService extends
 
     @Override
     @Transactional(readOnly = false)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public void setWebAppSettings(String sessionToken, WebAppSettings webAppSettings)
     {
         try
@@ -164,7 +164,7 @@ public class GeneralInformationChangingService extends
 
     @Override
     @Transactional(readOnly = false)
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     public Metaproject createMetaproject(String sessionToken, String name, String descriptionOrNull)
     {
         Metaproject registration = new Metaproject();
@@ -175,7 +175,7 @@ public class GeneralInformationChangingService extends
 
     @Override
     @Transactional(readOnly = false)
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     public Metaproject updateMetaproject(String sessionToken, IMetaprojectId metaprojectId,
             String name, String descriptionOrNull)
     {
@@ -187,7 +187,7 @@ public class GeneralInformationChangingService extends
 
     @Override
     @Transactional(readOnly = false)
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId)
     {
         server.deleteMetaproject(sessionToken, Translator.translate(metaprojectId), null);
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 5622a3c78f9eb9037f4c946dc614811f9dcc0aed..41680409840f81763fd6b5fc99633b591785220d 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
@@ -631,7 +631,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<DataStore> listDataStores(String sessionToken)
     {
         return Translator.translateDataStores(commonServer.listDataStores(sessionToken));
@@ -639,7 +639,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public String getDefaultPutDataStoreBaseURL(String sessionToken)
     {
         return commonServer.getDefaultPutDataStoreBaseURL(sessionToken);
@@ -647,7 +647,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(value = { RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
+    @RolesAllowed(value = { RoleWithHierarchy.PROJECT_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
     public String tryGetDataStoreBaseURL(String sessionToken, String dataSetCode)
     {
         Session session = getSession(sessionToken);
@@ -664,7 +664,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(value = { RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
+    @RolesAllowed(value = { RoleWithHierarchy.PROJECT_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
     public List<DataStoreURLForDataSets> getDataStoreBaseURLs(String sessionToken,
             List<String> dataSetCodes)
     {
@@ -676,7 +676,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<DataSetType> listDataSetTypes(String sessionToken)
     {
         List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType> privateDataSetTypes =
@@ -695,7 +695,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<SampleType> listSampleTypes(String sessionToken)
     {
         List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType> sampleTypes =
@@ -712,7 +712,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ExperimentType> listExperimentTypes(
             String sessionToken)
     {
@@ -730,7 +730,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public HashMap<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary, List<ControlledVocabularyPropertyType.VocabularyTerm>> getVocabularyTermsMap(
             String sessionToken)
     {
@@ -748,7 +748,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<Vocabulary> listVocabularies(String sessionToken)
     {
         List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary> privateVocabularies =
@@ -1139,7 +1139,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<Material> getMaterialByCodes(String sessionToken,
             List<MaterialIdentifier> materialIdentifier)
     {
@@ -1171,7 +1171,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<Material> searchForMaterials(String sessionToken, SearchCriteria searchCriteria)
     {
         DetailedSearchCriteria detailedSearchCriteria =
@@ -1184,7 +1184,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<Metaproject> listMetaprojects(String sessionToken)
     {
         return commonServer.listMetaprojects(sessionToken);
@@ -1200,7 +1200,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public MetaprojectAssignments getMetaproject(String sessionToken, IMetaprojectId metaprojectId)
     {
         ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignments assignments =
@@ -1296,7 +1296,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public final Map<String, String> getUserDisplaySettings(final String sessionToken)
     {
         String spaceCode = null;
@@ -1331,7 +1331,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyType> listPropertyTypes(String sessionToken, boolean withRelations)
     {
         HashMap<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary, List<ControlledVocabularyPropertyType.VocabularyTerm>> vocabTerms =
@@ -1350,7 +1350,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     // this is not a readOnly transaction - uses nextVal()
     public String generateCode(String sessionToken, String prefix, String entityKind)
     {
@@ -1360,7 +1360,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     public List<Deletion> listDeletions(String sessionToken, EnumSet<DeletionFetchOption> fetchOptions)
     {
         if (fetchOptions != null && fetchOptions.contains(DeletionFetchOption.ALL_ENTITIES))
@@ -1383,7 +1383,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     @Override
     @Transactional(readOnly = true)
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     public Long countNumberOfSamplesForType(String sessionToken, String sampleTypeCode)
     {
         org.hibernate.Session currentSession = this.getDAOFactory().getSessionFactory().getCurrentSession();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationDataProvider.java
index d403691262bac4997542d33c9d7d9ec3a89ab532..ddfd34ec81b3a3a666a21fdd923a0297617c794c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationDataProvider.java
@@ -53,6 +53,45 @@ final public class AuthorizationDataProvider implements IAuthorizationDataProvid
         }
     }
 
+    private static final class GroupExperimentMapper implements IMapper<List<ExperimentAccessPE>, List<ExperimentAccessPE>>
+    {
+        @Override
+        public List<ExperimentAccessPE> map(List<ExperimentAccessPE> list)
+        {
+            for (ExperimentAccessPE item : list)
+            {
+                item.setGroup(true);
+            }
+            return list;
+        }
+    }
+
+    private static final class GroupSampleMapper implements IMapper<List<SampleAccessPE>, List<SampleAccessPE>>
+    {
+        @Override
+        public List<SampleAccessPE> map(List<SampleAccessPE> list)
+        {
+            for (SampleAccessPE item : list)
+            {
+                item.setGroup(true);
+            }
+            return list;
+        }
+    }
+
+    private static final class GroupDataSetMapper implements IMapper<List<DataSetAccessPE>, List<DataSetAccessPE>>
+    {
+        @Override
+        public List<DataSetAccessPE> map(List<DataSetAccessPE> list)
+        {
+            for (DataSetAccessPE item : list)
+            {
+                item.setGroup(true);
+            }
+            return list;
+        }
+    }
+
     private final IAuthorizationDAOFactory daoFactory;
 
     public AuthorizationDataProvider(IAuthorizationDAOFactory daoFactory)
@@ -207,64 +246,64 @@ final public class AuthorizationDataProvider implements IAuthorizationDataProvid
     }
 
     @Override
-    public Set<DataSetAccessPE> getDatasetCollectionAccessDataByTechIds(final List<TechId> dataSetTechIds)
+    public Set<DataSetAccessPE> getDatasetCollectionAccessDataByTechIds(final List<TechId> dataSetTechIds, boolean grouped)
     {
         return getEntityCollectionAccessData("dataset", DataSetAccessPE.DATASET_ACCESS_BY_TECH_IDS_QUERY_NAME,
-                DataSetAccessPE.DATA_SET_IDS_PARAMETER_NAME, dataSetTechIds, new TechId2LongMapper());
+                DataSetAccessPE.DATA_SET_IDS_PARAMETER_NAME, dataSetTechIds, new TechId2LongMapper(), grouped ? new GroupDataSetMapper() : null);
     }
 
     @Override
     public Set<DataSetAccessPE> getDatasetCollectionAccessDataByCodes(final List<String> dataSetCodes)
     {
         return getEntityCollectionAccessData("dataset", DataSetAccessPE.DATASET_ACCESS_BY_CODES_QUERY_NAME,
-                DataSetAccessPE.DATA_SET_CODES_PARAMETER_NAME, dataSetCodes, null);
+                DataSetAccessPE.DATA_SET_CODES_PARAMETER_NAME, dataSetCodes, null, new GroupDataSetMapper());
     }
 
     @Override
     public Set<DataSetAccessPE> getDeletedDatasetCollectionAccessData(final List<TechId> deletionIds)
     {
         return getEntityCollectionAccessData("deletion", DataSetAccessPE.DELETED_DATASET_ACCESS_QUERY_NAME,
-                DataSetAccessPE.DELETION_IDS_PARAMETER_NAME, deletionIds, new TechId2LongMapper());
+                DataSetAccessPE.DELETION_IDS_PARAMETER_NAME, deletionIds, new TechId2LongMapper(), new GroupDataSetMapper());
     }
 
     @Override
-    public Set<SampleAccessPE> getSampleCollectionAccessDataByTechIds(List<TechId> sampleTechIds)
+    public Set<SampleAccessPE> getSampleCollectionAccessDataByTechIds(List<TechId> sampleTechIds, boolean grouped)
     {
         return getEntityCollectionAccessData("sample", SampleAccessPE.SAMPLE_ACCESS_BY_TECH_IDS_QUERY_NAME,
-                SampleAccessPE.SAMPLE_IDS_PARAMETER_NAME, sampleTechIds, new TechId2LongMapper());
+                SampleAccessPE.SAMPLE_IDS_PARAMETER_NAME, sampleTechIds, new TechId2LongMapper(), grouped ? new GroupSampleMapper() : null);
     }
 
     @Override
     public Set<SampleAccessPE> getSampleCollectionAccessDataByPermIds(List<PermId> samplePermIds)
     {
         return getEntityCollectionAccessData("sample", SampleAccessPE.SAMPLE_ACCESS_BY_PERM_IDS_QUERY_NAME,
-                SampleAccessPE.SAMPLE_IDS_PARAMETER_NAME, samplePermIds, new PermId2StringMapper());
+                SampleAccessPE.SAMPLE_IDS_PARAMETER_NAME, samplePermIds, new PermId2StringMapper(), new GroupSampleMapper());
     }
 
     @Override
     public Set<SampleAccessPE> getDeletedSampleCollectionAccessData(List<TechId> deletionIds)
     {
         return getEntityCollectionAccessData("deletion", SampleAccessPE.DELETED_SAMPLE_ACCESS_QUERY_NAME,
-                SampleAccessPE.DELETION_IDS_PARAMETER_NAME, deletionIds, new TechId2LongMapper());
+                SampleAccessPE.DELETION_IDS_PARAMETER_NAME, deletionIds, new TechId2LongMapper(), new GroupSampleMapper());
     }
 
     @Override
-    public Set<ExperimentAccessPE> getExperimentCollectionAccessData(final List<TechId> experimentIds)
+    public Set<ExperimentAccessPE> getExperimentCollectionAccessData(final List<TechId> experimentIds, boolean grouped)
     {
         return getEntityCollectionAccessData("experiment", ExperimentAccessPE.EXPERIMENT_ACCESS_QUERY_NAME,
-                ExperimentAccessPE.EXPERIMENT_IDS_PARAMETER_NAME, experimentIds, new TechId2LongMapper());
+                ExperimentAccessPE.EXPERIMENT_IDS_PARAMETER_NAME, experimentIds, new TechId2LongMapper(),
+                grouped ? new GroupExperimentMapper() : null);
     }
 
     @Override
-    public Set<ExperimentAccessPE> getDeletedExperimentCollectionAccessData(
-            final List<TechId> deletionIds)
+    public Set<ExperimentAccessPE> getDeletedExperimentCollectionAccessData(final List<TechId> deletionIds)
     {
         return getEntityCollectionAccessData("deletion", ExperimentAccessPE.DELETED_EXPERIMENT_ACCESS_QUERY_NAME,
-                ExperimentAccessPE.DELETION_IDS_PARAMETER_NAME, deletionIds, new TechId2LongMapper());
+                ExperimentAccessPE.DELETION_IDS_PARAMETER_NAME, deletionIds, new TechId2LongMapper(), new GroupExperimentMapper());
     }
 
     private <V, R> Set<R> getEntityCollectionAccessData(String entityName, String queryName, String parameterName, List<V> values,
-            IMapper<List<V>, List<?>> valuesMapperOrNull)
+            IMapper<List<V>, List<?>> valuesMapperOrNull, IMapper<List<R>, List<R>> resultMapperOrNull)
     {
         Session session = daoFactory.getSessionFactory().getCurrentSession();
         final Query query = session.getNamedQuery(queryName);
@@ -287,6 +326,12 @@ final public class AuthorizationDataProvider implements IAuthorizationDataProvid
                     query.setParameterList(parameterName, mappedValues);
 
                     List<R> singleResults = cast(query.list());
+
+                    if (resultMapperOrNull != null)
+                    {
+                        singleResults = resultMapperOrNull.map(singleResults);
+                    }
+
                     fullResults.addAll(singleResults);
                 }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationServiceUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationServiceUtils.java
index 5b37aa63ddd6131a6c6452babecd4a78be4c3950..42b88d83544c9afd3f1cefa8c24a8d988cadcc34 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationServiceUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationServiceUtils.java
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.SpaceIden
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 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.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleLevel;
@@ -227,6 +228,38 @@ public class AuthorizationServiceUtils
         }
     }
 
+    public void checkAccessEntity(EntityKind entityKind, TechId entityId)
+    {
+        boolean canAccess;
+
+        if (EntityKind.EXPERIMENT.equals(entityKind))
+        {
+            ExperimentPE experiment = daoFactory.getExperimentDAO().getByTechId(entityId);
+            canAccess = canAccessExperiment(experiment);
+        } else if (EntityKind.SAMPLE.equals(entityKind))
+        {
+            SamplePE sample = daoFactory.getSampleDAO().getByTechId(entityId);
+            canAccess = canAccessSample(sample);
+        } else if (EntityKind.DATA_SET.equals(entityKind))
+        {
+            DataPE dataSet = daoFactory.getDataDAO().getByTechId(entityId);
+            canAccess = canAccessDataSet(dataSet);
+        } else if (EntityKind.MATERIAL.equals(entityKind))
+        {
+            canAccess = true;
+        } else
+        {
+            throw new IllegalArgumentException("Unknown entity kind: " + entityKind);
+        }
+
+        if (false == canAccess)
+        {
+            throw new AuthorizationFailureException("User: "
+                    + (user != null ? user.getUserId() : null)
+                    + " doesn't have access to entity: " + entityKind + " with id: " + entityId);
+        }
+    }
+
     public boolean canAccessExperiment(Experiment experiment)
     {
         return canAccessExperiment(experiment.getIdentifier());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/DefaultAccessController.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/DefaultAccessController.java
index fdc603fc8ffbc4fd2f94d8d69a83fc40a9ce6fef..4672c35c419ffe47fb328ea35c7c90f3549e20b9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/DefaultAccessController.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/DefaultAccessController.java
@@ -41,7 +41,9 @@ import ch.systemsx.cisd.common.reflection.MethodUtils;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.AuthorizationGuard;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IAuthorizationDAOFactory;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.IAuthorizationConfig;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleLevel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSession;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
@@ -81,12 +83,15 @@ public final class DefaultAccessController implements IAccessController
 
     private PredicateExecutor predicateExecutor;
 
+    private IAuthorizationDAOFactory daoFactory;
+
     public DefaultAccessController(final IAuthorizationDAOFactory daoFactory)
     {
         capabilities = new CapabilityMap(new File("etc/capabilities"), daoFactory.getAuthorizationConfig());
         predicateExecutor = new PredicateExecutor();
         predicateExecutor.setPredicateFactory(new PredicateFactory());
         predicateExecutor.setDAOFactory(daoFactory);
+        this.daoFactory = daoFactory;
     }
 
     public final static List<RoleWithIdentifier> getUserRoles(final PersonPE person)
@@ -147,7 +152,9 @@ public final class DefaultAccessController implements IAccessController
                 {
                     Set<RoleWithHierarchy> argumentRoles = getArgumentRoles(method, argument, methodRoles);
                     List<RoleWithIdentifier> relevantRoles = getRelevantRoles(userRoles, argumentRoles);
+                    relevantRoles = retainConfiguredRoles(person.getUserId(), relevantRoles);
                     status = checkNotEmpty(relevantRoles, argumentRoles, session);
+
                     if (status.isError())
                     {
                         break;
@@ -160,7 +167,9 @@ public final class DefaultAccessController implements IAccessController
                 }
             } else
             {
-                status = checkNotEmpty(getRelevantRoles(userRoles, methodRoles), methodRoles, session);
+                List<RoleWithIdentifier> relevantRoles = getRelevantRoles(userRoles, methodRoles);
+                relevantRoles = retainConfiguredRoles(person.getUserId(), relevantRoles);
+                status = checkNotEmpty(relevantRoles, methodRoles, session);
             }
             return status;
         } finally
@@ -278,6 +287,29 @@ public final class DefaultAccessController implements IAccessController
         return result;
     }
 
+    private List<RoleWithIdentifier> retainConfiguredRoles(String userId, List<RoleWithIdentifier> roles)
+    {
+        IAuthorizationConfig config = daoFactory.getAuthorizationConfig();
+
+        if (config.isProjectLevelEnabled() && config.isProjectLevelUser(userId))
+        {
+            return roles;
+        } else
+        {
+            List<RoleWithIdentifier> nonProjectRoles = new ArrayList<RoleWithIdentifier>();
+
+            for (RoleWithIdentifier role : roles)
+            {
+                if (false == RoleLevel.PROJECT.equals(role.getRoleLevel()))
+                {
+                    nonProjectRoles.add(role);
+                }
+            }
+
+            return nonProjectRoles;
+        }
+    }
+
     /**
      * Retains {@link RoleWithIdentifier}s with {@link RoleWithIdentifier#getRole()} included in the set of {@link RoleWithHierarchy}s.
      * 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/DefaultReturnValueFilter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/DefaultReturnValueFilter.java
index 048fc33332771c13b9fdc92eb938c5e3e6707937..6e181ccc72cd88ab059927cbbee2314c97e3686e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/DefaultReturnValueFilter.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/DefaultReturnValueFilter.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.authorization;
 import java.lang.reflect.Array;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import org.apache.commons.lang.time.StopWatch;
@@ -31,6 +32,7 @@ import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.reflection.MethodUtils;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.ReturnValueFilter;
+import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ICollectionValidator;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.IValidator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IAuthorizationDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSession;
@@ -97,6 +99,12 @@ public final class DefaultReturnValueFilter implements IReturnValueFilter
         return (List<T>) value;
     }
 
+    @SuppressWarnings("unchecked")
+    private final static <T> Collection<T> castToCollection(final Object value)
+    {
+        return (Collection<T>) value;
+    }
+
     @SuppressWarnings("unchecked")
     private final static <T> T cast(final Object value)
     {
@@ -195,7 +203,7 @@ public final class DefaultReturnValueFilter implements IReturnValueFilter
             {
                 throw new IllegalArgumentException(String.format("Given validator class '%s' "
                         + "and list type '%s' are not compatible.", validatorClassName, list.get(0)
-                        .getClass().getName()));
+                                .getClass().getName()));
             }
         } else if (returnValueClass.isArray())
         {
@@ -224,6 +232,19 @@ public final class DefaultReturnValueFilter implements IReturnValueFilter
         }
     }
 
+    private Object proceedCollection(PersonPE person, Method method, Object returnValue, ICollectionValidator<?> validator)
+    {
+        if (returnValue instanceof Collection<?>)
+        {
+            return validator.getValid(person, castToCollection(returnValue));
+        } else
+        {
+            throw new IllegalArgumentException(
+                    String.format("Returned value '%s' is not a collection and cannot be validated by a collection validator '%s'.",
+                            returnValue.getClass(), validator.getClass().getName()));
+        }
+    }
+
     //
     // IReturnValueFilter
     //
@@ -253,8 +274,16 @@ public final class DefaultReturnValueFilter implements IReturnValueFilter
                                 ReturnValueFilter.class.getSimpleName()));
                 return returnValueOrNull;
             }
+
             final IValidator<?> validator = getValidator(annotation);
-            return proceed(session.tryGetPerson(), method, returnValueOrNull, validator);
+
+            if (validator instanceof ICollectionValidator<?>)
+            {
+                return proceedCollection(session.tryGetPerson(), method, returnValueOrNull, (ICollectionValidator<?>) validator);
+            } else
+            {
+                return proceed(session.tryGetPerson(), method, returnValueOrNull, validator);
+            }
         } finally
         {
             logTimeTaken(stopWatch, method);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/IAuthorizationDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/IAuthorizationDataProvider.java
index 3c5df547081627ec381bc2110b89a7117a9edf91..adc645b7ce2c8fb4ac415b268ad2eb8c02d89bdf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/IAuthorizationDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/IAuthorizationDataProvider.java
@@ -153,7 +153,7 @@ public interface IAuthorizationDataProvider
     /**
      * Returns the information necessary to determine if a user is allowed to access the data sets.
      */
-    public Set<DataSetAccessPE> getDatasetCollectionAccessDataByTechIds(List<TechId> dataSetIds);
+    public Set<DataSetAccessPE> getDatasetCollectionAccessDataByTechIds(List<TechId> dataSetIds, boolean grouped);
 
     /**
      * Returns the information necessary to determine if a user is allowed to access the data sets.
@@ -163,7 +163,7 @@ public interface IAuthorizationDataProvider
     /**
      * Returns the information necessary to determine if a user is allowed to access the samples.
      */
-    public Set<SampleAccessPE> getSampleCollectionAccessDataByTechIds(List<TechId> sampleIds);
+    public Set<SampleAccessPE> getSampleCollectionAccessDataByTechIds(List<TechId> sampleIds, boolean grouped);
 
     /**
      * Returns the information necessary to determine if a user is allowed to access the samples.
@@ -173,7 +173,7 @@ public interface IAuthorizationDataProvider
     /**
      * Returns the information necessary to determine if a user is allowed to access the experiments.
      */
-    public Set<ExperimentAccessPE> getExperimentCollectionAccessData(List<TechId> experimentIds);
+    public Set<ExperimentAccessPE> getExperimentCollectionAccessData(List<TechId> experimentIds, boolean grouped);
 
     /**
      * Returns the information necessary to determine if a user is allowed to delete/revert the data sets.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/RoleWithIdentifier.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/RoleWithIdentifier.java
index 178e0900a8687b7ae52a37936604cf288fc98d5b..706be1d221a9604293cca6431041c278163dc04a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/RoleWithIdentifier.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/RoleWithIdentifier.java
@@ -94,27 +94,13 @@ public final class RoleWithIdentifier
     public final static RoleWithIdentifier createRole(final RoleAssignmentPE roleAssignment)
     {
         assert roleAssignment != null : "Unspecified role assignment";
-        final RoleLevel roleLevel = figureRoleLevel(roleAssignment);
+        final RoleLevel roleLevel = roleAssignment.getRoleLevel();
         final RoleCode roleName = roleAssignment.getRole();
         final SpacePE space = roleAssignment.getSpace();
         final ProjectPE project = roleAssignment.getProject();
         return new RoleWithIdentifier(roleLevel, roleName, space, project);
     }
 
-    private static RoleLevel figureRoleLevel(final RoleAssignmentPE roleAssignment)
-    {
-        if (roleAssignment.getProject() != null)
-        {
-            return RoleLevel.PROJECT;
-        } else if (roleAssignment.getSpace() != null)
-        {
-            return RoleLevel.SPACE;
-        } else
-        {
-            return RoleLevel.INSTANCE;
-        }
-    }
-
     //
     // Role
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractExpressionPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractExpressionPredicate.java
index 310555c950527e46fd6b8db26da4ecb65580af19..cb7ce427163d0836c95bb7d539119b043c5ff3b1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractExpressionPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractExpressionPredicate.java
@@ -168,7 +168,7 @@ abstract public class AbstractExpressionPredicate<T> extends AbstractPredicate<T
         final Set<RoleAssignmentPE> roleAssignments = person.getAllPersonRoles();
         for (final RoleAssignmentPE roleAssignment : roleAssignments)
         {
-            if (roleAssignment.getSpace() == null)
+            if (roleAssignment.getRoleWithHierarchy().isInstanceLevel())
             {
                 return true;
             }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetTechIdCollectionPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetTechIdCollectionPredicate.java
index 82ac118586f9fb74fea4451c0b2f6d7eea51b056..41d4b0b1dbaa946101ef0768836ec3850648f161 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetTechIdCollectionPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetTechIdCollectionPredicate.java
@@ -40,7 +40,7 @@ public class DataSetTechIdCollectionPredicate extends DelegatedPredicate<Collect
     @Override
     public Collection<DataSetAccessPE> tryConvert(List<TechId> techIds)
     {
-        return authorizationDataProvider.getDatasetCollectionAccessDataByTechIds(techIds);
+        return authorizationDataProvider.getDatasetCollectionAccessDataByTechIds(techIds, true);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetTechIdPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetTechIdPredicate.java
index db3929ba2824f2982b21a6f11a451291dfa7ed3e..a2570f95abf1b1e8a525d4a9c720e6a590a2dc4c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetTechIdPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetTechIdPredicate.java
@@ -43,7 +43,7 @@ public class DataSetTechIdPredicate extends DelegatedPredicate<Collection<DataSe
             return Arrays.asList();
         } else
         {
-            return authorizationDataProvider.getDatasetCollectionAccessDataByTechIds(Arrays.asList(techId));
+            return authorizationDataProvider.getDatasetCollectionAccessDataByTechIds(Arrays.asList(techId), true);
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/RevertDeletionPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/RevertDeletionPredicate.java
index 9e0034066cb8463b02bfb5ea5780d5ed07d78238..c80e4f2bb16d4a1ca39c92a5af5e24fd02c7e7ee 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/RevertDeletionPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/RevertDeletionPredicate.java
@@ -97,7 +97,7 @@ public class RevertDeletionPredicate extends AbstractPredicate<List<TechId>>
         final Set<RoleAssignmentPE> roleAssignments = person.getAllPersonRoles();
         for (final RoleAssignmentPE roleAssignment : roleAssignments)
         {
-            if (roleAssignment.getSpace() == null && roleAssignment.getProject() == null && roleAssignment.getRole().equals(RoleCode.ADMIN))
+            if (roleAssignment.getRoleWithHierarchy().isInstanceLevel() && roleAssignment.getRole().equals(RoleCode.ADMIN))
             {
                 return true;
             }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleTechIdCollectionPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleTechIdCollectionPredicate.java
index e9a3afaf45ad79e467327f2b5aa4e46f32a5f824..99c289ce354cf351739f897148c7fb0b9f2a0f46 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleTechIdCollectionPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleTechIdCollectionPredicate.java
@@ -45,7 +45,7 @@ public class SampleTechIdCollectionPredicate extends DelegatedPredicate<Collecti
     @Override
     public Collection<SampleAccessPE> tryConvert(List<TechId> techIds)
     {
-        return authorizationDataProvider.getSampleCollectionAccessDataByTechIds(techIds);
+        return authorizationDataProvider.getSampleCollectionAccessDataByTechIds(techIds, true);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleTechIdPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleTechIdPredicate.java
index b550773f6a4bbdfc3bd2276ebb2f40984ad5aa71..ec9e81bfe0100e0e2342fd18046b5d05ff88125b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleTechIdPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleTechIdPredicate.java
@@ -69,7 +69,7 @@ public class SampleTechIdPredicate extends AbstractDatabaseInstancePredicate<Tec
             final TechId techId)
     {
         Set<SampleAccessPE> samples =
-                authorizationDataProvider.getSampleCollectionAccessDataByTechIds(techId != null ? Arrays.asList(techId) : Arrays.asList());
+                authorizationDataProvider.getSampleCollectionAccessDataByTechIds(techId != null ? Arrays.asList(techId) : Arrays.asList(), true);
         return sampleAccessPECollectionPredicate.doEvaluation(person, allowedRoles, samples);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/AbstractCollectionValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/AbstractCollectionValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec10eb69103463818871267557150b85746c47e2
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/AbstractCollectionValidator.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2017 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.generic.server.authorization.validator;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import ch.systemsx.cisd.openbis.generic.server.authorization.IAuthorizationDataProvider;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
+
+/**
+ * @author pkupczyk
+ */
+public abstract class AbstractCollectionValidator<T> implements ICollectionValidator<T>
+{
+
+    protected IAuthorizationDataProvider authorizationDataProvider;
+
+    @Override
+    public void init(
+            @SuppressWarnings("hiding") IAuthorizationDataProvider authorizationDataProvider)
+    {
+        this.authorizationDataProvider = authorizationDataProvider;
+    }
+
+    @Override
+    public boolean isValid(PersonPE person, T value)
+    {
+        Collection<T> valid = getValid(person, Arrays.asList(value));
+        return false == valid.isEmpty();
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/DeletionValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/DeletionValidator.java
index e1e348c22acf65551149f6e5d9141f2927b01022..6668ff5378ffd57fd6f868697ec346a28dd950c4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/DeletionValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/DeletionValidator.java
@@ -184,7 +184,7 @@ public final class DeletionValidator extends AbstractValidator<Deletion>
         final Set<RoleAssignmentPE> roleAssignments = person.getAllPersonRoles();
         for (final RoleAssignmentPE roleAssignment : roleAssignments)
         {
-            if (roleAssignment.getSpace() == null && roleAssignment.getProject() == null && roleAssignment.getRole().equals(RoleCode.ADMIN))
+            if (roleAssignment.getRoleWithHierarchy().isInstanceLevel() && roleAssignment.getRole().equals(RoleCode.ADMIN))
             {
                 return true;
             }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/EntityHistoryValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/EntityHistoryValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..b816548e5189bacca561d863377f9d313a1a6c55
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/EntityHistoryValidator.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2008 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.authorization.validator;
+
+import ch.systemsx.cisd.openbis.generic.server.authorization.IAuthorizationDataProvider;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityHistory;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
+
+/**
+ * @author pkupczyk
+ */
+public final class EntityHistoryValidator extends AbstractValidator<EntityHistory>
+{
+
+    private final IValidator<Space> spaceValidator;
+
+    private final IValidator<Project> projectValidator;
+
+    private final IValidator<Experiment> experimentValidator;
+
+    private final IValidator<Sample> sampleValidator;
+
+    private final IValidator<AbstractExternalData> dataSetValidator;
+
+    public EntityHistoryValidator()
+    {
+        spaceValidator = new SpaceValidator();
+        projectValidator = new ProjectValidator();
+        experimentValidator = new ExperimentValidator();
+        sampleValidator = new SampleValidator();
+        dataSetValidator = new ExternalDataValidator();
+    }
+
+    @Override
+    public void init(IAuthorizationDataProvider provider)
+    {
+        super.init(provider);
+        spaceValidator.init(provider);
+        projectValidator.init(provider);
+        experimentValidator.init(provider);
+        sampleValidator.init(provider);
+        dataSetValidator.init(provider);
+    }
+
+    @Override
+    public final boolean doValidation(final PersonPE person, final EntityHistory value)
+    {
+        boolean valid = true;
+
+        if (valid && value.tryGetRelatedSpace() != null)
+        {
+            valid = valid && spaceValidator.isValid(person, value.tryGetRelatedSpace());
+        }
+
+        if (valid && value.tryGetRelatedProject() != null)
+        {
+            valid = valid && projectValidator.isValid(person, value.tryGetRelatedProject());
+        }
+
+        if (valid && value.tryGetRelatedEntity() != null)
+        {
+            IEntityInformationHolderWithIdentifier entity = value.tryGetRelatedEntity();
+
+            if (entity instanceof Experiment)
+            {
+                valid = valid && experimentValidator.isValid(person, (Experiment) entity);
+            } else if (entity instanceof Sample)
+            {
+                valid = valid && sampleValidator.isValid(person, (Sample) entity);
+            } else if (entity instanceof AbstractExternalData)
+            {
+                valid = valid && dataSetValidator.isValid(person, (AbstractExternalData) entity);
+            } else
+            {
+                throw new IllegalArgumentException("Unsupporeted related entity: " + entity.getClass());
+            }
+        }
+
+        return valid;
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExpressionValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExpressionValidator.java
index c4c5be5795fda8517a251e9ade853bae0d627061..432d966ca60c1ba7a3fc360247ec201b51c210d9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExpressionValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExpressionValidator.java
@@ -56,7 +56,7 @@ public final class ExpressionValidator extends AbstractValidator<AbstractExpress
         final Set<RoleAssignmentPE> roleAssignments = person.getAllPersonRoles();
         for (final RoleAssignmentPE roleAssignment : roleAssignments)
         {
-            if (roleAssignment.getSpace() == null && roleAssignment.getRole().equals(RoleCode.ADMIN))
+            if (roleAssignment.getRoleWithHierarchy().isInstanceLevel() && roleAssignment.getRole().equals(RoleCode.ADMIN))
             {
                 return true;
             }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ICollectionValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ICollectionValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..4cfc979884c91f0216539c8fb2f9f6786acdda17
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ICollectionValidator.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2008 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.authorization.validator;
+
+import java.util.Collection;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
+
+/**
+ * A validator that allows to validate not only a single object but also a collection of objects at once. When validating a whole collection the
+ * validator can make some optimizations, e.g. fetch the data needed by the validation only once.
+ * 
+ * @author pkupczyk
+ */
+public interface ICollectionValidator<T> extends IValidator<T>
+{
+
+    /**
+     * Validates given <var>values</var> for a given <var>person</var>. Returns only values that the given person is allowed to see.
+     */
+    public Collection<T> getValid(final PersonPE person, final Collection<T> values);
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/MatchingEntityValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/MatchingEntityValidator.java
index cc7ec0ce157b835ac2c399744dc910d5f6982a75..6b6ebe2ee2a6398c6974684d746c27d59fd77046 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/MatchingEntityValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/MatchingEntityValidator.java
@@ -16,17 +16,39 @@
 
 package ch.systemsx.cisd.openbis.generic.server.authorization.validator;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import ch.systemsx.cisd.openbis.generic.server.authorization.project.IProjectAuthorization;
+import ch.systemsx.cisd.openbis.generic.server.authorization.project.ProjectAuthorizationBuilder;
+import ch.systemsx.cisd.openbis.generic.server.authorization.project.provider.project.ProjectProviderFromProjectIdentifierObject;
+import ch.systemsx.cisd.openbis.generic.server.authorization.project.provider.role.RolesProviderFromPersonPE;
+import ch.systemsx.cisd.openbis.generic.server.authorization.project.provider.user.UserProviderFromPersonPE;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.IAuthorizationConfig;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetAccessPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentAccessPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SampleAccessPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 
 /**
  * A {@link IValidator} implementation suitable for {@link MatchingEntity}.
  * 
  * @author Christian Ribeaud
  */
-public final class MatchingEntityValidator extends AbstractValidator<MatchingEntity>
+public final class MatchingEntityValidator extends AbstractCollectionValidator<MatchingEntity>
 {
+
     private final IValidator<Space> groupValidator;
 
     public MatchingEntityValidator()
@@ -34,20 +56,213 @@ public final class MatchingEntityValidator extends AbstractValidator<MatchingEnt
         groupValidator = new SpaceValidator();
     }
 
-    //
-    // AbstractValidator
-    //
-
     @Override
-    public boolean doValidation(final PersonPE person, final MatchingEntity entity)
+    public Collection<MatchingEntity> getValid(PersonPE person, Collection<MatchingEntity> entities)
+    {
+        if (isInstanceUser(person))
+        {
+            return entities;
+        }
+
+        Set<String> spacesWithValidProjects = getSpacesWithValidProjects(person);
+
+        Set<Long> validMaterialIds = new HashSet<Long>();
+        Set<Long> validExperimentIds = new HashSet<Long>();
+        Set<Long> validSampleIds = new HashSet<Long>();
+        Set<Long> validDataSetIds = new HashSet<Long>();
+
+        Set<Long> potentiallyValidExperimentIds = new HashSet<Long>();
+        Set<Long> potentiallyValidSampleIds = new HashSet<Long>();
+        Set<Long> potentiallyValidDataSetIds = new HashSet<Long>();
+
+        for (MatchingEntity entity : entities)
+        {
+            if (entity == null)
+            {
+                continue;
+            }
+
+            if (entity.tryGetSpace() == null)
+            {
+                if (EntityKind.MATERIAL.equals(entity.getEntityKind()))
+                {
+                    validMaterialIds.add(entity.getId());
+                } else if (EntityKind.SAMPLE.equals(entity.getEntityKind()))
+                {
+                    validSampleIds.add(entity.getId());
+                }
+            } else
+            {
+                boolean valid = groupValidator.isValid(person, entity.tryGetSpace());
+
+                if (valid)
+                {
+                    if (EntityKind.EXPERIMENT.equals(entity.getEntityKind()))
+                    {
+                        validExperimentIds.add(entity.getId());
+                    } else if (EntityKind.SAMPLE.equals(entity.getEntityKind()))
+                    {
+                        validSampleIds.add(entity.getId());
+                    } else if (EntityKind.DATA_SET.equals(entity.getEntityKind()))
+                    {
+                        validDataSetIds.add(entity.getId());
+                    }
+                } else
+                {
+                    boolean potentiallyValid = spacesWithValidProjects.contains(entity.tryGetSpace().getCode());
+
+                    if (potentiallyValid)
+                    {
+                        if (EntityKind.EXPERIMENT.equals(entity.getEntityKind()))
+                        {
+                            potentiallyValidExperimentIds.add(entity.getId());
+                        } else if (EntityKind.SAMPLE.equals(entity.getEntityKind()))
+                        {
+                            potentiallyValidSampleIds.add(entity.getId());
+                        } else if (EntityKind.DATA_SET.equals(entity.getEntityKind()))
+                        {
+                            potentiallyValidDataSetIds.add(entity.getId());
+                        }
+                    }
+                }
+            }
+        }
+
+        IAuthorizationConfig authorizationConfig = authorizationDataProvider.getAuthorizationConfig();
+
+        if (authorizationConfig.isProjectLevelEnabled() && authorizationConfig.isProjectLevelUser(person.getUserId()))
+        {
+            Map<ProjectIdentifier, Boolean> validatedProjects = new HashMap<ProjectIdentifier, Boolean>();
+
+            if (false == potentiallyValidExperimentIds.isEmpty())
+            {
+                Set<ExperimentAccessPE> accessDatas = authorizationDataProvider.getExperimentCollectionAccessData(
+                        TechId.createList(new ArrayList<Long>(potentiallyValidExperimentIds)), false);
+
+                for (ExperimentAccessPE accessData : accessDatas)
+                {
+                    if (isValidProject(person, accessData.getProjectIdentifier(), validatedProjects))
+                    {
+                        validExperimentIds.add(accessData.getExperimentId());
+                    }
+                }
+            }
+
+            if (false == potentiallyValidSampleIds.isEmpty())
+            {
+                Set<SampleAccessPE> accessDatas = authorizationDataProvider.getSampleCollectionAccessDataByTechIds(
+                        TechId.createList(new ArrayList<Long>(potentiallyValidSampleIds)), false);
+
+                for (SampleAccessPE accessData : accessDatas)
+                {
+                    if (isValidProject(person, accessData.getProjectIdentifier(), validatedProjects))
+                    {
+                        validSampleIds.add(accessData.getSampleId());
+                    }
+                }
+            }
+
+            if (false == potentiallyValidDataSetIds.isEmpty())
+            {
+                Set<DataSetAccessPE> accessDatas = authorizationDataProvider.getDatasetCollectionAccessDataByTechIds(
+                        TechId.createList(new ArrayList<Long>(potentiallyValidDataSetIds)), false);
+
+                for (DataSetAccessPE accessData : accessDatas)
+                {
+                    if (isValidProject(person, accessData.getProjectIdentifier(), validatedProjects))
+                    {
+                        validDataSetIds.add(accessData.getDataSetId());
+                    }
+                }
+            }
+        }
+
+        List<MatchingEntity> validEntities = new ArrayList<MatchingEntity>();
+
+        for (MatchingEntity entity : entities)
+        {
+            if (entity != null)
+            {
+                boolean valid = false;
+
+                if (EntityKind.MATERIAL.equals(entity.getEntityKind()))
+                {
+                    valid = validMaterialIds.contains(entity.getId());
+                } else if (EntityKind.EXPERIMENT.equals(entity.getEntityKind()))
+                {
+                    valid = validExperimentIds.contains(entity.getId());
+                } else if (EntityKind.SAMPLE.equals(entity.getEntityKind()))
+                {
+                    valid = validSampleIds.contains(entity.getId());
+                } else if (EntityKind.DATA_SET.equals(entity.getEntityKind()))
+                {
+                    valid = validDataSetIds.contains(entity.getId());
+                }
+
+                if (valid)
+                {
+                    validEntities.add(entity);
+                }
+            }
+        }
+
+        return validEntities;
+    }
+
+    private boolean isInstanceUser(PersonPE person)
     {
-        final Space spaceOrNull = entity.tryGetSpace();
-        if (spaceOrNull != null)
+        for (RoleAssignmentPE role : person.getAllPersonRoles())
         {
-            return groupValidator.isValid(person, spaceOrNull);
+            if (role.getRoleWithHierarchy().isInstanceLevel())
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private Set<String> getSpacesWithValidProjects(PersonPE person)
+    {
+        Set<String> spaces = new HashSet<String>();
+
+        for (RoleAssignmentPE role : person.getAllPersonRoles())
+        {
+            if (role.getProject() != null)
+            {
+                spaces.add(role.getProject().getSpace().getCode());
+            }
+        }
+
+        return spaces;
+    }
+
+    private boolean isValidProject(PersonPE person, ProjectIdentifier project, Map<ProjectIdentifier, Boolean> cache)
+    {
+        Boolean valid = cache.get(project);
+
+        if (valid != null)
+        {
+            return valid;
         } else
         {
-            return true;
+            if (project == null)
+            {
+                valid = false;
+            } else
+            {
+                IProjectAuthorization<ProjectIdentifier> pa = new ProjectAuthorizationBuilder<ProjectIdentifier>()
+                        .withData(authorizationDataProvider)
+                        .withUser(new UserProviderFromPersonPE(person))
+                        .withRoles(new RolesProviderFromPersonPE(person))
+                        .withObjects(new ProjectProviderFromProjectIdentifierObject(project))
+                        .build();
+                valid = pa.getObjectsWithoutAccess().isEmpty();
+            }
+
+            cache.put(project, valid);
+
+            return valid;
         }
     }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SimpleSpaceValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SimpleSpaceValidator.java
index cd1faf529788a80ece23872aaee50a11af216de7..83b30d4a333406e5466e1a8c106393b02c9e4b55 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SimpleSpaceValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SimpleSpaceValidator.java
@@ -20,7 +20,6 @@ import java.util.Set;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 
@@ -41,14 +40,13 @@ public class SimpleSpaceValidator extends AbstractValidator<ICodeHolder>
         }
         for (final RoleAssignmentPE roleAssignment : roleAssignments)
         {
-            final SpacePE space = roleAssignment.getSpace();
-            final ProjectPE project = roleAssignment.getProject();
-
-            if (space == null && project == null)
+            if (roleAssignment.getRoleWithHierarchy().isInstanceLevel())
             {
                 return true;
             }
 
+            final SpacePE space = roleAssignment.getSpace();
+
             if (space != null && space.getCode().equals(spaceCode))
             {
                 return true;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SpaceValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SpaceValidator.java
index 595760d1071a3a8434c5975eef72b3531154aef4..9a6856fa2ba5242390600e37cd3b5ac50f4eb2b5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SpaceValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/SpaceValidator.java
@@ -20,7 +20,6 @@ import java.util.Set;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 
@@ -42,14 +41,13 @@ public final class SpaceValidator extends AbstractValidator<Space>
         final Set<RoleAssignmentPE> roleAssignments = person.getAllPersonRoles();
         for (final RoleAssignmentPE roleAssignment : roleAssignments)
         {
-            final SpacePE group = roleAssignment.getSpace();
-            final ProjectPE project = roleAssignment.getProject();
-
-            if (group == null && project == null)
+            if (roleAssignment.getRoleWithHierarchy().isInstanceLevel())
             {
                 return true;
             }
 
+            final SpacePE group = roleAssignment.getSpace();
+
             if (group != null && group.getCode().equals(value.getCode()))
             {
                 return true;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetAccessPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetAccessPE.java
index 8d432b291162f959b8c9e580142a90509af5d03c..e1121c1c4b94ac4b97991af098d964148df79b27 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetAccessPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataSetAccessPE.java
@@ -45,7 +45,7 @@ public class DataSetAccessPE
 {
 
     private final static String DATASET_ACCESS_QUERY_PART_1 =
-            "SELECT d.code as dataSetCode, ep.code as experimentProjectCode, es.code as experimentSpaceCode, ss.code as sampleSpaceCode, "
+            "SELECT d.id as dataSetId, d.code as dataSetCode, ep.code as experimentProjectCode, es.code as experimentSpaceCode, ss.code as sampleSpaceCode, "
                     + "sep.code as sampleExperimentProjectCode, ses.code as sampleExperimentSpaceCode, "
                     + "sp.code as sampleProjectCode, sps.code as sampleProjectSpaceCode "
                     + "FROM ";
@@ -95,6 +95,8 @@ public class DataSetAccessPE
 
     public final static String RESULT_SET_MAPPING = "dataset_access_implicit";
 
+    private Long dataSetId;
+
     private String dataSetCode;
 
     private String experimentProjectCode;
@@ -111,6 +113,8 @@ public class DataSetAccessPE
 
     private String sampleProjectSpaceCode;
 
+    private boolean group;
+
     /**
      * A factory method that should only be used for testing.
      */
@@ -162,6 +166,16 @@ public class DataSetAccessPE
     }
 
     @Id
+    public Long getDataSetId()
+    {
+        return dataSetId;
+    }
+
+    public void setDataSetId(Long dataSetId)
+    {
+        this.dataSetId = dataSetId;
+    }
+
     public String getDataSetCode()
     {
         return dataSetCode;
@@ -242,6 +256,17 @@ public class DataSetAccessPE
         this.sampleProjectSpaceCode = sampleProjectSpaceCode;
     }
 
+    public void setGroup(boolean group)
+    {
+        this.group = group;
+    }
+
+    @Transient
+    public boolean isGroup()
+    {
+        return group;
+    }
+
     //
     // Object
     //
@@ -257,16 +282,25 @@ public class DataSetAccessPE
         {
             return false;
         }
+
         final DataSetAccessPE that = (DataSetAccessPE) obj;
         final EqualsBuilder builder = new EqualsBuilder();
-        builder.append(getDataSetCode(), that.getDataSetCode());
-        builder.append(getExperimentProjectCode(), that.getExperimentProjectCode());
-        builder.append(getExperimentSpaceCode(), that.getExperimentSpaceCode());
-        builder.append(getSampleSpaceCode(), that.getSampleSpaceCode());
-        builder.append(getSampleExperimentProjectCode(), that.getSampleExperimentProjectCode());
-        builder.append(getSampleExperimentSpaceCode(), that.getSampleExperimentSpaceCode());
-        builder.append(getSampleProjectCode(), that.getSampleProjectCode());
-        builder.append(getSampleProjectSpaceCode(), that.getSampleProjectSpaceCode());
+
+        if (isGroup())
+        {
+            builder.append(getDataSetCode(), that.getDataSetCode());
+            builder.append(getExperimentProjectCode(), that.getExperimentProjectCode());
+            builder.append(getExperimentSpaceCode(), that.getExperimentSpaceCode());
+            builder.append(getSampleSpaceCode(), that.getSampleSpaceCode());
+            builder.append(getSampleExperimentProjectCode(), that.getSampleExperimentProjectCode());
+            builder.append(getSampleExperimentSpaceCode(), that.getSampleExperimentSpaceCode());
+            builder.append(getSampleProjectCode(), that.getSampleProjectCode());
+            builder.append(getSampleProjectSpaceCode(), that.getSampleProjectSpaceCode());
+        } else
+        {
+            builder.append(getDataSetId(), that.getDataSetId());
+        }
+
         return builder.isEquals();
     }
 
@@ -274,14 +308,23 @@ public class DataSetAccessPE
     public int hashCode()
     {
         final HashCodeBuilder builder = new HashCodeBuilder();
-        builder.append(getDataSetCode());
-        builder.append(getExperimentProjectCode());
-        builder.append(getExperimentSpaceCode());
-        builder.append(getSampleSpaceCode());
-        builder.append(getSampleExperimentProjectCode());
-        builder.append(getSampleExperimentSpaceCode());
-        builder.append(getSampleProjectCode());
-        builder.append(getSampleProjectSpaceCode());
+
+        if (isGroup())
+        {
+            builder.append(getDataSetCode());
+            builder.append(getExperimentProjectCode());
+            builder.append(getExperimentSpaceCode());
+            builder.append(getSampleSpaceCode());
+            builder.append(getSampleExperimentProjectCode());
+            builder.append(getSampleExperimentSpaceCode());
+            builder.append(getSampleProjectCode());
+            builder.append(getSampleProjectSpaceCode());
+        } else
+        {
+            builder.append(getDataSetId());
+        }
+
         return builder.toHashCode();
     }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentAccessPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentAccessPE.java
index b4bc7016bf995f635527b19ca9296f5c3feea391..c9091de2cd22ff10d723d9ed58b350cb61ae42e3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentAccessPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentAccessPE.java
@@ -22,10 +22,13 @@ import javax.persistence.Id;
 import javax.persistence.NamedNativeQueries;
 import javax.persistence.NamedNativeQuery;
 import javax.persistence.SqlResultSetMapping;
+import javax.persistence.Transient;
 
 import org.apache.commons.lang.builder.EqualsBuilder;
 import org.apache.commons.lang.builder.HashCodeBuilder;
 
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
+
 /**
  * @author Pawel Glyzewski
  */
@@ -39,7 +42,7 @@ public class ExperimentAccessPE
 {
 
     public final static String EXPERIMENT_ACCESS_QUERY =
-            "SELECT s.code as spaceCode, p.code as projectCode, e.code as experimentCode "
+            "SELECT s.code as spaceCode, p.code as projectCode, e.code as experimentCode, e.id as experimentId "
                     + "FROM "
                     + TableNames.EXPERIMENTS_VIEW
                     + " e inner join "
@@ -50,7 +53,7 @@ public class ExperimentAccessPE
                     + "WHERE e.id in (:ids)";
 
     public final static String DELETED_EXPERIMENT_ACCESS_QUERY =
-            "SELECT s.code as spaceCode, p.code as projectCode, e.code as experimentCode "
+            "SELECT s.code as spaceCode, p.code as projectCode, e.code as experimentCode, e.id as experimentId "
                     + "FROM "
                     + TableNames.DELETED_EXPERIMENTS_VIEW
                     + " e inner join "
@@ -66,6 +69,10 @@ public class ExperimentAccessPE
 
     private String experimentCode;
 
+    private Long experimentId;
+
+    private boolean group;
+
     public final static String EXPERIMENT_ACCESS_QUERY_NAME = "experiment_access";
 
     public final static String DELETED_EXPERIMENT_ACCESS_QUERY_NAME = "deleted_experiment_access";
@@ -81,7 +88,6 @@ public class ExperimentAccessPE
         this.spaceCode = spaceCode;
     }
 
-    @Id
     public String getSpaceCode()
     {
         return spaceCode;
@@ -92,6 +98,18 @@ public class ExperimentAccessPE
         this.projectCode = projectCode;
     }
 
+    @Transient
+    public ProjectIdentifier getProjectIdentifier()
+    {
+        if (getSpaceCode() != null && getProjectCode() != null)
+        {
+            return new ProjectIdentifier(getSpaceCode(), getProjectCode());
+        } else
+        {
+            return null;
+        }
+    }
+
     public String getProjectCode()
     {
         return projectCode;
@@ -107,6 +125,28 @@ public class ExperimentAccessPE
         return experimentCode;
     }
 
+    public void setExperimentId(Long experimentId)
+    {
+        this.experimentId = experimentId;
+    }
+
+    @Id
+    public Long getExperimentId()
+    {
+        return experimentId;
+    }
+
+    public void setGroup(boolean group)
+    {
+        this.group = group;
+    }
+
+    @Transient
+    public boolean isGroup()
+    {
+        return group;
+    }
+
     //
     // Object
     //
@@ -122,11 +162,20 @@ public class ExperimentAccessPE
         {
             return false;
         }
+
         final ExperimentAccessPE that = (ExperimentAccessPE) obj;
         final EqualsBuilder builder = new EqualsBuilder();
-        builder.append(getSpaceCode(), that.getSpaceCode());
-        builder.append(getProjectCode(), that.getProjectCode());
-        builder.append(getExperimentCode(), that.getExperimentCode());
+
+        if (isGroup())
+        {
+            builder.append(getSpaceCode(), that.getSpaceCode());
+            builder.append(getProjectCode(), that.getProjectCode());
+            builder.append(getExperimentCode(), that.getExperimentCode());
+        } else
+        {
+            builder.append(getExperimentId(), that.getExperimentId());
+        }
+
         return builder.isEquals();
     }
 
@@ -134,9 +183,17 @@ public class ExperimentAccessPE
     public int hashCode()
     {
         final HashCodeBuilder builder = new HashCodeBuilder();
-        builder.append(getSpaceCode());
-        builder.append(getProjectCode());
-        builder.append(getExperimentCode());
+
+        if (isGroup())
+        {
+            builder.append(getSpaceCode());
+            builder.append(getProjectCode());
+            builder.append(getExperimentCode());
+        } else
+        {
+            builder.append(getExperimentId());
+        }
+
         return builder.toHashCode();
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/RoleAssignmentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/RoleAssignmentPE.java
index d4947a352ea7fa09a6ff678bf871dbab0e584af5..a64678c41c47dd74a5614741884a47e8cc99fa1e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/RoleAssignmentPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/RoleAssignmentPE.java
@@ -42,7 +42,9 @@ import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.reflection.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleCode;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleLevel;
 import ch.systemsx.cisd.openbis.generic.shared.util.EqualsHashUtils;
 
 /**
@@ -172,6 +174,27 @@ public final class RoleAssignmentPE extends HibernateAbstractRegistrationHolder
         return id;
     }
 
+    @Transient
+    public RoleLevel getRoleLevel()
+    {
+        if (getProject() != null)
+        {
+            return RoleLevel.PROJECT;
+        } else if (getSpace() != null)
+        {
+            return RoleLevel.SPACE;
+        } else
+        {
+            return RoleLevel.INSTANCE;
+        }
+    }
+
+    @Transient
+    public RoleWithHierarchy getRoleWithHierarchy()
+    {
+        return RoleWithHierarchy.valueOf(getRoleLevel(), getRole());
+    }
+
     //
     // Object
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java
index f7b6b3346bac0f750842d6ff73276dd8342324d8..9c442a2203a23140ca0e1ba4fdb5979efa9661f3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java
@@ -16,17 +16,20 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.dto;
 
-import javax.persistence.Id;
 import javax.persistence.Entity;
 import javax.persistence.EntityResult;
+import javax.persistence.Id;
 import javax.persistence.NamedNativeQueries;
 import javax.persistence.NamedNativeQuery;
 import javax.persistence.SqlResultSetMapping;
+import javax.persistence.Transient;
 
 import org.apache.commons.lang.builder.EqualsBuilder;
 import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.apache.commons.lang.builder.ToStringBuilder;
 
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
+
 /**
  * A PE for retrieving only the information necessary to determine if a user/person can access a sample.
  * 
@@ -42,7 +45,7 @@ public class SampleAccessPE
 {
 
     private final static String SAMPLE_ACCESS_QUERY_PART_1 =
-            "SELECT g.code as spaceCode, p.code as projectCode, ep.code as experimentProjectCode, e.code as experimentCode, s.code as sampleCode, c.code as containerCode FROM ";
+            "SELECT g.code as spaceCode, p.code as projectCode, ep.code as experimentProjectCode, e.code as experimentCode, s.code as sampleCode, s.id as sampleId, c.code as containerCode FROM ";
 
     private final static String SAMPLE_ACCESS_QUERY_PART_2 = " s left outer join "
             + TableNames.SPACES_TABLE
@@ -85,10 +88,14 @@ public class SampleAccessPE
 
     private String experimentCode;
 
+    private Long sampleId;
+
     private String sampleCode;
 
     private String containerCode;
 
+    private boolean group;
+
     public String getSpaceCode()
     {
         return spaceCode;
@@ -99,6 +106,23 @@ public class SampleAccessPE
         this.spaceCode = spaceCode;
     }
 
+    @Transient
+    public ProjectIdentifier getProjectIdentifier()
+    {
+        if (getSpaceCode() != null)
+        {
+            if (getProjectCode() != null)
+            {
+                return new ProjectIdentifier(getSpaceCode(), getProjectCode());
+            } else if (getExperimentProjectCode() != null)
+            {
+                return new ProjectIdentifier(getSpaceCode(), getExperimentProjectCode());
+            }
+        }
+
+        return null;
+    }
+
     public String getProjectCode()
     {
         return projectCode;
@@ -129,7 +153,17 @@ public class SampleAccessPE
         this.experimentCode = experimentCode;
     }
 
+    public void setSampleId(Long sampleId)
+    {
+        this.sampleId = sampleId;
+    }
+
     @Id
+    public Long getSampleId()
+    {
+        return sampleId;
+    }
+
     public String getSampleCode()
     {
         return sampleCode;
@@ -150,6 +184,17 @@ public class SampleAccessPE
         this.containerCode = containerCode;
     }
 
+    public void setGroup(boolean group)
+    {
+        this.group = group;
+    }
+
+    @Transient
+    public boolean isGroup()
+    {
+        return group;
+    }
+
     //
     // Object
     //
@@ -165,14 +210,23 @@ public class SampleAccessPE
         {
             return false;
         }
+
         final SampleAccessPE that = (SampleAccessPE) obj;
         final EqualsBuilder builder = new EqualsBuilder();
-        builder.append(getSpaceCode(), that.getSpaceCode());
-        builder.append(getProjectCode(), that.getProjectCode());
-        builder.append(getExperimentProjectCode(), that.getExperimentProjectCode());
-        builder.append(getExperimentCode(), that.getExperimentCode());
-        builder.append(getSampleCode(), that.getSampleCode());
-        builder.append(getContainerCode(), that.getContainerCode());
+
+        if (isGroup())
+        {
+            builder.append(getSpaceCode(), that.getSpaceCode());
+            builder.append(getProjectCode(), that.getProjectCode());
+            builder.append(getExperimentProjectCode(), that.getExperimentProjectCode());
+            builder.append(getExperimentCode(), that.getExperimentCode());
+            builder.append(getSampleCode(), that.getSampleCode());
+            builder.append(getContainerCode(), that.getContainerCode());
+        } else
+        {
+            builder.append(getSampleId(), that.getSampleId());
+        }
+
         return builder.isEquals();
     }
 
@@ -180,12 +234,20 @@ public class SampleAccessPE
     public int hashCode()
     {
         final HashCodeBuilder builder = new HashCodeBuilder();
-        builder.append(getSpaceCode());
-        builder.append(getProjectCode());
-        builder.append(getExperimentProjectCode());
-        builder.append(getExperimentCode());
-        builder.append(getSampleCode());
-        builder.append(getContainerCode());
+
+        if (isGroup())
+        {
+            builder.append(getSpaceCode());
+            builder.append(getProjectCode());
+            builder.append(getExperimentProjectCode());
+            builder.append(getExperimentCode());
+            builder.append(getSampleCode());
+            builder.append(getContainerCode());
+        } else
+        {
+            builder.append(getSampleId());
+        }
+
         return builder.toHashCode();
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PersonRolesTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PersonRolesTranslator.java
index 5dc3b83a6d45d2e1e267a994317d4dd103c598be..36c84e56592ce032f401d7a6c0f04387ddb18a60 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PersonRolesTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/PersonRolesTranslator.java
@@ -22,8 +22,6 @@ import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PersonRole;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PersonRoles;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleLevel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
 
@@ -64,18 +62,8 @@ public class PersonRolesTranslator
             return null;
         }
 
-        RoleWithHierarchy role;
-
-        if (roleAssignment.getSpace() == null)
-        {
-            role = RoleWithHierarchy.valueOf(RoleLevel.INSTANCE, roleAssignment.getRole());
-        } else
-        {
-            role = RoleWithHierarchy.valueOf(RoleLevel.SPACE, roleAssignment.getRole());
-        }
-
         Space space = SpaceTranslator.translate(roleAssignment.getSpace());
 
-        return new PersonRole(role, space);
+        return new PersonRole(roleAssignment.getRoleWithHierarchy(), space);
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/RoleAssignmentTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/RoleAssignmentTranslator.java
index d00d62ce5a63b51d889018dc9334fef4255a0544..b37cc440229822327e87cbcf52907740ad439f12 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/RoleAssignmentTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/RoleAssignmentTranslator.java
@@ -20,8 +20,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleAssignment;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleLevel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
 
 /**
@@ -57,23 +55,8 @@ public final class RoleAssignmentTranslator
         result.setPerson(PersonTranslator.translate(role.getPerson()));
         result.setAuthorizationGroup(AuthorizationGroupTranslator.translate(role
                 .getAuthorizationGroup()));
-        result.setRoleSetCode(getRoleCode(role));
+        result.setRoleSetCode(role.getRoleWithHierarchy());
         return result;
     }
 
-    private final static RoleWithHierarchy getRoleCode(final RoleAssignmentPE role)
-    {
-        RoleLevel roleLevel = null;
-        if (role.getSpace() != null)
-        {
-            roleLevel = RoleLevel.SPACE;
-        } else if (role.getProject() != null)
-        {
-            roleLevel = RoleLevel.PROJECT;
-        } else
-        {
-            roleLevel = RoleLevel.INSTANCE;
-        }
-        return RoleWithHierarchy.valueOf(roleLevel, role.getRole());
-    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java
index 94b6dc139ff54fd5bc461c26ab2935fb115a70b5..ad47705e69d5cf3863f457ce652df05e69ee6725 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java
@@ -112,7 +112,7 @@ public final class DemoServer extends AbstractServer<IDemoServer> implements IDe
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public SampleParentWithDerived getSampleInfo(final String sessionToken,
             @AuthorizationGuard(guardClass = SampleTechIdPredicate.class)
             final TechId sampleId) throws UserFailureException
@@ -137,7 +137,7 @@ public final class DemoServer extends AbstractServer<IDemoServer> implements IDe
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_USER)
     public void registerSample(final String sessionToken,
             @AuthorizationGuard(guardClass = NewSamplePredicate.class)
             final NewSample newSample, final Collection<NewAttachment> attachments)
@@ -146,7 +146,7 @@ public final class DemoServer extends AbstractServer<IDemoServer> implements IDe
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public int getNumberOfExperiments(String sessionToken)
     {
         return getDAOFactory().getExperimentDAO().listExperiments().size();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index a1187e88b84c45cddc5b24f9834bec33b1212a02..b3594354347a22213553e6cfe5fd5f88bcea1366 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -764,7 +764,7 @@ public final class GenericServer extends AbstractServer<IGenericServerInternal>
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<String> generateCodes(String sessionToken, String prefix,
             ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind entityKind, int number)
     {
@@ -773,7 +773,7 @@ public final class GenericServer extends AbstractServer<IGenericServerInternal>
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<String> generateTemporaryCodes(String sessionToken, String prefix,
             ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind entityKind, int number)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java
index 34d45129701995d7c84cbf3d95a7888395ba785e..3c8c4288015c6f793535e4d7dfc522fb5914bed9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java
@@ -102,7 +102,7 @@ public class QueryServer extends AbstractServer<IQueryServer> implements IQueryS
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public int initDatabases(String sessionToken)
     {
         checkSession(sessionToken);
@@ -111,7 +111,7 @@ public class QueryServer extends AbstractServer<IQueryServer> implements IQueryS
     }
 
     @Override
-    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @RolesAllowed(RoleWithHierarchy.PROJECT_OBSERVER)
     public List<QueryDatabase> listQueryDatabases(String sessionToken)
     {
         checkSession(sessionToken);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractTest.java
index 7e07a2a2ccd8df4421ce8fb8b78ae6162411a137..dc12ebbc2bd4ca38e6047227cf60471686f41779 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractTest.java
@@ -88,6 +88,8 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.semanticannotation.SemanticAnnotation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.Space;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.Tag;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.create.TagCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.VocabularyTerm;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.VocabularyTermPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.exceptions.NotFetchedException;
@@ -103,7 +105,6 @@ import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.logging.BufferedAppender;
 import ch.systemsx.cisd.common.test.AssertionUtil;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
@@ -111,6 +112,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Id;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.systemtest.SystemTestCase;
 import ch.systemsx.cisd.openbis.util.LogRecordingUtils;
@@ -139,9 +142,6 @@ public class AbstractTest extends SystemTestCase
     @Autowired
     protected IGeneralInformationService generalInformationService;
 
-    @Autowired
-    protected IDAOFactory daoFactory;
-
     @BeforeClass
     public void beforeClass()
     {
@@ -680,7 +680,7 @@ public class AbstractTest extends SystemTestCase
             assertExceptionContext(e, expectedContextPattern);
         }
     }
-    
+
     protected void assertAnyAuthorizationException(IDelegatedAction action)
     {
         try
@@ -691,7 +691,7 @@ public class AbstractTest extends SystemTestCase
         {
             // Then
             Throwable cause = e.getCause();
-            if (cause instanceof AuthorizationFailureException == false 
+            if (cause instanceof AuthorizationFailureException == false
                     && cause instanceof UnauthorizedObjectAccessException == false)
             {
                 throw e;
@@ -1304,4 +1304,18 @@ public class AbstractTest extends SystemTestCase
         return fo;
     }
 
+    protected TagPermId createTag(String owner, TagCreation creation)
+    {
+        PersonPE person = daoFactory.getPersonDAO().tryFindPersonByUserId(owner);
+
+        MetaprojectPE tag = new MetaprojectPE();
+        tag.setName(creation.getCode());
+        tag.setDescription(creation.getDescription());
+        tag.setOwner(person);
+
+        daoFactory.getMetaprojectDAO().createOrUpdateMetaproject(tag, person);
+
+        return new TagPermId(owner, creation.getCode());
+    }
+
 }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateDataSetTest.java
index 213e76c739e4213f81555e0b5891aba6441da566..a0433860a59ba46665a51fbbd1719ce1b536f4c5 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateDataSetTest.java
@@ -83,7 +83,7 @@ public class CreateDataSetTest extends AbstractDataSetTest
     @Test
     public void testCreateLinkDataSetWithSpaceUser()
     {
-    	// given
+        // given
         String sessionToken = v3api.login(TEST_SPACE_USER, PASSWORD);
         String code = UUID.randomUUID().toString();
         LinkedDataCreation linkedData = new LinkedDataCreation();
@@ -107,17 +107,17 @@ public class CreateDataSetTest extends AbstractDataSetTest
         assertDataSetKind(sessionToken, dataSetIds, DataSetKind.LINK);
     }
 
-	private void assertDataSetKind(String sessionToken, List<DataSetPermId> dataSetIds, DataSetKind kind)
-	{
-		Map<IDataSetId, DataSet> dataSets = v3api.getDataSets(sessionToken, dataSetIds, new DataSetFetchOptions());
+    private void assertDataSetKind(String sessionToken, List<DataSetPermId> dataSetIds, DataSetKind kind)
+    {
+        Map<IDataSetId, DataSet> dataSets = v3api.getDataSets(sessionToken, dataSetIds, new DataSetFetchOptions());
         assertEquals(dataSets.size(), 1);
         assertEquals(dataSets.get(dataSetIds.get(0)).getKind(), kind);
-	}
+    }
 
     @Test
     public void testCreateContainerDataSetWithSpaceUser()
     {
-    	// given
+        // given
         String sessionToken = v3api.login(TEST_SPACE_USER, PASSWORD);
         String code = UUID.randomUUID().toString();
         DataSetCreation creation = new DataSetCreation();
@@ -140,7 +140,7 @@ public class CreateDataSetTest extends AbstractDataSetTest
     @Test
     public void testDataSetWhichDefaultsToPhysical()
     {
-    	// given
+        // given
         String sessionToken = v3api.login(TEST_USER, PASSWORD);
         DataSetCreation creation = physicalDataSetCreation();
         creation.setDataSetKind(null);
@@ -153,7 +153,7 @@ public class CreateDataSetTest extends AbstractDataSetTest
         assertEquals(dataSetIds.get(0).getPermId(), creation.getCode().toUpperCase());
         assertDataSetKind(sessionToken, dataSetIds, DataSetKind.PHYSICAL);
     }
-    
+
     @Test
     public void testCreateDSWithAdminUserInBehalfOfASpaceObserver()
     {
@@ -1837,7 +1837,17 @@ public class CreateDataSetTest extends AbstractDataSetTest
         DataSetCreation creation = physicalDataSetCreation();
         creation.setExperimentId(new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.createDataSets(sessionToken, Collections.singletonList(creation));
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             List<DataSetPermId> permIds = v3api.createDataSets(sessionToken, Collections.singletonList(creation));
             assertEquals(permIds.size(), 1);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java
index 5b6a437cc5331070022f44b44c7d1c22fc68e27f..7e8da970568533cf598d81eba2f264cdaaa59384 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateExperimentTest.java
@@ -511,7 +511,17 @@ public class CreateExperimentTest extends AbstractExperimentTest
 
         String sessionToken = v3api.login(user.getUserId(), PASSWORD);
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.createExperiments(sessionToken, Collections.singletonList(creation));
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             List<ExperimentPermId> permIds = v3api.createExperiments(sessionToken, Collections.singletonList(creation));
             assertEquals(permIds.size(), 1);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateProjectTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateProjectTest.java
index 169c2bcc0c2fa353d05c88b0fbc882f92057c80a..4248f2929c886beb1e0822949c25add9da1985d9 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateProjectTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateProjectTest.java
@@ -179,7 +179,7 @@ public class CreateProjectTest extends AbstractTest
         {
             List<ProjectPermId> permIds = v3api.createProjects(sessionToken, Collections.singletonList(project));
             assertEquals(permIds.size(), 1);
-        } else if (user.isTestProjectUser())
+        } else if (user.isProjectUser())
         {
             assertAuthorizationFailureException(new IDelegatedAction()
                 {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java
index 36cc9ca7bb5d343a79c40332307fb008d08300fb..35ef3012763d55dbf3718fe16e730757d28e0942 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java
@@ -1204,7 +1204,17 @@ public class CreateSampleTest extends AbstractSampleTest
         creation.setSpaceId(new SpacePermId("TEST-SPACE"));
         creation.setExperimentId(new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.createSamples(sessionToken, Collections.singletonList(creation));
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             List<SamplePermId> permIds = v3api.createSamples(sessionToken, Collections.singletonList(creation));
             assertEquals(permIds.size(), 1);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateTagTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateTagTest.java
index 92dedc9f7a5c2d52263dfc3001d78dacb82619cf..266dd446756d257020530a9fa91e20ff9d353371 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateTagTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateTagTest.java
@@ -32,6 +32,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.Tag;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.create.TagCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.fetchoptions.TagFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.ITagId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagCode;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagPermId;
 import ch.ethz.sis.openbis.systemtest.asapi.v3.index.ReindexingState;
 import ch.systemsx.cisd.common.action.IDelegatedAction;
@@ -329,8 +330,21 @@ public class CreateTagTest extends AbstractTest
         creation.setCode("TEST_TAG");
         creation.setDescription("test description");
 
-        Tag tag = createTag(user.getUserId(), PASSWORD, creation);
-        assertEquals(tag.getCode(), creation.getCode());
+        if (user.isDisabledProjectUser())
+        {
+            assertUnauthorizedObjectAccessException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        createTag(user.getUserId(), PASSWORD, creation);
+                    }
+                }, new TagCode(creation.getCode()));
+        } else
+        {
+            Tag tag = createTag(user.getUserId(), PASSWORD, creation);
+            assertEquals(tag.getCode(), creation.getCode());
+        }
     }
 
     private Tag createTag(String user, String password, TagCreation creation)
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteDataSetTest.java
index 52ea9cbb31a878cd524797c2488997cbeb497fda..8cea12c4e66d12aacd83c7e31c025d081a4240ba 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteDataSetTest.java
@@ -146,7 +146,17 @@ public class DeleteDataSetTest extends AbstractDeletionTest
 
         IDataSetId dataSetId = new DataSetPermId("20120628092259000-41");
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.deleteDataSets(sessionToken, Arrays.asList(dataSetId), getOptions());
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             v3api.deleteDataSets(sessionToken, Arrays.asList(dataSetId), getOptions());
         } else
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteExperimentTest.java
index 0f583421918fbfc5af88d559cc2b24af80c4d7c6..f621a87bc67c271bacdbd59b10aa2363f5e4dd41 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteExperimentTest.java
@@ -208,7 +208,17 @@ public class DeleteExperimentTest extends AbstractDeletionTest
 
         assertExperimentExists(permIds.get(0));
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.deleteExperiments(sessionToken, permIds, options);
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             IDeletionId deletionId = v3api.deleteExperiments(sessionToken, permIds, options);
             Assert.assertNotNull(deletionId);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteProjectTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteProjectTest.java
index ef6892a1d266014b887a0523d1a8449b47aee33a..3402d6bf3b066f8c400b7beeb80868a419ae4f5f 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteProjectTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteProjectTest.java
@@ -145,7 +145,17 @@ public class DeleteProjectTest extends AbstractDeletionTest
 
         assertProjectExists(permIds.get(0));
 
-        if (user.isInstanceUser() || user.isTestSpaceUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.deleteProjects(sessionToken, permIds, options);
+                    }
+                });
+        } else if (user.isInstanceUser() || user.isTestSpaceUser())
         {
             v3api.deleteProjects(sessionToken, permIds, options);
             assertProjectDoesNotExist(permIds.get(0));
@@ -153,6 +163,7 @@ public class DeleteProjectTest extends AbstractDeletionTest
         {
             assertUnauthorizedObjectAccessException(new IDelegatedAction()
                 {
+
                     @Override
                     public void execute()
                     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteSampleTest.java
index 01e257db5c010f9a2b16eefbe03aaebed387f100..f370a37234981271ef61a5a6b8e1c67f76de0cc0 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteSampleTest.java
@@ -232,7 +232,17 @@ public class DeleteSampleTest extends AbstractDeletionTest
         SampleDeletionOptions options = new SampleDeletionOptions();
         options.setReason("It is just a test");
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.deleteSamples(sessionToken, Arrays.asList(sampleId), options);
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             v3api.deleteSamples(sessionToken, Arrays.asList(sampleId), options);
         } else
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteTagTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteTagTest.java
index cb584f2710fd09d5c7d0c5310a84d430a1af749a..ceadde68e38ee400d43a48f627daadb13b0200ca 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteTagTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/DeleteTagTest.java
@@ -178,12 +178,25 @@ public class DeleteTagTest extends AbstractDeletionTest
         TagCreation creation = new TagCreation();
         creation.setCode("TAG_TO_DELETE");
 
-        final Tag before = createTag(user.getUserId(), PASSWORD, creation);
+        final TagPermId tagId = createTag(user.getUserId(), creation);
 
         final TagDeletionOptions options = new TagDeletionOptions();
         options.setReason("It is just a test");
 
-        deleteTag(user.getUserId(), PASSWORD, before.getPermId(), options);
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        deleteTag(user.getUserId(), PASSWORD, tagId, options);
+                    }
+                });
+        } else
+        {
+            deleteTag(user.getUserId(), PASSWORD, tagId, options);
+        }
     }
 
     private Tag createTag(String user, String password, TagCreation creation)
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetDataSetTest.java
index 6f213dd9e915253a4dde926cf0f8fa204c55c96b..c2d2af5454e99f79c6abfebcc615a1bbcfbbc2a3 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetDataSetTest.java
@@ -58,6 +58,7 @@ 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.tag.Tag;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.fetchoptions.TagFetchOptions;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
 
 /**
@@ -1020,18 +1021,32 @@ public class GetDataSetTest extends AbstractDataSetTest
                 new DataSetPermId("20081105092159188-3"));
 
         String sessionToken = v3api.login(user.getUserId(), PASSWORD);
-        Map<IDataSetId, DataSet> result = v3api.getDataSets(sessionToken, ids, new DataSetFetchOptions());
 
-        if (user.isInstanceUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(result.size(), 2);
-        } else if (user.isTestSpaceUser() || (user.isTestProjectUser() && user.hasPAEnabled()))
-        {
-            assertEquals(result.size(), 1);
-            assertEquals(result.values().iterator().next().getCode(), "20120619092259000-22");
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.getDataSets(sessionToken, ids, new DataSetFetchOptions());
+                    }
+                });
         } else
         {
-            assertEquals(result.size(), 0);
+            Map<IDataSetId, DataSet> result = v3api.getDataSets(sessionToken, ids, new DataSetFetchOptions());
+
+            if (user.isInstanceUser())
+            {
+                assertEquals(result.size(), 2);
+            } else if (user.isTestSpaceUser() || user.isTestProjectUser())
+            {
+                assertEquals(result.size(), 1);
+                assertEquals(result.values().iterator().next().getCode(), "20120619092259000-22");
+            } else
+            {
+                assertEquals(result.size(), 0);
+            }
         }
 
         v3api.logout(sessionToken);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetExperimentTest.java
index 9d6dc2ad9c7eda0a4bbca8855d522a9b2a0a24dc..0cb0f71033c006553233f0e52878afb758eb9c9e 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetExperimentTest.java
@@ -69,6 +69,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.SampleUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.Tag;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.common.test.AssertionUtil;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
 
@@ -1146,18 +1147,32 @@ public class GetExperimentTest extends AbstractExperimentTest
                 new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
 
         String sessionToken = v3api.login(user.getUserId(), PASSWORD);
-        Map<IExperimentId, Experiment> result = v3api.getExperiments(sessionToken, ids, experimentFetchOptionsFull());
 
-        if (user.isInstanceUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(result.size(), 2);
-        } else if (user.isTestSpaceUser() || (user.isTestProjectUser() && user.hasPAEnabled()))
-        {
-            assertEquals(result.size(), 1);
-            assertEquals(result.values().iterator().next().getIdentifier(), new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.getExperiments(sessionToken, ids, experimentFetchOptionsFull());
+                    }
+                });
         } else
         {
-            assertEquals(result.size(), 0);
+            Map<IExperimentId, Experiment> result = v3api.getExperiments(sessionToken, ids, experimentFetchOptionsFull());
+
+            if (user.isInstanceUser())
+            {
+                assertEquals(result.size(), 2);
+            } else if (user.isTestSpaceUser() || user.isTestProjectUser())
+            {
+                assertEquals(result.size(), 1);
+                assertEquals(result.values().iterator().next().getIdentifier(), new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
+            } else
+            {
+                assertEquals(result.size(), 0);
+            }
         }
 
         v3api.logout(sessionToken);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetProjectTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetProjectTest.java
index 7f6f6875cf91611c5d5d3b701bb9d0e6d9840b8f..b67282fe97e484d32857e0e526fd406fcff63d3d 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetProjectTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetProjectTest.java
@@ -45,6 +45,7 @@ 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.project.update.ProjectUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
 
 /**
@@ -492,18 +493,32 @@ public class GetProjectTest extends AbstractTest
         List<? extends IProjectId> ids = Arrays.asList(identifier1, identifier2);
 
         String sessionToken = v3api.login(user.getUserId(), PASSWORD);
-        Map<IProjectId, Project> map = v3api.getProjects(sessionToken, ids, projectFetchOptionsFull());
 
-        if (user.isInstanceUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(map.size(), 2);
-        } else if (user.isTestSpaceUser() || (user.isTestProjectUser() && user.hasPAEnabled()))
-        {
-            assertEquals(map.size(), 1);
-            assertEquals(map.get(identifier2).getIdentifier(), identifier2);
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.getProjects(sessionToken, ids, projectFetchOptionsFull());
+                    }
+                });
         } else
         {
-            assertEquals(map.size(), 0);
+            Map<IProjectId, Project> map = v3api.getProjects(sessionToken, ids, projectFetchOptionsFull());
+
+            if (user.isInstanceUser())
+            {
+                assertEquals(map.size(), 2);
+            } else if (user.isTestSpaceUser() || user.isTestProjectUser())
+            {
+                assertEquals(map.size(), 1);
+                assertEquals(map.get(identifier2).getIdentifier(), identifier2);
+            } else
+            {
+                assertEquals(map.size(), 0);
+            }
         }
 
         v3api.logout(sessionToken);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetSampleTest.java
index 656758c01b75fcda1e85f0a6eaf7f97961b84092..5b2c17fd4d0df4448f81eb4d54852550599931bc 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetSampleTest.java
@@ -64,6 +64,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.SampleUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.Tag;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.fetchoptions.TagFetchOptions;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.common.test.AssertionUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
@@ -1601,14 +1602,27 @@ public class GetSampleTest extends AbstractSampleTest
         ISampleId id = new SampleIdentifier("/TEST-SPACE/EV-TEST");
         SampleFetchOptions fetchOptions = new SampleFetchOptions();
 
-        Map<ISampleId, Sample> samples = v3api.getSamples(sessionToken, Arrays.asList(id), fetchOptions);
-
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(samples.size(), 1);
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.getSamples(sessionToken, Arrays.asList(id), fetchOptions);
+                    }
+                });
         } else
         {
-            assertEquals(samples.size(), 0);
+            Map<ISampleId, Sample> samples = v3api.getSamples(sessionToken, Arrays.asList(id), fetchOptions);
+
+            if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+            {
+                assertEquals(samples.size(), 1);
+            } else
+            {
+                assertEquals(samples.size(), 0);
+            }
         }
     }
 
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetTagTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetTagTest.java
index d6c37f30f88de5477df0fc65e30032bea2080264..a933e49b8ad1e39b8683ba2b7e42d1a27a80d937 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetTagTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/GetTagTest.java
@@ -33,6 +33,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.fetchoptions.TagFetchOptions
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.ITagId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagCode;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagPermId;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
 
 /**
@@ -366,10 +367,23 @@ public class GetTagTest extends AbstractTest
         TagCreation creation = new TagCreation();
         creation.setCode("TAG_TO_GET");
 
-        List<TagPermId> permIds = v3api.createTags(sessionToken, Arrays.asList(creation));
-
-        Map<ITagId, Tag> map = v3api.getTags(sessionToken, permIds, new TagFetchOptions());
-        assertEquals(map.size(), 1);
+        TagPermId permId = createTag(user.getUserId(), creation);
+
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.getTags(sessionToken, Arrays.asList(permId), new TagFetchOptions());
+                    }
+                });
+        } else
+        {
+            Map<ITagId, Tag> map = v3api.getTags(sessionToken, Arrays.asList(permId), new TagFetchOptions());
+            assertEquals(map.size(), 1);
+        }
     }
 
 }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java
index 207427deb5f02584cb23aaba19a2c1136a897a1c..105f590cb5149e648df4eba809506bad58c4a77d 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java
@@ -33,6 +33,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.search.DataSetSearchCrit
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagPermId;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
 
 /**
@@ -794,18 +795,32 @@ public class SearchDataSetTest extends AbstractDataSetTest
         criteria.withId().thatEquals(new DataSetPermId("20081105092159188-3"));
 
         String sessionToken = v3api.login(user.getUserId(), PASSWORD);
-        SearchResult<DataSet> result = v3api.searchDataSets(sessionToken, criteria, new DataSetFetchOptions());
 
-        if (user.isInstanceUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(result.getObjects().size(), 2);
-        } else if (user.isTestSpaceUser() || (user.isTestProjectUser() && user.hasPAEnabled()))
-        {
-            assertEquals(result.getObjects().size(), 1);
-            assertEquals(result.getObjects().get(0).getCode(), "20120619092259000-22");
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.searchDataSets(sessionToken, criteria, new DataSetFetchOptions());
+                    }
+                });
         } else
         {
-            assertEquals(result.getObjects().size(), 0);
+            SearchResult<DataSet> result = v3api.searchDataSets(sessionToken, criteria, new DataSetFetchOptions());
+
+            if (user.isInstanceUser())
+            {
+                assertEquals(result.getObjects().size(), 2);
+            } else if (user.isTestSpaceUser() || user.isTestProjectUser())
+            {
+                assertEquals(result.getObjects().size(), 1);
+                assertEquals(result.getObjects().get(0).getCode(), "20120619092259000-22");
+            } else
+            {
+                assertEquals(result.getObjects().size(), 0);
+            }
         }
 
         v3api.logout(sessionToken);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExperimentTest.java
index 60f7c8640b084f8e6e3b55819509843a25ede8d1..67c652e6e2ed13ee28ab1d64420ab8b0296e9595 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExperimentTest.java
@@ -38,6 +38,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagCode;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagPermId;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
 
 /**
@@ -763,18 +764,32 @@ public class SearchExperimentTest extends AbstractExperimentTest
         criteria.withId().thatEquals(new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
 
         String sessionToken = v3api.login(user.getUserId(), PASSWORD);
-        SearchResult<Experiment> result = v3api.searchExperiments(sessionToken, criteria, experimentFetchOptionsFull());
 
-        if (user.isInstanceUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(result.getObjects().size(), 2);
-        } else if (user.isTestSpaceUser() || (user.isTestProjectUser() && user.hasPAEnabled()))
-        {
-            assertEquals(result.getObjects().size(), 1);
-            assertEquals(result.getObjects().get(0).getIdentifier(), new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.searchExperiments(sessionToken, criteria, experimentFetchOptionsFull());
+                    }
+                });
         } else
         {
-            assertEquals(result.getObjects().size(), 0);
+            SearchResult<Experiment> result = v3api.searchExperiments(sessionToken, criteria, experimentFetchOptionsFull());
+
+            if (user.isInstanceUser())
+            {
+                assertEquals(result.getObjects().size(), 2);
+            } else if (user.isTestSpaceUser() || user.isTestProjectUser())
+            {
+                assertEquals(result.getObjects().size(), 1);
+                assertEquals(result.getObjects().get(0).getIdentifier(), new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
+            } else
+            {
+                assertEquals(result.getObjects().size(), 0);
+            }
         }
 
         v3api.logout(sessionToken);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchProjectTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchProjectTest.java
index 921a0fe5b1957a7560ba5d1d5e1bfb221d9e0493..b0f64e6f006ad60fd645bcd85108ba40561af8cd 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchProjectTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchProjectTest.java
@@ -29,6 +29,7 @@ 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.project.search.ProjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
 
 /**
@@ -220,18 +221,31 @@ public class SearchProjectTest extends AbstractTest
         criteria.withId().thatEquals(identifier1);
         criteria.withId().thatEquals(identifier2);
 
-        SearchResult<Project> result = v3api.searchProjects(sessionToken, criteria, projectFetchOptionsFull());
-
-        if (user.isInstanceUser())
-        {
-            assertEquals(result.getObjects().size(), 2);
-        } else if (user.isTestSpaceUser() || (user.isTestProjectUser() && user.hasPAEnabled()))
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(result.getObjects().size(), 1);
-            assertEquals(result.getObjects().get(0).getIdentifier(), identifier2);
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.searchProjects(sessionToken, criteria, projectFetchOptionsFull());
+                    }
+                });
         } else
         {
-            assertEquals(result.getObjects().size(), 0);
+            SearchResult<Project> result = v3api.searchProjects(sessionToken, criteria, projectFetchOptionsFull());
+
+            if (user.isInstanceUser())
+            {
+                assertEquals(result.getObjects().size(), 2);
+            } else if (user.isTestSpaceUser() || user.isTestProjectUser())
+            {
+                assertEquals(result.getObjects().size(), 1);
+                assertEquals(result.getObjects().get(0).getIdentifier(), identifier2);
+            } else
+            {
+                assertEquals(result.getObjects().size(), 0);
+            }
         }
 
         v3api.logout(sessionToken);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java
index 52e16cbe5c74b45dee64b66b40363b7e5ab137a7..288e897f48f8ea77e1fcb7e57b1a3475e5a34619 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java
@@ -44,6 +44,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.semanticannotation.search.Semant
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagCode;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagPermId;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.common.test.AssertionUtil;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
 
@@ -1325,7 +1326,17 @@ public class SearchSampleTest extends AbstractSampleTest
         SampleSearchCriteria criteria = new SampleSearchCriteria();
         criteria.withId().thatEquals(new SampleIdentifier("/TEST-SPACE/EV-TEST"));
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        testSearch(user.getUserId(), criteria);
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             testSearch(user.getUserId(), criteria, "/TEST-SPACE/EV-TEST");
         } else
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchTagTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchTagTest.java
index cae53380974cc8a7c542f7c2c4cd4c1e01d1c65b..ccea88e0ed04333d2b05960119c3a837d1d43814 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchTagTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchTagTest.java
@@ -16,7 +16,6 @@
 
 package ch.ethz.sis.openbis.systemtest.asapi.v3;
 
-import java.util.Arrays;
 import java.util.List;
 
 import org.testng.annotations.Test;
@@ -27,6 +26,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.create.TagCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.fetchoptions.TagFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.TagPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.search.TagSearchCriteria;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
 
 /**
@@ -153,17 +153,28 @@ public class SearchTagTest extends AbstractTest
     @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER_WITH_ETL)
     public void testSearchWithProjectAuthorization(ProjectAuthorizationUser user)
     {
-        String sessionToken = v3api.login(user.getUserId(), PASSWORD);
-
         TagCreation creation = new TagCreation();
         creation.setCode("TAG_TO_SEARCH");
 
-        List<TagPermId> permIds = v3api.createTags(sessionToken, Arrays.asList(creation));
+        TagPermId permId = createTag(user.getUserId(), creation);
 
         TagSearchCriteria criteria = new TagSearchCriteria();
-        criteria.withId().thatEquals(permIds.get(0));
-
-        testSearch(user.getUserId(), criteria, permIds.get(0).getPermId());
+        criteria.withId().thatEquals(permId);
+
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        testSearch(user.getUserId(), criteria, permId.getPermId());
+                    }
+                });
+        } else
+        {
+            testSearch(user.getUserId(), criteria, permId.getPermId());
+        }
     }
 
     private void testSearch(String user, TagSearchCriteria criteria, String... expectedPermIds)
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
index 89e24117e58c0dc5784ecf39ce600093871d6eb6..503e77cff075f13b407f589794ffec0f1cb72e02 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
@@ -725,7 +725,17 @@ public class UpdateDataSetTest extends AbstractSampleTest
         update.setDataSetId(new DataSetPermId("20120619092259000-22"));
         update.setProperty("COMMENT", "updated comment");
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.updateDataSets(sessionToken, Arrays.asList(update));
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             v3api.updateDataSets(sessionToken, Arrays.asList(update));
         } else
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
index a52ff078a3201a4b07ca578f2589530e339c94c5..0bc2194b22f4ea3279afe84bf68f0d35735c5129 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
@@ -729,7 +729,17 @@ public class UpdateExperimentTest extends AbstractExperimentTest
 
         String sessionToken = v3api.login(user.getUserId(), PASSWORD);
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.updateExperiments(sessionToken, Collections.singletonList(update));
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             v3api.updateExperiments(sessionToken, Collections.singletonList(update));
         } else
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateProjectTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateProjectTest.java
index c57ade0c3ae35ecf044a2ddf737292f1eee52980..497bda346a85ea0df122dffd7ddae6e933316d91 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateProjectTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateProjectTest.java
@@ -98,7 +98,17 @@ public class UpdateProjectTest extends AbstractTest
 
         String sessionToken = v3api.login(user.getUserId(), PASSWORD);
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.updateProjects(sessionToken, Collections.singletonList(update));
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             Map<IProjectId, Project> map = v3api.getProjects(sessionToken, Arrays.asList(projectId), new ProjectFetchOptions());
             Project project = map.get(projectId);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java
index 940bdc5df6c0a6104f26352ff7b344139eab6408..1c6f755fa572032a74d0bd758ee9d18b3e322923 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java
@@ -1439,7 +1439,17 @@ public class UpdateSampleTest extends AbstractSampleTest
         update.setExperimentId(new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
         update.setProperty("COMMENT", "test comment");
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        v3api.updateSamples(sessionToken, Arrays.asList(update));
+                    }
+                });
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             v3api.updateSamples(sessionToken, Arrays.asList(update));
         } else
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateTagTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateTagTest.java
index 9f7508e58f9a8350cacfb3e19280a929de633cde..2ae55d5ad207044de3e2bd11b292aeccc44f01eb 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateTagTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateTagTest.java
@@ -498,18 +498,27 @@ public class UpdateTagTest extends AbstractTest
         creation.setCode("TEST_TAG");
         creation.setDescription("test description");
 
-        String sessionToken = v3api.login(user.getUserId(), PASSWORD);
-
-        List<TagPermId> permIds = v3api.createTags(sessionToken, Arrays.asList(creation));
-        assertEquals(permIds.size(), 1);
+        TagPermId permId = createTag(user.getUserId(), creation);
 
         TagUpdate update = new TagUpdate();
-        update.setTagId(permIds.get(0));
+        update.setTagId(permId);
         update.setDescription("brand new description");
 
-        Tag after = updateTag(user.getUserId(), PASSWORD, update);
-
-        assertEquals(after.getDescription(), update.getDescription().getValue());
+        if (user.isDisabledProjectUser())
+        {
+            assertAuthorizationFailureException(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        updateTag(user.getUserId(), PASSWORD, update);
+                    }
+                });
+        } else
+        {
+            Tag after = updateTag(user.getUserId(), PASSWORD, update);
+            assertEquals(after.getDescription(), update.getDescription().getValue());
+        }
     }
 
     private Tag getTag(String user, String password, ITagId tagId)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerTest.java
index 9d5505f26da55301fe5d7dd580df494c93cd9b9d..68909be495c7fdc91f8dcf125f90429f0f5b7541 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServerTest.java
@@ -162,25 +162,38 @@ public class ServiceForDataStoreServerTest extends SystemTestCase
     {
         SessionContextDTO session = etlService.tryAuthenticate(user.getUserId(), PASSWORD);
 
-        List<Project> projects = etlService.listProjects(session.getSessionToken());
-
-        if (user.isInstanceUser())
-        {
-            assertEntities(
-                    "[/CISD/DEFAULT, /CISD/NEMO, /CISD/NOE, /TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT, /TESTGROUP/TESTPROJ]",
-                    projects);
-        } else if (user.isTestSpaceUser())
-        {
-            assertEntities("[/TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
-        } else if (user.isTestGroupUser())
-        {
-            assertEntities("[/TESTGROUP/TESTPROJ]", projects);
-        } else if (user.isTestProjectUser() && user.hasPAEnabled())
+        if (user.isDisabledProjectUser())
         {
-            assertEntities("[/TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
+            try
+            {
+                etlService.listProjects(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEntities("[]", projects);
+            List<Project> projects = etlService.listProjects(session.getSessionToken());
+
+            if (user.isInstanceUser())
+            {
+                assertEntities(
+                        "[/CISD/DEFAULT, /CISD/NEMO, /CISD/NOE, /TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT, /TESTGROUP/TESTPROJ]",
+                        projects);
+            } else if (user.isTestSpaceUser())
+            {
+                assertEntities("[/TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
+            } else if (user.isTestGroupUser())
+            {
+                assertEntities("[/TESTGROUP/TESTPROJ]", projects);
+            } else if (user.isTestProjectUser())
+            {
+                assertEntities("[/TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
+            } else
+            {
+                assertEntities("[]", projects);
+            }
         }
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetUpdatesCollectionPredicateTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetUpdatesCollectionPredicateTest.java
index 900b8222fb90792bd237269816136080e48ff8e0..a4e011c70901c809253287493188bf1e66192793 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetUpdatesCollectionPredicateTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DataSetUpdatesCollectionPredicateTest.java
@@ -57,7 +57,7 @@ public class DataSetUpdatesCollectionPredicateTest extends AuthorizationTestCase
                     allowing(provider).getAuthorizationConfig();
                     will(returnValue(new TestAuthorizationConfig(false, false)));
 
-                    one(provider).getDatasetCollectionAccessDataByTechIds(Arrays.asList(new TechId(42L)));
+                    one(provider).getDatasetCollectionAccessDataByTechIds(Arrays.asList(new TechId(42L)), true);
                     will(returnValue(new HashSet<DataSetAccessPE>(Arrays.asList(dataSet))));
                 }
             });
@@ -89,7 +89,7 @@ public class DataSetUpdatesCollectionPredicateTest extends AuthorizationTestCase
                     allowing(provider).getAuthorizationConfig();
                     will(returnValue(new TestAuthorizationConfig(false, false)));
 
-                    one(provider).getDatasetCollectionAccessDataByTechIds(Arrays.asList(new TechId(42L)));
+                    one(provider).getDatasetCollectionAccessDataByTechIds(Arrays.asList(new TechId(42L)), true);
                     will(returnValue(new HashSet<DataSetAccessPE>(Arrays.asList(dataSet))));
                 }
             });
@@ -152,7 +152,7 @@ public class DataSetUpdatesCollectionPredicateTest extends AuthorizationTestCase
                     allowing(provider).getAuthorizationConfig();
                     will(returnValue(new TestAuthorizationConfig(false, false)));
 
-                    one(provider).getDatasetCollectionAccessDataByTechIds(Arrays.asList(new TechId(42L)));
+                    one(provider).getDatasetCollectionAccessDataByTechIds(Arrays.asList(new TechId(42L)), true);
                     will(returnValue(new HashSet<DataSetAccessPE>(Arrays.asList(dataSet))));
                 }
             });
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ListSampleCriteriaPredicateTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ListSampleCriteriaPredicateTest.java
index c84509207f8f16a057b2ee4a18890805eb97d5b0..e6d9a44a9c407a7639296028a039f9f094550920 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ListSampleCriteriaPredicateTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ListSampleCriteriaPredicateTest.java
@@ -179,7 +179,7 @@ public class ListSampleCriteriaPredicateTest extends AuthorizationTestCase
         context.checking(new Expectations()
             {
                 {
-                    one(provider).getSampleCollectionAccessDataByTechIds(Arrays.asList(new TechId(42L)));
+                    one(provider).getSampleCollectionAccessDataByTechIds(Arrays.asList(new TechId(42L)), true);
                     will(returnValue(Collections.singleton(sampleAccess)));
                 }
             });
@@ -204,7 +204,7 @@ public class ListSampleCriteriaPredicateTest extends AuthorizationTestCase
         context.checking(new Expectations()
             {
                 {
-                    one(provider).getSampleCollectionAccessDataByTechIds(Arrays.asList(new TechId(42L)));
+                    one(provider).getSampleCollectionAccessDataByTechIds(Arrays.asList(new TechId(42L)), true);
                     will(returnValue(Collections.singleton(containerAccess)));
                 }
             });
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleUpdatesCollectionPredicateTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleUpdatesCollectionPredicateTest.java
index d33feb14477ad7400a3da9c7e4b2cbc92ed15a40..e2da73fca66d29e83a709c7ae8f116003f021080 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleUpdatesCollectionPredicateTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleUpdatesCollectionPredicateTest.java
@@ -61,7 +61,7 @@ public class SampleUpdatesCollectionPredicateTest extends AuthorizationTestCase
                     allowing(provider).getAuthorizationConfig();
                     will(returnValue(new TestAuthorizationConfig(false, false)));
 
-                    one(provider).getSampleCollectionAccessDataByTechIds(TechId.createList(42L, 43L, 44L));
+                    one(provider).getSampleCollectionAccessDataByTechIds(TechId.createList(42L, 43L, 44L), true);
                     will(returnValue(Collections.singleton(sampleAccess)));
                 }
             });
@@ -98,7 +98,7 @@ public class SampleUpdatesCollectionPredicateTest extends AuthorizationTestCase
                     allowing(provider).getAuthorizationConfig();
                     will(returnValue(new TestAuthorizationConfig(false, false)));
 
-                    one(provider).getSampleCollectionAccessDataByTechIds(TechId.createList(42L, 43L, 44L));
+                    one(provider).getSampleCollectionAccessDataByTechIds(TechId.createList(42L, 43L, 44L), true);
                     will(returnValue(Collections.singleton(sampleAccess)));
                 }
             });
@@ -171,7 +171,7 @@ public class SampleUpdatesCollectionPredicateTest extends AuthorizationTestCase
                     allowing(provider).getAuthorizationConfig();
                     will(returnValue(new TestAuthorizationConfig(false, false)));
 
-                    one(provider).getSampleCollectionAccessDataByTechIds(TechId.createList(42L, 43L, 44L));
+                    one(provider).getSampleCollectionAccessDataByTechIds(TechId.createList(42L, 43L, 44L), true);
                     will(returnValue(Collections.singleton(sampleAccess)));
                 }
             });
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/CommonServerTest.java
index c0e525b47f327d084ef7cd6632c6f567bc283e1f..d5ce6d67189a8bb2cd0ad69edf9948cf9f01fe30 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/CommonServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/CommonServerTest.java
@@ -26,15 +26,16 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.sql.DataSource;
 
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.log4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.testng.annotations.Test;
@@ -44,9 +45,9 @@ import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicEntityInformationHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
@@ -58,12 +59,16 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelatedEntities;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityHistory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
@@ -72,9 +77,19 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentAttributeSearchFieldKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialAttributeSearchFieldKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignments;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignmentsCount;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAuthorizationGroup;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
@@ -85,19 +100,26 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleAttributeSearchFieldKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleUpdateResult;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ScriptType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SearchCriteriaConnection;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.displaysettings.IDisplaySettingsUpdate;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.id.metaproject.IMetaprojectId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.id.metaproject.MetaprojectIdentifierId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
+import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SearchableEntity;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
@@ -112,9 +134,6 @@ import junit.framework.Assert;
 public class CommonServerTest extends SystemTestCase
 {
 
-    @Autowired
-    private IDAOFactory daoFactory;
-
     private Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, getClass());
 
     @Test
@@ -291,26 +310,39 @@ public class CommonServerTest extends SystemTestCase
         ListSampleCriteria criteria = new ListSampleCriteria();
         criteria.setIncludeSpace(true);
 
-        List<Sample> samples = commonServer.listSamples(session.getSessionToken(), criteria);
-
-        if (user.isInstanceUser())
-        {
-            assertEquals(samples.size(), 38);
-        } else if (user.isTestSpaceUser())
-        {
-            assertEquals(samples.size(), 7);
-            assertEntities(
-                    "[/TEST-SPACE/CP-TEST-4, /TEST-SPACE/EV-INVALID, /TEST-SPACE/EV-PARENT, /TEST-SPACE/EV-PARENT-NORMAL, /TEST-SPACE/EV-TEST, /TEST-SPACE/FV-TEST, /TEST-SPACE/SAMPLE-TO-DELETE]",
-                    samples);
-        } else if (user.isTestProjectUser() && user.hasPAEnabled())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(samples.size(), 6);
-            assertEntities(
-                    "[/TEST-SPACE/EV-INVALID, /TEST-SPACE/EV-PARENT, /TEST-SPACE/EV-PARENT-NORMAL, /TEST-SPACE/EV-TEST, /TEST-SPACE/FV-TEST, /TEST-SPACE/SAMPLE-TO-DELETE]",
-                    samples);
+            try
+            {
+                commonServer.listSamples(session.getSessionToken(), criteria);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEntities("[]", samples);
+            List<Sample> samples = commonServer.listSamples(session.getSessionToken(), criteria);
+
+            if (user.isInstanceUser())
+            {
+                assertEquals(samples.size(), 38);
+            } else if (user.isTestSpaceUser())
+            {
+                assertEquals(samples.size(), 7);
+                assertEntities(
+                        "[/TEST-SPACE/CP-TEST-4, /TEST-SPACE/EV-INVALID, /TEST-SPACE/EV-PARENT, /TEST-SPACE/EV-PARENT-NORMAL, /TEST-SPACE/EV-TEST, /TEST-SPACE/FV-TEST, /TEST-SPACE/SAMPLE-TO-DELETE]",
+                        samples);
+            } else if (user.isTestProjectUser())
+            {
+                assertEquals(samples.size(), 6);
+                assertEntities(
+                        "[/TEST-SPACE/EV-INVALID, /TEST-SPACE/EV-PARENT, /TEST-SPACE/EV-PARENT-NORMAL, /TEST-SPACE/EV-TEST, /TEST-SPACE/FV-TEST, /TEST-SPACE/SAMPLE-TO-DELETE]",
+                        samples);
+            } else
+            {
+                assertEntities("[]", samples);
+            }
         }
     }
 
@@ -390,17 +422,31 @@ public class CommonServerTest extends SystemTestCase
         SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
 
         List<TechId> materialIds = Arrays.asList(new TechId(34L)); // BACTERIUM-X
-        List<Sample> samples = commonServer.listSamplesByMaterialProperties(session.getSessionToken(), materialIds);
 
-        if (user.isInstanceUser())
-        {
-            assertEntities("[/CISD/CP-TEST-1, /CISD/PLATE_WELLSEARCH:WELL-A01, /TEST-SPACE/FV-TEST]", samples);
-        } else if (user.isTestSpaceUser() || (user.isTestProjectUser() && user.hasPAEnabled()))
+        if (user.isDisabledProjectUser())
         {
-            assertEntities("[/TEST-SPACE/FV-TEST]", samples);
+            try
+            {
+                commonServer.listSamplesByMaterialProperties(session.getSessionToken(), materialIds);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEntities("[]", samples);
+            List<Sample> samples = commonServer.listSamplesByMaterialProperties(session.getSessionToken(), materialIds);
+
+            if (user.isInstanceUser())
+            {
+                assertEntities("[/CISD/CP-TEST-1, /CISD/PLATE_WELLSEARCH:WELL-A01, /TEST-SPACE/FV-TEST]", samples);
+            } else if (user.isTestSpaceUser() || user.isTestProjectUser())
+            {
+                assertEntities("[/TEST-SPACE/FV-TEST]", samples);
+            } else
+            {
+                assertEntities("[]", samples);
+            }
         }
     }
 
@@ -770,25 +816,38 @@ public class CommonServerTest extends SystemTestCase
     {
         SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
 
-        List<Project> projects = commonServer.listProjects(session.getSessionToken());
-
-        if (user.isInstanceUser())
-        {
-            assertEntities(
-                    "[/CISD/DEFAULT, /CISD/NEMO, /CISD/NOE, /TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT, /TESTGROUP/TESTPROJ]",
-                    projects);
-        } else if (user.isTestSpaceUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEntities("[/TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
-        } else if (user.isTestGroupUser())
-        {
-            assertEntities("[/TESTGROUP/TESTPROJ]", projects);
-        } else if (user.isTestProjectUser() && user.hasPAEnabled())
-        {
-            assertEntities("[/TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
+            try
+            {
+                commonServer.listProjects(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEntities("[]", projects);
+            List<Project> projects = commonServer.listProjects(session.getSessionToken());
+
+            if (user.isInstanceUser())
+            {
+                assertEntities(
+                        "[/CISD/DEFAULT, /CISD/NEMO, /CISD/NOE, /TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT, /TESTGROUP/TESTPROJ]",
+                        projects);
+            } else if (user.isTestSpaceUser())
+            {
+                assertEntities("[/TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
+            } else if (user.isTestGroupUser())
+            {
+                assertEntities("[/TESTGROUP/TESTPROJ]", projects);
+            } else if (user.isTestProjectUser())
+            {
+                assertEntities("[/TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
+            } else
+            {
+                assertEntities("[]", projects);
+            }
         }
     }
 
@@ -977,20 +1036,33 @@ public class CommonServerTest extends SystemTestCase
         ExperimentType experimentType = new ExperimentType();
         experimentType.setCode("SIRNA_HCS");
 
-        List<Experiment> experiments = commonServer.listExperiments(session.getSessionToken(), experimentType, new SpaceIdentifier("TEST-SPACE"));
-
-        if (user.isInstanceUser() || user.isTestSpaceUser())
-        {
-            assertEquals(experiments.size(), 3);
-            assertEntities("[/TEST-SPACE/NOE/EXP-TEST-2, /TEST-SPACE/NOE/EXPERIMENT-TO-DELETE, /TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST]",
-                    experiments);
-        } else if (user.isTestProjectUser() && user.hasPAEnabled())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(experiments.size(), 1);
-            assertEntities("[/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST]", experiments);
+            try
+            {
+                commonServer.listExperiments(session.getSessionToken(), experimentType, new SpaceIdentifier("TEST-SPACE"));
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEquals(experiments.size(), 0);
+            List<Experiment> experiments = commonServer.listExperiments(session.getSessionToken(), experimentType, new SpaceIdentifier("TEST-SPACE"));
+
+            if (user.isInstanceUser() || user.isTestSpaceUser())
+            {
+                assertEquals(experiments.size(), 3);
+                assertEntities("[/TEST-SPACE/NOE/EXP-TEST-2, /TEST-SPACE/NOE/EXPERIMENT-TO-DELETE, /TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST]",
+                        experiments);
+            } else if (user.isTestProjectUser())
+            {
+                assertEquals(experiments.size(), 1);
+                assertEntities("[/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST]", experiments);
+            } else
+            {
+                assertEquals(experiments.size(), 0);
+            }
         }
     }
 
@@ -1148,18 +1220,31 @@ public class CommonServerTest extends SystemTestCase
 
         daoFactory.getMetaprojectDAO().createOrUpdateMetaproject(metaproject, person);
 
-        List<Experiment> experiments =
-                commonServer.listMetaprojectExperiments(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
-
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(experiments.size(), 1);
-            assertEquals(experiments.get(0).isStub(), false);
-            assertEquals(experiments.get(0).getIdentifier(), "/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST");
+            try
+            {
+                commonServer.listMetaprojectExperiments(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEquals(experiments.size(), 1);
-            assertEquals(experiments.get(0).isStub(), true);
+            List<Experiment> experiments =
+                    commonServer.listMetaprojectExperiments(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
+
+            if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+            {
+                assertEquals(experiments.size(), 1);
+                assertEquals(experiments.get(0).isStub(), false);
+                assertEquals(experiments.get(0).getIdentifier(), "/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST");
+            } else
+            {
+                assertEquals(experiments.size(), 1);
+                assertEquals(experiments.get(0).isStub(), true);
+            }
         }
     }
 
@@ -1178,18 +1263,31 @@ public class CommonServerTest extends SystemTestCase
 
         daoFactory.getMetaprojectDAO().createOrUpdateMetaproject(metaproject, person);
 
-        List<Sample> samples =
-                commonServer.listMetaprojectSamples(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
-
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(samples.size(), 1);
-            assertEquals(samples.get(0).isStub(), false);
-            assertEquals(samples.get(0).getIdentifier(), "/TEST-SPACE/EV-TEST");
+            try
+            {
+                commonServer.listMetaprojectSamples(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEquals(samples.size(), 1);
-            assertEquals(samples.get(0).isStub(), true);
+            List<Sample> samples =
+                    commonServer.listMetaprojectSamples(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
+
+            if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+            {
+                assertEquals(samples.size(), 1);
+                assertEquals(samples.get(0).isStub(), false);
+                assertEquals(samples.get(0).getIdentifier(), "/TEST-SPACE/EV-TEST");
+            } else
+            {
+                assertEquals(samples.size(), 1);
+                assertEquals(samples.get(0).isStub(), true);
+            }
         }
     }
 
@@ -1208,18 +1306,31 @@ public class CommonServerTest extends SystemTestCase
 
         daoFactory.getMetaprojectDAO().createOrUpdateMetaproject(metaproject, person);
 
-        List<AbstractExternalData> dataSets =
-                commonServer.listMetaprojectExternalData(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
-
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(dataSets.size(), 1);
-            assertEquals(dataSets.get(0).isStub(), false);
-            assertEquals(dataSets.get(0).getCode(), "20120628092259000-41");
+            try
+            {
+                commonServer.listMetaprojectExternalData(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEquals(dataSets.size(), 1);
-            assertEquals(dataSets.get(0).isStub(), true);
+            List<AbstractExternalData> dataSets =
+                    commonServer.listMetaprojectExternalData(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
+
+            if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+            {
+                assertEquals(dataSets.size(), 1);
+                assertEquals(dataSets.get(0).isStub(), false);
+                assertEquals(dataSets.get(0).getCode(), "20120628092259000-41");
+            } else
+            {
+                assertEquals(dataSets.size(), 1);
+                assertEquals(dataSets.get(0).isStub(), true);
+            }
         }
     }
 
@@ -1240,19 +1351,31 @@ public class CommonServerTest extends SystemTestCase
         criteria.setCriteria(Arrays.asList(spaceCriterion, typeCriterion));
         criteria.setConnection(SearchCriteriaConnection.MATCH_ALL);
 
-        List<Sample> samples =
-                commonServer.searchForSamples(session.getSessionToken(), criteria);
-
-        if (user.isInstanceUser() || user.isTestSpaceUser())
-        {
-            assertEntities("[/TEST-SPACE/CP-TEST-4, /TEST-SPACE/FV-TEST]", samples);
-        } else if (user.isTestProjectUser() && user.hasPAEnabled())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(samples.size(), 1);
-            assertEntities("[/TEST-SPACE/FV-TEST]", samples);
+            try
+            {
+                commonServer.searchForSamples(session.getSessionToken(), criteria);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEquals(samples.size(), 0);
+            List<Sample> samples = commonServer.searchForSamples(session.getSessionToken(), criteria);
+
+            if (user.isInstanceUser() || user.isTestSpaceUser())
+            {
+                assertEntities("[/TEST-SPACE/CP-TEST-4, /TEST-SPACE/FV-TEST]", samples);
+            } else if (user.isTestProjectUser())
+            {
+                assertEquals(samples.size(), 1);
+                assertEntities("[/TEST-SPACE/FV-TEST]", samples);
+            } else
+            {
+                assertEquals(samples.size(), 0);
+            }
         }
     }
 
@@ -1269,16 +1392,28 @@ public class CommonServerTest extends SystemTestCase
         criteria.setCriteria(Arrays.asList(criterion));
         criteria.setConnection(SearchCriteriaConnection.MATCH_ANY);
 
-        List<Experiment> experiments =
-                commonServer.searchForExperiments(session.getSessionToken(), criteria);
-
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(experiments.size(), 1);
-            assertEquals(experiments.get(0).getIdentifier(), "/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST");
+            try
+            {
+                commonServer.searchForExperiments(session.getSessionToken(), criteria);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEquals(experiments.size(), 0);
+            List<Experiment> experiments = commonServer.searchForExperiments(session.getSessionToken(), criteria);
+
+            if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+            {
+                assertEquals(experiments.size(), 1);
+                assertEquals(experiments.get(0).getIdentifier(), "/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST");
+            } else
+            {
+                assertEquals(experiments.size(), 0);
+            }
         }
     }
 
@@ -1295,16 +1430,28 @@ public class CommonServerTest extends SystemTestCase
         criteria.setCriteria(Arrays.asList(criterion));
         criteria.setConnection(SearchCriteriaConnection.MATCH_ANY);
 
-        List<AbstractExternalData> dataSets =
-                commonServer.searchForDataSets(session.getSessionToken(), criteria);
-
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(dataSets.size(), 1);
-            assertEquals(dataSets.get(0).getCode(), "20120628092259000-41");
+            try
+            {
+                commonServer.searchForDataSets(session.getSessionToken(), criteria);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEquals(dataSets.size(), 0);
+            List<AbstractExternalData> dataSets = commonServer.searchForDataSets(session.getSessionToken(), criteria);
+
+            if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+            {
+                assertEquals(dataSets.size(), 1);
+                assertEquals(dataSets.get(0).getCode(), "20120628092259000-41");
+            } else
+            {
+                assertEquals(dataSets.size(), 0);
+            }
         }
     }
 
@@ -1377,7 +1524,7 @@ public class CommonServerTest extends SystemTestCase
         attachment.setFilePath("testExperiment2.txt");
         attachment.setContent("testContent2".getBytes());
 
-        if ((user.isInstanceUser() || user.isTestSpaceUser()) || (user.isTestProjectUser() && user.hasPAEnabled()))
+        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             commonServer.addExperimentAttachment(session.getSessionToken(), experimentId, attachment);
 
@@ -1803,14 +1950,27 @@ public class CommonServerTest extends SystemTestCase
         BasicEntityInformationHolder experiment = new BasicEntityInformationHolder(EntityKind.EXPERIMENT, null, null, 23L, null); // /TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST
         DataSetRelatedEntities related = new DataSetRelatedEntities(Arrays.asList(experiment));
 
-        List<AbstractExternalData> dataSets = commonServer.listRelatedDataSets(session.getSessionToken(), related, false);
-
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(dataSets.size(), 9);
+            try
+            {
+                commonServer.listRelatedDataSets(session.getSessionToken(), related, false);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEquals(dataSets.size(), 0);
+            List<AbstractExternalData> dataSets = commonServer.listRelatedDataSets(session.getSessionToken(), related, false);
+
+            if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+            {
+                assertEquals(dataSets.size(), 9);
+            } else
+            {
+                assertEquals(dataSets.size(), 0);
+            }
         }
     }
 
@@ -2103,41 +2263,806 @@ public class CommonServerTest extends SystemTestCase
         }
     }
 
-    private void assertAssignedPropertyTypes(String expected, EntityType entityType)
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListPropertyTypesWithProjectAuthorization(ProjectAuthorizationUser user)
     {
-        List<? extends EntityTypePropertyType<?>> propTypes = entityType.getAssignedPropertyTypes();
-        List<String> propertyCodes = new ArrayList<String>();
-        for (EntityTypePropertyType<?> entityTypePropertyType : propTypes)
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
         {
-            String code = entityTypePropertyType.getPropertyType().getCode();
-            if (entityTypePropertyType.isMandatory())
+            List<PropertyType> types = commonServer.listPropertyTypes(session.getSessionToken(), false);
+            assertEquals(types.size(), 18);
+        } else
+        {
+            try
             {
-                code = code + "*";
+                commonServer.listPropertyTypes(session.getSessionToken(), false);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
             }
-            propertyCodes.add(code);
         }
-        Collections.sort(propertyCodes);
-        assertEquals(expected, propertyCodes.toString());
     }
 
-    @Test
-    @Transactional(propagation = Propagation.NEVER)
-    public void testConcurrentDisplaySettingsUpdateForOneUserIsSafe()
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListEntityTypesPropertyTypesWithProjectAuthorization(ProjectAuthorizationUser user)
     {
-        testConcurrentDisplaySettingsUpdateForUsersIsSafe(new String[] { "test" }, 10, 10);
-    }
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
 
-    @Test
-    @Transactional(propagation = Propagation.NEVER)
-    public void testConcurrentDisplaySettingsUpdateForDifferentUsersIsSafe()
-    {
-        testConcurrentDisplaySettingsUpdateForUsersIsSafe(new String[] { "test", "test_role" }, 5, 10);
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<EntityTypePropertyType<?>> types = commonServer.listEntityTypePropertyTypes(session.getSessionToken());
+            assertEquals(types.size(), 62);
+        } else
+        {
+            try
+            {
+                commonServer.listEntityTypePropertyTypes(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
     }
 
-    @SuppressWarnings("deprecation")
-    private void testConcurrentDisplaySettingsUpdateForUsersIsSafe(String[] users, int numberOfThreads, int numberOfIterations)
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListEntityTypesPropertyTypesForTypeWithProjectAuthorization(ProjectAuthorizationUser user)
     {
-        final String PANEL_ID = "panel_id";
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        ExperimentType experimentType = new ExperimentType();
+        experimentType.setCode("COMPOUND_HCS");
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<EntityTypePropertyType<?>> types = commonServer.listEntityTypePropertyTypes(session.getSessionToken(), experimentType);
+            assertEquals(types.size(), 3);
+        } else
+        {
+            try
+            {
+                commonServer.listEntityTypePropertyTypes(session.getSessionToken(), experimentType);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListMaterialTypesWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<MaterialType> types = commonServer.listMaterialTypes(session.getSessionToken());
+            assertEquals(types.size(), 11);
+        } else
+        {
+            try
+            {
+                commonServer.listMaterialTypes(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testGetMaterialTypeWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+        String code = "BACTERIUM";
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            MaterialType type = commonServer.getMaterialType(session.getSessionToken(), code);
+            assertEquals(type.getCode(), code);
+        } else
+        {
+            try
+            {
+                commonServer.getMaterialType(session.getSessionToken(), code);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListDataTypesWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<DataType> types = commonServer.listDataTypes(session.getSessionToken());
+            assertEquals(types.size(), 10);
+        } else
+        {
+            try
+            {
+                commonServer.listDataTypes(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListFileFormatTypesWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<FileFormatType> types = commonServer.listFileFormatTypes(session.getSessionToken());
+            assertEquals(types.size(), 8);
+        } else
+        {
+            try
+            {
+                commonServer.listFileFormatTypes(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListVocabulariesWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<Vocabulary> vocabularies = commonServer.listVocabularies(session.getSessionToken(), false, false);
+            assertEquals(vocabularies.size(), 6);
+        } else
+        {
+            try
+            {
+                commonServer.listVocabularies(session.getSessionToken(), false, false);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListMaterialsWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        ListMaterialCriteria criteria = ListMaterialCriteria.createFromMaterialIds(Arrays.asList(1L, 2L, 3L));
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<Material> materials = commonServer.listMaterials(session.getSessionToken(), criteria, false);
+            assertEquals(materials.size(), 3);
+        } else
+        {
+            try
+            {
+                commonServer.listMaterials(session.getSessionToken(), criteria, false);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListVocabularyTermsWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        Vocabulary vocabulary = new Vocabulary();
+        vocabulary.setId(1L);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            Set<VocabularyTerm> terms = commonServer.listVocabularyTerms(session.getSessionToken(), vocabulary);
+            assertEquals(terms.size(), 3);
+        } else
+        {
+            try
+            {
+                commonServer.listVocabularyTerms(session.getSessionToken(), vocabulary);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListDataSetTypesWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<DataSetType> types = commonServer.listDataSetTypes(session.getSessionToken());
+            assertEquals(types.size(), 11);
+        } else
+        {
+            try
+            {
+                commonServer.listDataSetTypes(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testGetMaterialInfoWithMaterialIdentifierWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        MaterialIdentifier identifier = new MaterialIdentifier("BACTERIUM1", "BACTERIUM");
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            Material material = commonServer.getMaterialInfo(session.getSessionToken(), identifier);
+            assertEquals(material.getCode(), "BACTERIUM1");
+        } else
+        {
+            try
+            {
+                commonServer.getMaterialInfo(session.getSessionToken(), identifier);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testGetMaterialInfoWithMaterialIdWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        TechId materialId = new TechId(22L);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            Material material = commonServer.getMaterialInfo(session.getSessionToken(), materialId);
+            assertEquals(material.getCode(), "BACTERIUM1");
+        } else
+        {
+            try
+            {
+                commonServer.getMaterialInfo(session.getSessionToken(), materialId);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testGetMaterialInformationHolderWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        MaterialIdentifier identifier = new MaterialIdentifier("BACTERIUM1", "BACTERIUM");
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            IEntityInformationHolderWithPermId holder = commonServer.getMaterialInformationHolder(session.getSessionToken(), identifier);
+            assertEquals(holder.getCode(), "BACTERIUM1");
+        } else
+        {
+            try
+            {
+                commonServer.getMaterialInformationHolder(session.getSessionToken(), identifier);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListScriptsWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        ScriptType type = ScriptType.ENTITY_VALIDATION;
+        EntityKind kind = EntityKind.SAMPLE;
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<Script> scripts = commonServer.listScripts(session.getSessionToken(), type, kind);
+            assertEquals(scripts.size(), 7);
+        } else
+        {
+            try
+            {
+                commonServer.listScripts(session.getSessionToken(), type, kind);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListFiltersWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<GridCustomFilter> filters = commonServer.listFilters(session.getSessionToken(), "test_grid");
+            assertEquals(filters.size(), 1);
+        } else
+        {
+            try
+            {
+                commonServer.listFilters(session.getSessionToken(), "test_grid");
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListDataStoresWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<DataStore> stores = commonServer.listDataStores(session.getSessionToken());
+            assertEquals(stores.size(), 1);
+            assertEquals(stores.get(0).getCode(), "STANDARD");
+        } else
+        {
+            try
+            {
+                commonServer.listDataStores(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListDataStoreServicesWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        DataStoreServiceKind kind = DataStoreServiceKind.PROCESSING;
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<DatastoreServiceDescription> services = commonServer.listDataStoreServices(session.getSessionToken(), kind);
+            assertEquals(services.size(), 1);
+            assertEquals(services.get(0).getKey(), "test_service");
+        } else
+        {
+            try
+            {
+                commonServer.listDataStoreServices(session.getSessionToken(), kind);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testGetDefaultPutDataStoreBaseURLWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            String url = commonServer.getDefaultPutDataStoreBaseURL(session.getSessionToken());
+            assertEquals(url, "http://localhost:8765");
+        } else
+        {
+            try
+            {
+                commonServer.getDefaultPutDataStoreBaseURL(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testGetScriptInfoWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        TechId scriptId = new TechId(5L);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            Script script = commonServer.getScriptInfo(session.getSessionToken(), scriptId);
+            assertEquals(script.getName(), "validateOK");
+        } else
+        {
+            try
+            {
+                commonServer.getScriptInfo(session.getSessionToken(), scriptId);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testSearchForMaterialsWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        DetailedSearchCriterion criterion = new DetailedSearchCriterion();
+        criterion.setField(DetailedSearchField.createAttributeField(MaterialAttributeSearchFieldKind.CODE));
+        criterion.setValue("BACTERIUM1");
+
+        DetailedSearchCriteria criteria = new DetailedSearchCriteria();
+        criteria.setCriteria(Arrays.asList(criterion));
+        criteria.setConnection(SearchCriteriaConnection.MATCH_ANY);
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<Material> materials = commonServer.searchForMaterials(session.getSessionToken(), criteria);
+            assertEquals(materials.size(), 1);
+            assertEquals(materials.get(0).getCode(), "BACTERIUM1");
+        } else
+        {
+            try
+            {
+                commonServer.searchForMaterials(session.getSessionToken(), criteria);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testGetMetaprojectWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        IMetaprojectId metaprojectId = createMetaprojectId(createMetaproject(user.getUserId(), "PA_TEST"));
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            Metaproject metaproject = commonServer.getMetaproject(session.getSessionToken(), metaprojectId);
+            assertEquals(metaproject.getCode(), "PA_TEST");
+        } else
+        {
+            try
+            {
+                commonServer.getMetaproject(session.getSessionToken(), metaprojectId);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListMetaprojectsWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        createMetaproject(user.getUserId(), "PA_TEST");
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<Metaproject> metaprojects = commonServer.listMetaprojects(session.getSessionToken());
+            assertEquals(metaprojects.size(), 1);
+            assertEquals(metaprojects.get(0).getCode(), "PA_TEST");
+        } else
+        {
+            try
+            {
+                commonServer.listMetaprojects(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListMetaprojectAssignmentsCountsWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        MetaprojectPE metaproject = createMetaproject(user.getUserId(), "PA_TEST");
+        createMetaprojectAssignment(metaproject, "200811050951882-1028", null, null); // /CISD/NEMO/EXP1
+        createMetaprojectAssignment(metaproject, "201206190940555-1032", null, null); // /TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST
+        createMetaprojectAssignment(metaproject, "200902091255058-1037", null, null); // /TEST-SPACE/NOE/EXP-TEST-2
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            List<MetaprojectAssignmentsCount> counts = commonServer.listMetaprojectAssignmentsCounts(session.getSessionToken());
+            assertEquals(counts.size(), 1);
+            // all connected entities are counted, the entities user has not access to are returned as stubs
+            assertEquals(counts.get(0).getExperimentCount(), 3);
+        } else
+        {
+            try
+            {
+                commonServer.listMetaprojectAssignmentsCounts(session.getSessionToken());
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testGetMetaprojectAssignmentsCountWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        MetaprojectPE metaproject = createMetaproject(user.getUserId(), "PA_TEST");
+        createMetaprojectAssignment(metaproject, "200811050951882-1028", null, null); // /CISD/NEMO/EXP1
+        createMetaprojectAssignment(metaproject, "201206190940555-1032", null, null); // /TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST
+        createMetaprojectAssignment(metaproject, "200902091255058-1037", null, null); // /TEST-SPACE/NOE/EXP-TEST-2
+
+        if (user.isInstanceUserOrSpaceUserOrEnabledProjectUser())
+        {
+            MetaprojectAssignmentsCount count =
+                    commonServer.getMetaprojectAssignmentsCount(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
+            // all connected entities are counted, the entities user has not access to are returned as stubs
+            assertEquals(count.getExperimentCount(), 3);
+        } else
+        {
+            try
+            {
+                commonServer.getMetaprojectAssignmentsCount(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testGetMetaprojectAssignmentsWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        MetaprojectPE metaproject = createMetaproject(user.getUserId(), "PA_TEST");
+        createMetaprojectAssignment(metaproject, "200811050951882-1028", null, null); // /CISD/NEMO/EXP1
+        createMetaprojectAssignment(metaproject, "201206190940555-1032", null, null); // /TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST
+        createMetaprojectAssignment(metaproject, "200902091255058-1037", null, null); // /TEST-SPACE/NOE/EXP-TEST-2
+
+        if (user.isDisabledProjectUser())
+        {
+            try
+            {
+                commonServer.getMetaprojectAssignments(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        } else
+        {
+            MetaprojectAssignments assignments =
+                    commonServer.getMetaprojectAssignments(session.getSessionToken(), new MetaprojectIdentifierId(metaproject.getIdentifier()));
+            List<Experiment> experiments = assignments.getExperiments();
+
+            if (user.isInstanceUser())
+            {
+                assertEntities("[/CISD/NEMO/EXP1, /TEST-SPACE/NOE/EXP-TEST-2, /TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST]", experiments);
+            } else if (user.isTestSpaceUser())
+            {
+                assertEquals(experiments.get(0).isStub(), true);
+                assertEquals(experiments.get(0).getPermId(), "200811050951882-1028");
+
+                assertEquals(experiments.get(1).isStub(), false);
+                assertEquals(experiments.get(1).getIdentifier(), "/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST");
+
+                assertEquals(experiments.get(2).isStub(), false);
+                assertEquals(experiments.get(2).getIdentifier(), "/TEST-SPACE/NOE/EXP-TEST-2");
+
+            } else if (user.isTestProjectUser())
+            {
+                assertEquals(experiments.get(0).isStub(), true);
+                assertEquals(experiments.get(0).getPermId(), "200811050951882-1028");
+
+                assertEquals(experiments.get(1).isStub(), false);
+                assertEquals(experiments.get(1).getIdentifier(), "/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST");
+
+                assertEquals(experiments.get(2).isStub(), true);
+                assertEquals(experiments.get(2).getPermId(), "200902091255058-1037");
+            } else
+            {
+                assertEquals(experiments.get(0).isStub(), true);
+                assertEquals(experiments.get(0).getPermId(), "200811050951882-1028");
+
+                assertEquals(experiments.get(1).isStub(), true);
+                assertEquals(experiments.get(1).getPermId(), "201206190940555-1032");
+
+                assertEquals(experiments.get(2).isStub(), true);
+                assertEquals(experiments.get(2).getPermId(), "200902091255058-1037");
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListEntityHistoryWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO adminSession = commonServer.tryAuthenticate(TEST_USER, PASSWORD);
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        EntityKind entityKind = EntityKind.EXPERIMENT;
+        TechId entityId = new TechId(23L); // /TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST
+
+        // update project to /TEST-SPACE/NOE
+        ExperimentUpdatesDTO update = new ExperimentUpdatesDTO();
+        update.setExperimentId(entityId);
+        update.setProjectIdentifier(new ProjectIdentifier("TEST-SPACE", "NOE"));
+        update.setProperties(new ArrayList<IEntityProperty>());
+        update.setAttachments(new ArrayList<NewAttachment>());
+        ExperimentUpdateResult updateResult = commonServer.updateExperiment(adminSession.getSessionToken(), update);
+
+        // update project to /TEST-SPACE/PROJECT-TO-DELETE
+        update.setProjectIdentifier(new ProjectIdentifier("TEST-SPACE", "PROJECT-TO-DELETE"));
+        update.setVersion(updateResult.getVersion());
+        updateResult = commonServer.updateExperiment(adminSession.getSessionToken(), update);
+
+        // update project back to /TEST-SPACE/TEST-PROJECT
+        update.setProjectIdentifier(new ProjectIdentifier("TEST-SPACE", "TEST-PROJECT"));
+        update.setVersion(updateResult.getVersion());
+        commonServer.updateExperiment(adminSession.getSessionToken(), update);
+
+        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        {
+            List<EntityHistory> history = commonServer.listEntityHistory(session.getSessionToken(), entityKind, entityId);
+
+            Collections.sort(history, new Comparator<EntityHistory>()
+                {
+                    @Override
+                    public int compare(EntityHistory o1, EntityHistory o2)
+                    {
+                        return o1.tryGetRelatedProject().getIdentifier().compareTo(o2.tryGetRelatedProject().getIdentifier());
+                    }
+                });
+
+            if (user.isInstanceUser() || user.isTestSpaceUser())
+            {
+                assertEquals(history.size(), 2);
+                assertEquals(history.get(0).tryGetRelatedProject().getIdentifier(), "/TEST-SPACE/NOE");
+                assertEquals(history.get(1).tryGetRelatedProject().getIdentifier(), "/TEST-SPACE/PROJECT-TO-DELETE");
+            } else
+            {
+                assertEquals(history.size(), 1);
+                assertEquals(history.get(0).tryGetRelatedProject().getIdentifier(), "/TEST-SPACE/PROJECT-TO-DELETE");
+            }
+        } else
+        {
+            try
+            {
+                commonServer.listEntityHistory(session.getSessionToken(), entityKind, entityId);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        }
+    }
+
+    @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
+    public void testListMatchingEntitiesWithProjectAuthorization(ProjectAuthorizationUser user)
+    {
+        SessionContextDTO session = commonServer.tryAuthenticate(user.getUserId(), PASSWORD);
+
+        SearchableEntity[] searchableEntities = SearchableEntity.values();
+        String queryText = "\"/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST\"";
+        boolean useWildcardSearchMode = false;
+        int maxSize = Integer.MAX_VALUE;
+
+        if (user.isDisabledProjectUser())
+        {
+            try
+            {
+                commonServer.listMatchingEntities(session.getSessionToken(), searchableEntities, queryText, useWildcardSearchMode, maxSize);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        } else
+        {
+            List<MatchingEntity> results =
+                    commonServer.listMatchingEntities(session.getSessionToken(), searchableEntities, queryText, useWildcardSearchMode, maxSize);
+
+            if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+            {
+                assertEquals(results.size(), 1);
+                assertEquals(results.get(0).getIdentifier(), "/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST");
+            } else
+            {
+                assertEquals(results.size(), 0);
+            }
+        }
+    }
+
+    private void assertAssignedPropertyTypes(String expected, EntityType entityType)
+    {
+        List<? extends EntityTypePropertyType<?>> propTypes = entityType.getAssignedPropertyTypes();
+        List<String> propertyCodes = new ArrayList<String>();
+        for (EntityTypePropertyType<?> entityTypePropertyType : propTypes)
+        {
+            String code = entityTypePropertyType.getPropertyType().getCode();
+            if (entityTypePropertyType.isMandatory())
+            {
+                code = code + "*";
+            }
+            propertyCodes.add(code);
+        }
+        Collections.sort(propertyCodes);
+        assertEquals(expected, propertyCodes.toString());
+    }
+
+    @Test
+    @Transactional(propagation = Propagation.NEVER)
+    public void testConcurrentDisplaySettingsUpdateForOneUserIsSafe()
+    {
+        testConcurrentDisplaySettingsUpdateForUsersIsSafe(new String[] { "test" }, 10, 10);
+    }
+
+    @Test
+    @Transactional(propagation = Propagation.NEVER)
+    public void testConcurrentDisplaySettingsUpdateForDifferentUsersIsSafe()
+    {
+        testConcurrentDisplaySettingsUpdateForUsersIsSafe(new String[] { "test", "test_role" }, 5, 10);
+    }
+
+    @SuppressWarnings("deprecation")
+    private void testConcurrentDisplaySettingsUpdateForUsersIsSafe(String[] users, int numberOfThreads, int numberOfIterations)
+    {
+        final String PANEL_ID = "panel_id";
         final String FINISHED_MESSAGE = "finished";
 
         MessageChannel sendChannel = new MessageChannel(5000);
@@ -2489,4 +3414,46 @@ public class CommonServerTest extends SystemTestCase
 
     }
 
+    private MetaprojectPE createMetaproject(String owner, String code)
+    {
+        PersonPE person = daoFactory.getPersonDAO().tryFindPersonByUserId(owner);
+
+        MetaprojectPE metaproject = new MetaprojectPE();
+        metaproject.setName(code);
+        metaproject.setOwner(person);
+
+        daoFactory.getMetaprojectDAO().createOrUpdateMetaproject(metaproject, person);
+
+        return metaproject;
+    }
+
+    private IMetaprojectId createMetaprojectId(MetaprojectPE metaproject)
+    {
+        return new MetaprojectIdentifierId(metaproject.getOwner().getUserId(), metaproject.getCode());
+    }
+
+    private void createMetaprojectAssignment(MetaprojectPE metaproject, String experimentPermId, String samplePermId, String dataSetPermId)
+    {
+        MetaprojectAssignmentPE assignment = new MetaprojectAssignmentPE();
+        assignment.setMetaproject(metaproject);
+
+        if (experimentPermId != null)
+        {
+            ExperimentPE experiment = daoFactory.getExperimentDAO().tryGetByPermID(experimentPermId);
+            assignment.setExperiment(experiment);
+        }
+        if (samplePermId != null)
+        {
+            SamplePE sample = daoFactory.getSampleDAO().tryToFindByPermID(samplePermId);
+            assignment.setSample(sample);
+        }
+        if (dataSetPermId != null)
+        {
+            DataPE dataSet = daoFactory.getDataDAO().tryToFindDataSetByCode(dataSetPermId);
+            assignment.setDataSet(dataSet);
+        }
+
+        daoFactory.getSessionFactory().getCurrentSession().save(assignment);
+    }
+
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeletionTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeletionTestCase.java
index 77e613ab5844f3a9d872be5e2aaffdc1bd0a974b..457c0e10dd2ae31a71fb921e35a147f5ef2f224c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeletionTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeletionTestCase.java
@@ -42,7 +42,6 @@ import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridRowModels;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SessionContext;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDeletionDAO;
 import ch.systemsx.cisd.openbis.generic.shared.IServiceForDataStoreServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
@@ -76,8 +75,6 @@ public class DeletionTestCase extends SystemTestCase
 
     private static final String REASON = "REASON";
 
-    protected IDAOFactory daoFactory;
-
     protected IDeletionDAO deletionDAO;
 
     private String sessionToken;
@@ -98,12 +95,6 @@ public class DeletionTestCase extends SystemTestCase
         this.etlService = etlService;
     }
 
-    @Autowired
-    public final void setDaoFactory(IDAOFactory daoFactory)
-    {
-        this.daoFactory = daoFactory;
-    }
-
     @BeforeMethod
     public void setUp()
     {
@@ -412,8 +403,7 @@ public class DeletionTestCase extends SystemTestCase
                 new ExperimentIdentifier("CISD", "DEFAULT", code);
         NewExperiment experiment = new NewExperiment(expIdentifier.toString(), "COMPOUND_HCS");
         final GenericEntityProperty property = createDescriptionProperty();
-        experiment.setProperties(new IEntityProperty[]
-        { property });
+        experiment.setProperties(new IEntityProperty[] { property });
         long id = etlService.registerExperiment(sessionToken, experiment);
 
         Experiment exp = commonServer.getExperimentInfo(sessionToken, new TechId(id));
@@ -453,8 +443,7 @@ public class DeletionTestCase extends SystemTestCase
             boolean shouldBeDeleted)
     {
         NewSample newSample = createNewSample(sampleCode);
-        newSample.setParentsOrNull(new String[]
-        { parentCode });
+        newSample.setParentsOrNull(new String[] { parentCode });
         createSample(experimentCode, newSample, shouldBeDeleted);
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
index 5f608a22c4423eca49d3826f514cb56025ac6b7a..de1cea0df4893207f95640fbc3f0f50b071854d3 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
@@ -45,6 +45,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SessionContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.server.UploadedFilesBean;
 import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.util.TestInitializer;
 import ch.systemsx.cisd.openbis.generic.shared.Constants;
 import ch.systemsx.cisd.openbis.generic.shared.IServiceForDataStoreServer;
@@ -82,7 +83,7 @@ import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
 public abstract class SystemTestCase extends AbstractTransactionalTestNGSpringContextTests
 {
     private static final String SOURCE_TEST_CORE_PLUGINS = "sourceTest/core-plugins";
-    
+
     protected static final String SYSTEM_USER = "system";
 
     protected static final String NOT_EXISTING_USER = "notexistinguser";
@@ -113,6 +114,8 @@ public abstract class SystemTestCase extends AbstractTransactionalTestNGSpringCo
 
     protected static final String SESSION_KEY = "session-key";
 
+    protected IDAOFactory daoFactory;
+
     protected ICommonServerForInternalUse commonServer;
 
     protected IGenericServer genericServer;
@@ -152,6 +155,18 @@ public abstract class SystemTestCase extends AbstractTransactionalTestNGSpringCo
         contextProvider.setRequest(request);
     }
 
+    /**
+     * Sets <code>daoFactory</code>.
+     * <p>
+     * Will be automatically dependency injected by type.
+     * </p>
+     */
+    @Autowired
+    public final void setDaoFactory(final IDAOFactory daoFactory)
+    {
+        this.daoFactory = daoFactory;
+    }
+
     /**
      * Sets <code>commonServer</code>.
      * <p>
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationChangingServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationChangingServiceTest.java
index 4895a5d732a694443cfe3f807d237464166b12d3..d06610e91943c90bba173a62cab38b53c0b8eb88 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationChangingServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationChangingServiceTest.java
@@ -68,6 +68,10 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermReplacement;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectAssignmentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.systemtest.PropertyHistory;
 import ch.systemsx.cisd.openbis.systemtest.SystemTestCase;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
@@ -136,6 +140,7 @@ public class GeneralInformationChangingServiceTest extends SystemTestCase
                 history.toString());
     }
 
+    @SuppressWarnings("null")
     @Test
     public void testVocabularyAdditionAndReplacement()
     {
@@ -748,9 +753,16 @@ public class GeneralInformationChangingServiceTest extends SystemTestCase
     {
         String session = generalInformationService.tryToAuthenticateForAllServices(user.getUserId(), PASSWORD);
 
-        Metaproject metaproject = new Metaproject();
+        // intentionally create a metaproject bypassing authorization as we want to
+        // concentrate on addToMetaproject method authorization here
+
+        PersonPE owner = daoFactory.getPersonDAO().tryFindPersonByUserId(user.getUserId());
+
+        MetaprojectPE metaproject = new MetaprojectPE();
         metaproject.setName("TEST_ADD_TO_METAPROJECT");
-        metaproject = commonServer.registerMetaproject(session, metaproject);
+        metaproject.setOwner(owner);
+
+        daoFactory.getMetaprojectDAO().createOrUpdateMetaproject(metaproject, owner);
 
         IMetaprojectId metaprojectId = new MetaprojectTechIdId(metaproject.getId());
 
@@ -778,17 +790,41 @@ public class GeneralInformationChangingServiceTest extends SystemTestCase
     {
         String session = generalInformationService.tryToAuthenticateForAllServices(user.getUserId(), PASSWORD);
 
-        Metaproject metaproject = new Metaproject();
+        // intentionally create a metaproject and an assignment bypassing authorization as we want to
+        // concentrate on removeFromMetaproject method authorization here
+
+        PersonPE owner = daoFactory.getPersonDAO().tryFindPersonByUserId(user.getUserId());
+        ExperimentPE experiment = daoFactory.getExperimentDAO().tryGetByPermID("201206190940555-1032"); // /TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST
+
+        MetaprojectPE metaproject = new MetaprojectPE();
         metaproject.setName("TEST_REMOVE_FROM_METAPROJECT");
-        metaproject = commonServer.registerMetaproject(session, metaproject);
+        metaproject.setOwner(owner);
+
+        MetaprojectAssignmentPE assignment = new MetaprojectAssignmentPE();
+        assignment.setExperiment(experiment);
+        assignment.setMetaproject(metaproject);
+
+        daoFactory.getMetaprojectDAO().createOrUpdateMetaproject(metaproject, owner);
 
         IMetaprojectId metaprojectId = new MetaprojectTechIdId(metaproject.getId());
 
         MetaprojectAssignmentsIds assignments = new MetaprojectAssignmentsIds();
-        assignments.addMaterial(new MaterialCodeAndTypeCodeId("VIRUS1", "VIRUS"));
+        assignments.addExperiment(new ExperimentIdentifierId("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
 
-        generalInformationChangingService.addToMetaproject(session, metaprojectId, assignments);
-        generalInformationChangingService.removeFromMetaproject(session, metaprojectId, assignments);
+        if (user.isDisabledProjectUser())
+        {
+            try
+            {
+                generalInformationChangingService.removeFromMetaproject(session, metaprojectId, assignments);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        } else
+        {
+            generalInformationChangingService.removeFromMetaproject(session, metaprojectId, assignments);
+        }
     }
 
     @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
@@ -802,7 +838,17 @@ public class GeneralInformationChangingServiceTest extends SystemTestCase
                 "identifier\texperiment\tCOMMENT\n"
                         + "/TEST-SPACE/PA_UPLOAD\t/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST\ttest comment\n");
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            try
+            {
+                generalInformationChangingService.registerSamples(session.getSessionID(), sampleType, SESSION_KEY, null);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             generalInformationChangingService.registerSamples(session.getSessionID(), sampleType, SESSION_KEY, null);
         } else
@@ -829,7 +875,17 @@ public class GeneralInformationChangingServiceTest extends SystemTestCase
                 "identifier\tCOMMENT\n"
                         + "/TEST-SPACE/FV-TEST\tupdated comment\n");
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
+        {
+            try
+            {
+                generalInformationChangingService.updateSamples(session.getSessionID(), sampleType, SESSION_KEY, null);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        } else if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
         {
             generalInformationChangingService.updateSamples(session.getSessionID(), sampleType, SESSION_KEY, null);
         } else
@@ -857,7 +913,21 @@ public class GeneralInformationChangingServiceTest extends SystemTestCase
                         + "/TEST-SPACE/PA_UPLOAD\t/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST\ttest comment\n");
 
         // there are no checks on what has been uploaded before the uploaded data is actually used in the registration or update
-        generalInformationChangingService.uploadedSamplesInfo(session.getSessionID(), sampleType, SESSION_KEY);
+
+        if (user.isDisabledProjectUser())
+        {
+            try
+            {
+                generalInformationChangingService.uploadedSamplesInfo(session.getSessionID(), sampleType, SESSION_KEY);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
+        } else
+        {
+            generalInformationChangingService.uploadedSamplesInfo(session.getSessionID(), sampleType, SESSION_KEY);
+        }
     }
 
     @Test(dataProviderClass = ProjectAuthorizationUser.class, dataProvider = ProjectAuthorizationUser.PROVIDER)
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 9ef739bf6dcb02edac551681c593b3d6a31c8b6b..f63efd65e6798ff98a8ecbb0acb883bbc6f0a272 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
@@ -1922,7 +1922,7 @@ public class GeneralInformationServiceTest extends SystemTestCase
     {
         String url = generalInformationService.getDefaultPutDataStoreBaseURL(sessionToken);
 
-        assertEquals("", url);
+        assertEquals("http://localhost:8765", url);
     }
 
     @Test
@@ -1932,7 +1932,7 @@ public class GeneralInformationServiceTest extends SystemTestCase
                 generalInformationService.tryGetDataStoreBaseURL(sessionToken,
                         "20081105092159111-1");
 
-        assertEquals("", url);
+        assertEquals("http://localhost:8765", url);
     }
 
     @Test
@@ -2168,15 +2168,28 @@ public class GeneralInformationServiceTest extends SystemTestCase
         SearchCriteria criteria = new SearchCriteria();
         criteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.PROJECT, "TEST-PROJECT"));
 
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
         {
-            List<Experiment> experiments = generalInformationService.searchForExperiments(session, criteria);
-            assertEquals(1, experiments.size());
-            assertEquals("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST", experiments.get(0).getIdentifier());
+            try
+            {
+                generalInformationService.searchForExperiments(session, criteria);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
             List<Experiment> experiments = generalInformationService.searchForExperiments(session, criteria);
-            assertEquals(0, experiments.size());
+
+            if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+            {
+                assertEquals(1, experiments.size());
+                assertEquals("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST", experiments.get(0).getIdentifier());
+            } else
+            {
+                assertEquals(0, experiments.size());
+            }
         }
     }
 
@@ -2190,17 +2203,30 @@ public class GeneralInformationServiceTest extends SystemTestCase
         criteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.SPACE, "TEST-SPACE"));
         criteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.TYPE, "CELL_PLATE"));
 
-        List<Sample> samples = generalInformationService.searchForSamples(session, criteria);
-
-        if (user.isInstanceUser() || user.isTestSpaceUser())
-        {
-            assertEntities("[/TEST-SPACE/CP-TEST-4, /TEST-SPACE/FV-TEST]", samples);
-        } else if (user.isTestProjectUser() && user.hasPAEnabled())
+        if (user.isDisabledProjectUser())
         {
-            assertEntities("[/TEST-SPACE/FV-TEST]", samples);
+            try
+            {
+                generalInformationService.searchForSamples(session, criteria);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEntities("[]", samples);
+            List<Sample> samples = generalInformationService.searchForSamples(session, criteria);
+
+            if (user.isInstanceUser() || user.isTestSpaceUser())
+            {
+                assertEntities("[/TEST-SPACE/CP-TEST-4, /TEST-SPACE/FV-TEST]", samples);
+            } else if (user.isTestProjectUser())
+            {
+                assertEntities("[/TEST-SPACE/FV-TEST]", samples);
+            } else
+            {
+                assertEntities("[]", samples);
+            }
         }
     }
 
@@ -2214,17 +2240,30 @@ public class GeneralInformationServiceTest extends SystemTestCase
         criteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.SPACE, "TEST-SPACE"));
         criteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.TYPE, "CELL_PLATE"));
 
-        List<Sample> samples = generalInformationService.searchForSamples(session, criteria, EnumSet.of(SampleFetchOption.BASIC));
-
-        if (user.isInstanceUser() || user.isTestSpaceUser())
-        {
-            assertEntities("[/TEST-SPACE/CP-TEST-4, /TEST-SPACE/FV-TEST]", samples);
-        } else if (user.isTestProjectUser() && user.hasPAEnabled())
+        if (user.isDisabledProjectUser())
         {
-            assertEntities("[/TEST-SPACE/FV-TEST]", samples);
+            try
+            {
+                generalInformationService.searchForSamples(session, criteria, EnumSet.of(SampleFetchOption.BASIC));
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEntities("[]", samples);
+            List<Sample> samples = generalInformationService.searchForSamples(session, criteria, EnumSet.of(SampleFetchOption.BASIC));
+
+            if (user.isInstanceUser() || user.isTestSpaceUser())
+            {
+                assertEntities("[/TEST-SPACE/CP-TEST-4, /TEST-SPACE/FV-TEST]", samples);
+            } else if (user.isTestProjectUser())
+            {
+                assertEntities("[/TEST-SPACE/FV-TEST]", samples);
+            } else
+            {
+                assertEntities("[]", samples);
+            }
         }
     }
 
@@ -2310,29 +2349,38 @@ public class GeneralInformationServiceTest extends SystemTestCase
     {
         String session = generalInformationService.tryToAuthenticateForAllServices(user.getUserId(), PASSWORD);
 
-        List<Project> projects = generalInformationService.listProjects(session);
-
-        if (user.isInstanceUser())
-        {
-            assertEntities(
-                    "[/CISD/DEFAULT, /CISD/NEMO, /CISD/NOE, /TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT, /TESTGROUP/TESTPROJ]",
-                    projects);
-        } else if (user.isTestSpaceUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEntities(
-                    "[/TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]",
-                    projects);
-        } else if (user.isTestProjectUser() && user.hasPAEnabled())
-        {
-            assertEntities(
-                    "[/TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]",
-                    projects);
-        } else if (user.isTestGroupUser())
-        {
-            assertEntities("[/TESTGROUP/TESTPROJ]", projects);
+            try
+            {
+                generalInformationService.listProjects(session);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEntities("[]", projects);
+            List<Project> projects = generalInformationService.listProjects(session);
+
+            if (user.isInstanceUser())
+            {
+                assertEntities(
+                        "[/CISD/DEFAULT, /CISD/NEMO, /CISD/NOE, /TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT, /TESTGROUP/TESTPROJ]",
+                        projects);
+            } else if (user.isTestSpaceUser())
+            {
+                assertEntities("[/TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
+            } else if (user.isTestProjectUser())
+            {
+                assertEntities("[/TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
+            } else if (user.isTestGroupUser())
+            {
+                assertEntities("[/TESTGROUP/TESTPROJ]", projects);
+            } else
+            {
+                assertEntities("[]", projects);
+            }
         }
     }
 
@@ -2350,14 +2398,10 @@ public class GeneralInformationServiceTest extends SystemTestCase
                     projects);
         } else if (user.isTestSpaceUser())
         {
-            assertEntities(
-                    "[/TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]",
-                    projects);
+            assertEntities("[/TEST-SPACE/NOE, /TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
         } else if (user.isTestProjectUser() && user.hasPAEnabled())
         {
-            assertEntities(
-                    "[/TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]",
-                    projects);
+            assertEntities("[/TEST-SPACE/PROJECT-TO-DELETE, /TEST-SPACE/TEST-PROJECT]", projects);
         } else if (user.isTestGroupUser())
         {
             assertEntities("[/TESTGROUP/TESTPROJ]", projects);
@@ -3346,15 +3390,28 @@ public class GeneralInformationServiceTest extends SystemTestCase
         SearchCriteria criteria = new SearchCriteria();
         criteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "20120628092259000-41"));
 
-        List<DataSet> dataSets = generalInformationService.searchForDataSets(session, criteria);
-
-        if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+        if (user.isDisabledProjectUser())
         {
-            assertEquals(1, dataSets.size());
-            assertEquals("20120628092259000-41", dataSets.get(0).getCode());
+            try
+            {
+                generalInformationService.searchForDataSets(session, criteria);
+                fail();
+            } catch (AuthorizationFailureException e)
+            {
+                // expected
+            }
         } else
         {
-            assertEquals(0, dataSets.size());
+            List<DataSet> dataSets = generalInformationService.searchForDataSets(session, criteria);
+
+            if (user.isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser())
+            {
+                assertEquals(1, dataSets.size());
+                assertEquals("20120628092259000-41", dataSets.get(0).getCode());
+            } else
+            {
+                assertEquals(0, dataSets.size());
+            }
         }
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/ProjectAuthorizationUser.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/ProjectAuthorizationUser.java
index 622e9b847e7bab5e6852b6dd0f288c1de8b39eca..05f2fcd2e5d8a830a6d09f357c5a5c9cf6d36fe2 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/ProjectAuthorizationUser.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/ProjectAuthorizationUser.java
@@ -76,6 +76,16 @@ public class ProjectAuthorizationUser
         this.isInstanceUser = isInstanceUser;
     }
 
+    public boolean isSpaceUser()
+    {
+        return isTestSpaceUser() || isTestGroupUser();
+    }
+
+    public boolean isProjectUser()
+    {
+        return isTestProjectUser();
+    }
+
     public boolean isTestGroupUser()
     {
         return isTestGroupUser;
@@ -115,12 +125,27 @@ public class ProjectAuthorizationUser
     {
         this.isTestProjectUser = isTestProjectUser;
     }
-    
+
+    public boolean isDisabledProjectUser()
+    {
+        return isProjectUser() && false == hasPAEnabled();
+    }
+
+    public boolean isEnabledProjectUser()
+    {
+        return isProjectUser() && hasPAEnabled();
+    }
+
     public boolean isInstanceUserOrTestSpaceUserOrEnabledTestProjectUser()
     {
         return isInstanceUser() || isTestSpaceUser() || (isTestProjectUser() && hasPAEnabled());
     }
 
+    public boolean isInstanceUserOrSpaceUserOrEnabledProjectUser()
+    {
+        return isInstanceUser() || isSpaceUser() || isEnabledProjectUser();
+    }
+
     @DataProvider(name = PROVIDER)
     public static Object[][] providerUsers()
     {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/validator/entity/EntityValidatorTestService.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/validator/entity/EntityValidatorTestService.java
new file mode 100644
index 0000000000000000000000000000000000000000..bed33f218a7ddf181e75baa4547b98557d1f5984
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/validator/entity/EntityValidatorTestService.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2017 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.systemtest.authorization.validator.entity;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.ReturnValueFilter;
+import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed;
+import ch.systemsx.cisd.openbis.generic.server.authorization.validator.EntityHistoryValidator;
+import ch.systemsx.cisd.openbis.generic.server.authorization.validator.MatchingEntityValidator;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityHistory;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSessionProvider;
+
+/**
+ * @author pkupczyk
+ */
+@Component
+public class EntityValidatorTestService
+{
+
+    @Transactional
+    @RolesAllowed(value = { RoleWithHierarchy.PROJECT_OBSERVER })
+    @ReturnValueFilter(validatorClass = EntityHistoryValidator.class)
+    public EntityHistory testEntityHistoryValidator(IAuthSessionProvider sessionProvider, EntityHistory history)
+    {
+        return history;
+    }
+
+    @Transactional
+    @RolesAllowed(value = { RoleWithHierarchy.PROJECT_OBSERVER })
+    @ReturnValueFilter(validatorClass = MatchingEntityValidator.class)
+    public List<MatchingEntity> testMatchingEntityValidator(IAuthSessionProvider sessionProvider, MatchingEntity matchingEntity)
+    {
+        return Collections.singletonList(matchingEntity);
+    }
+
+}
diff --git a/openbis/sourceTest/sql/postgresql/168/018=data_store_services.tsv b/openbis/sourceTest/sql/postgresql/168/018=data_store_services.tsv
new file mode 100644
index 0000000000000000000000000000000000000000..42f34786645814feead6d38be2f8b7f77b2259cc
--- /dev/null
+++ b/openbis/sourceTest/sql/postgresql/168/018=data_store_services.tsv
@@ -0,0 +1 @@
+1	test_service	test_label	PROCESSING	1	\N
diff --git a/openbis/sourceTest/sql/postgresql/168/019=data_stores.tsv b/openbis/sourceTest/sql/postgresql/168/019=data_stores.tsv
index 8903eee67d11a8e3382f35e8224ed26e08fd3753..605f2370d5b5d59e104055885dca8c3a55427f93 100644
--- a/openbis/sourceTest/sql/postgresql/168/019=data_stores.tsv
+++ b/openbis/sourceTest/sql/postgresql/168/019=data_stores.tsv
@@ -1 +1 @@
-1	STANDARD		2008-11-05 09:18:00.622+01			2009-04-09 09:36:34.982+02	f	\N	57F0FA8F-80AC-42AB-9C6A-AAADBCC37A3E
+1	STANDARD	http://localhost:8765	2008-11-05 09:18:00.622+01			2009-04-09 09:36:34.982+02	f	\N	57F0FA8F-80AC-42AB-9C6A-AAADBCC37A3E
diff --git a/openbis/sourceTest/sql/postgresql/168/034=filters.tsv b/openbis/sourceTest/sql/postgresql/168/034=filters.tsv
new file mode 100644
index 0000000000000000000000000000000000000000..6e5a5828d13431cce59f0c168a2d5df0ee2c9ae0
--- /dev/null
+++ b/openbis/sourceTest/sql/postgresql/168/034=filters.tsv
@@ -0,0 +1 @@
+1	test_filter	\N	2017-12-02 20:33:50.865931+01	1	2017-12-02 20:33:50.865931+01	test_expression	t	test_grid
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/authorization/ScreeningExperimentValidator.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/authorization/ScreeningExperimentValidator.java
index db9ce324fbcb5392e002f66c9683cf6c48afdcfb..0e966c7834d7e8f027f82b5279942cac13dd7039 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/authorization/ScreeningExperimentValidator.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/authorization/ScreeningExperimentValidator.java
@@ -26,7 +26,7 @@ public final class ScreeningExperimentValidator extends AbstractValidator<Experi
 
         for (final RoleAssignmentPE roleAssignment : roleAssignments)
         {
-            if (roleAssignment.getSpace() == null && roleAssignment.getProject() == null)
+            if (roleAssignment.getRoleWithHierarchy().isInstanceLevel())
             {
                 // All roles on the db level allow full read access.
                 // Note: Here we assume that we operate on _the only_ db instance (the home db)!
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/authorization/SpaceValidator.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/authorization/SpaceValidator.java
index 75fd2a7d32ab05aa8c4bd1b9fffb0be3a551be78..9c92919783e6e8461ab45acf331232a5f7b4bca8 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/authorization/SpaceValidator.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/authorization/SpaceValidator.java
@@ -44,7 +44,7 @@ abstract class SpaceValidator<T> extends AbstractValidator<T>
         final Set<RoleAssignmentPE> roleAssignments = person.getAllPersonRoles();
         for (final RoleAssignmentPE roleAssignment : roleAssignments)
         {
-            if (roleAssignment.getSpace() == null && roleAssignment.getProject() == null)
+            if (roleAssignment.getRoleWithHierarchy().isInstanceLevel())
             {
                 // All roles on the db level allow full read access.
                 // Note: Here we assume that we operate on _the only_ db instance (the home db)!
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/dataset/DataSetReferencePredicateSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/dataset/DataSetReferencePredicateSystemTest.java
index ba65b0f011c53a336ecf6f715a3bbcd7d573a188..72ecc5b6f1e8df23e7decb271ea4a80fb64ed107 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/dataset/DataSetReferencePredicateSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/dataset/DataSetReferencePredicateSystemTest.java
@@ -68,13 +68,25 @@ public class DataSetReferencePredicateSystemTest extends CommonPredicateScreenin
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No data set reference specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No data set reference specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentIdentifierPredicateSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentIdentifierPredicateSystemTest.java
index f37f6e0df2c161c1bbee907eea277cab44ef9246..c86e0fd0a5286955c6e9398a182bd70ac31c945f 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentIdentifierPredicateSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentIdentifierPredicateSystemTest.java
@@ -45,13 +45,25 @@ public abstract class ExperimentIdentifierPredicateSystemTest extends CommonPred
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No experiment specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No experiment specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    }
                 }
             };
     }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateSystemTest.java
index cb3affbf38275d384b19f873ce294b18214f45bd..19c38894c007ae6e3f4d70c2d0c823cff11b8548 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateSystemTest.java
@@ -44,7 +44,13 @@ public abstract class ExperimentSearchCriteriaPredicateSystemTest extends Common
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateWithExperimentTechIdSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateWithExperimentTechIdSystemTest.java
index aaf3e405b1c987e12a74419e155179c8d930f2f0..dd85f2d2e951d93539343782ed164e948092b9f5 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateWithExperimentTechIdSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateWithExperimentTechIdSystemTest.java
@@ -54,7 +54,13 @@ public class ExperimentSearchCriteriaPredicateWithExperimentTechIdSystemTest ext
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertUserFailureExceptionThatExperimentDoesNotExist(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertUserFailureExceptionThatExperimentDoesNotExist(t);
+                    }
                 }
             };
     }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateWithProjectIdentifierSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateWithProjectIdentifierSystemTest.java
index f7b6eae04a6708b734d6249b78593e3bc5176577..01a4f99278d0f8253cd8e10fe09358cced205b0e 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateWithProjectIdentifierSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/experiment/ExperimentSearchCriteriaPredicateWithProjectIdentifierSystemTest.java
@@ -50,7 +50,10 @@ public class ExperimentSearchCriteriaPredicateWithProjectIdentifierSystemTest ex
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser())
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser())
                     {
                         assertNoException(t);
                     } else
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateSystemTest.java
index efa65c1a515cd4cbff01591bc533da9941d59c0d..0bc12af6b0163435a266746e65167faae06776c9 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateSystemTest.java
@@ -51,7 +51,13 @@ public abstract class PlateIdentifierPredicateSystemTest extends CommonPredicate
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No plate identifier specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No plate identifier specified.");
+                    }
                 }
             };
     }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateWithPermIdSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateWithPermIdSystemTest.java
index 028842fb810548d6d6078f6c3919b7bd5efa86fd..08d43ed8e90aaf2af1dd401fe4fdea6991d4e130 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateWithPermIdSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateWithPermIdSystemTest.java
@@ -49,7 +49,13 @@ public class PlateIdentifierPredicateWithPermIdSystemTest extends PlateIdentifie
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertAuthorizationFailureExceptionThatNotEnoughPrivileges(t);
+                    }
                 }
             };
     }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateWithPlateCodeAndSpaceCodeSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateWithPlateCodeAndSpaceCodeSystemTest.java
index bea47d0105fbf8c45411c9e4b565622e2439122e..559fa88b9126beeeae578b2a8da30c6b68211239 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateWithPlateCodeAndSpaceCodeSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/PlateIdentifierPredicateWithPlateCodeAndSpaceCodeSystemTest.java
@@ -49,7 +49,10 @@ public class PlateIdentifierPredicateWithPlateCodeAndSpaceCodeSystemTest extends
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
                     {
                         assertNoException(t);
                     } else
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateSystemTest.java
index 5815859bce465464cc233d8cd8b3fc6f01fbd484..40b21abba55bc89c6ec5c56ff75a76c0aa6919e6 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateSystemTest.java
@@ -57,13 +57,25 @@ public abstract class ScreeningPlateListReadOnlyPredicateSystemTest extends Comm
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, NullPointerException.class, null);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, NullPointerException.class, null);
+                    }
                 }
 
                 @Override
                 public void assertWithNullCollection(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No plate specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No plate specified.");
+                    }
                 }
             };
     }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateWithPermIdSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateWithPermIdSystemTest.java
index b92f0b060be2f0d4c03196b9c83043c6519dc4c1..c6406989f02ed258d0db647f9a21ca56f028e39d 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateWithPermIdSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateWithPermIdSystemTest.java
@@ -49,7 +49,13 @@ public class ScreeningPlateListReadOnlyPredicateWithPermIdSystemTest extends Scr
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertNoException(t);
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertNoException(t);
+                    }
                 }
             };
     }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateWithPlateCodeAndSpaceCodeSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateWithPlateCodeAndSpaceCodeSystemTest.java
index d1debbaac1b1c53b446cac1cd0b42715b51c02ae..43f9a68b33165cdb84efdaa2a880e9755d76386a 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateWithPlateCodeAndSpaceCodeSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/ScreeningPlateListReadOnlyPredicateWithPlateCodeAndSpaceCodeSystemTest.java
@@ -49,7 +49,10 @@ public class ScreeningPlateListReadOnlyPredicateWithPlateCodeAndSpaceCodeSystemT
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else if (user.isInstanceUser() || SampleKind.SHARED_READ.equals(param))
                     {
                         assertNoException(t);
                     } else
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/WellIdentifierPredicateSystemTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/WellIdentifierPredicateSystemTest.java
index 3577bdddf0803ad11052a23996a25b8cc9684082..ecc4e3cfa816a0817c01d08a4ddf84c0c7fab9c3 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/WellIdentifierPredicateSystemTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/authorization/predicate/sample/WellIdentifierPredicateSystemTest.java
@@ -68,13 +68,25 @@ public class WellIdentifierPredicateSystemTest extends CommonPredicateScreeningS
                 @Override
                 public void assertWithNullObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, UserFailureException.class, "No well identifier specified.");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, UserFailureException.class, "No well identifier specified.");
+                    }
                 }
 
                 @Override
                 public void assertWithNonexistentObject(ProjectAuthorizationUser user, Throwable t, Object param)
                 {
-                    assertException(t, AuthorizationFailureException.class, ".*There is no sample with perm id 'IDONTEXIST'.*");
+                    if (user.isDisabledProjectUser())
+                    {
+                        assertAuthorizationFailureExceptionThatNoRoles(t);
+                    } else
+                    {
+                        assertException(t, AuthorizationFailureException.class, ".*There is no sample with perm id 'IDONTEXIST'.*");
+                    }
                 }
             };
     }