diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java
index 7176ad9d1a43ffa144c773837a12e20a0e2ee9fa..3d799fe4326383c706e3860bd6e25b550abe0e9f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java
@@ -68,23 +68,17 @@ public class RelationshipService implements IRelationshipService
     private DAOFactory daoFactory;
 
     @Override
-    public void assignExperimentToProject(IAuthSession session, ExperimentIdentifier experimentId,
-            ProjectIdentifier projectId)
+    public void assignExperimentToProject(IAuthSession session, ExperimentPE experiment,
+            ProjectPE project)
     {
-        ExperimentPE experiment = findExperiment(experimentId);
-        ProjectPE project = findProject(projectId);
-
         SampleUtils.setSamplesGroup(experiment, project.getSpace());
         experiment.setProject(project);
     }
 
     @Override
-    public void assignProjectToSpace(IAuthSession session, ProjectIdentifier projectId,
-            SpaceIdentifier spaceId)
+    public void assignProjectToSpace(IAuthSession session, ProjectPE project,
+            SpacePE space)
     {
-        ProjectPE project = findProject(projectId);
-        SpacePE space = findSpace(spaceId);
-
         project.setSpace(space);
         for (ExperimentPE experiment : project.getExperiments())
         {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
index 74ea5e3c9ebe8056561476175df93b7fe6f3db17..64a7a3865595ddaa4848a05aea67ef7209c01133 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
@@ -428,10 +428,7 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
         ProjectPE previousProject = experiment.getProject();
         if (project.equals(previousProject) == false)
         {
-            relationshipService.assignExperimentToProject(session, new ExperimentIdentifier(
-                    new ProjectIdentifier(previousProject.getSpace().getDatabaseInstance()
-                            .getCode(), previousProject.getSpace().getCode(), previousProject
-                            .getCode()), experiment.getCode()), updates.getProjectIdentifier());
+            relationshipService.assignExperimentToProject(session, experiment, project);
         }
 
         for (NewAttachment attachment : updates.getAttachments())
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
index 5cbab927c9386552abdd3bb46549e1f9a7de7d89..466f56f2dbced7748a93dd67bff440732044bbd8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
@@ -250,14 +250,26 @@ public final class ExperimentTable extends AbstractBusinessObject implements IEx
         if (updates.isProjectUpdateRequested())
         {
             ProjectPE previousProject = experiment.getProject();
-            ProjectIdentifier previousProjectId =
-                    new ProjectIdentifier(previousProject.getSpace().getDatabaseInstance()
-                            .getCode(), previousProject.getSpace().getCode(), previousProject
-                            .getCode());
+            ProjectPE project = findProject(updates.getProjectIdentifier());
 
-            relationshipService.assignExperimentToProject(session, new ExperimentIdentifier(
-                    previousProjectId, experiment.getCode()), updates.getProjectIdentifier());
+            if (previousProject.equals(project))
+            {
+                return;
+            }
+            relationshipService.assignExperimentToProject(session, experiment, project);
+        }
+    }
+
+    private ProjectPE findProject(ProjectIdentifier newProjectIdentifier)
+    {
+        ProjectPE project =
+                getProjectDAO().tryFindProject(newProjectIdentifier.getDatabaseInstanceCode(),
+                        newProjectIdentifier.getSpaceCode(), newProjectIdentifier.getProjectCode());
+        if (project == null)
+        {
+            throw UserFailureException.fromTemplate(ERR_PROJECT_NOT_FOUND, newProjectIdentifier);
         }
+        return project;
     }
 
     private void batchUpdateProperties(ExperimentPE experiment, List<IEntityProperty> properties,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java
index c97b70c8ce80b7fd1e1b03f3dc9159630ecbc32c..ebe32a6eba888ba07b6647105fd23c4823ac362e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ProjectBO.java
@@ -46,9 +46,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.translator.AttachmentTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
@@ -289,15 +287,25 @@ public final class ProjectBO extends AbstractBusinessObject implements IProjectB
         String groupCode = updates.getGroupCode();
         if (groupCode != null && groupCode.equals(project.getSpace().getCode()) == false)
         {
-            ProjectIdentifier projectId = IdentifierHelper.createProjectIdentifier(project);
-            SpaceIdentifier spaceId =
-                    new SpaceIdentifier(project.getSpace().getDatabaseInstance().getCode(),
-                            groupCode);
-            relationshipService.assignProjectToSpace(session, projectId, spaceId);
+
+            relationshipService.assignProjectToSpace(session, project, findGroup(groupCode));
         }
         dataChanged = true;
     }
 
+    private SpacePE findGroup(String groupCode)
+    {
+        SpacePE group =
+                getSpaceDAO().tryFindSpaceByCodeAndDatabaseInstance(groupCode,
+                        project.getSpace().getDatabaseInstance());
+        if (group == null)
+        {
+            throw UserFailureException
+                    .fromTemplate("No space with the name '%s' found!", groupCode);
+        }
+        return group;
+    }
+
     @Override
     public void deleteByTechId(TechId projectId, String reason) throws UserFailureException
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IRelationshipService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IRelationshipService.java
index bdd4ceb9526726364ee026346845d9bdfe3e77e3..086e0241565310d26124abd0566f2b53248480a0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IRelationshipService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IRelationshipService.java
@@ -23,13 +23,18 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.Authoriz
 import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.Capability;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.DataSetCodePredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.ExperimentPEPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.ProjectPEPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SampleOwnerIdentifierPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SpaceIdentifierPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SpacePEPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSession;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 
@@ -46,20 +51,20 @@ public interface IRelationshipService
         { RoleWithHierarchy.SPACE_ETL_SERVER, RoleWithHierarchy.SPACE_POWER_USER })
     @Capability("ASSIGN_EXPERIMENT_TO_PROJECT")
     public void assignExperimentToProject(IAuthSession session,
-            @AuthorizationGuard(guardClass = SpaceIdentifierPredicate.class)
-            ExperimentIdentifier experiment,
-            @AuthorizationGuard(guardClass = SpaceIdentifierPredicate.class)
-            ProjectIdentifier project);
+            @AuthorizationGuard(guardClass = ExperimentPEPredicate.class)
+            ExperimentPE experiment,
+            @AuthorizationGuard(guardClass = ProjectPEPredicate.class)
+            ProjectPE project);
 
     @Transactional(propagation = Propagation.MANDATORY)
     @RolesAllowed(value =
         { RoleWithHierarchy.SPACE_ETL_SERVER, RoleWithHierarchy.SPACE_POWER_USER })
     @Capability("ASSIGN_PROJECT_TO_SPACE")
     public void assignProjectToSpace(IAuthSession session,
-            @AuthorizationGuard(guardClass = SpaceIdentifierPredicate.class)
-            ProjectIdentifier project,
-            @AuthorizationGuard(guardClass = SpaceIdentifierPredicate.class)
-            SpaceIdentifier space);
+            @AuthorizationGuard(guardClass = ProjectPEPredicate.class)
+            ProjectPE project,
+            @AuthorizationGuard(guardClass = SpacePEPredicate.class)
+            SpacePE space);
 
     @Transactional(propagation = Propagation.MANDATORY)
     @RolesAllowed(value =
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/DataPEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/DataPEPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..3a3ff41ce4ee4e5e3b271216f5fa127d95017e23
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/DataPEPredicate.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 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.shared.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author anttil
+ */
+public class DataPEPredicate extends PersistentEntityPredicate<DataPE>
+{
+
+    @Override
+    public SpacePE getSpace(DataPE value)
+    {
+        return value.getExperiment().getProject().getSpace();
+    }
+
+    @Override
+    public DatabaseInstancePE getInstance(DataPE value)
+    {
+        return value.getExperiment().getProject().getSpace().getDatabaseInstance();
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ExperimentPEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ExperimentPEPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..8aebd07d66ab3829fe97c00b291d8355a894de4a
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ExperimentPEPredicate.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 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.shared.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author anttil
+ */
+public class ExperimentPEPredicate extends PersistentEntityPredicate<ExperimentPE>
+{
+
+    @Override
+    public SpacePE getSpace(ExperimentPE value)
+    {
+        return value.getProject().getSpace();
+    }
+
+    @Override
+    public DatabaseInstancePE getInstance(ExperimentPE value)
+    {
+        return value.getProject().getSpace().getDatabaseInstance();
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/PersistentEntityPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/PersistentEntityPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..38e129237b2470ad0f089795d98c4e236532c2e3
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/PersistentEntityPredicate.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2012 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.shared.authorization.predicate;
+
+import java.util.List;
+
+import ch.systemsx.cisd.common.exceptions.Status;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.IAuthorizationDataProvider;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.RoleWithIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleLevel;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * A predicate for persistent entities.
+ * 
+ * @author anttil
+ */
+public abstract class PersistentEntityPredicate<T> implements IPredicate<T>
+{
+
+    @Override
+    public Status evaluate(PersonPE person, List<RoleWithIdentifier> allowedRoles, T valueOrNull)
+            throws UserFailureException
+    {
+        if (valueOrNull == null)
+        {
+            return Status.createError("null value cannot be authorized");
+        }
+
+        for (RoleWithIdentifier allowed : allowedRoles)
+        {
+            if (allowed.getRoleLevel().equals(RoleLevel.INSTANCE))
+            {
+                if (allowed.getAssignedDatabaseInstance().equals(getInstance(valueOrNull)))
+                {
+                    return Status.OK;
+                }
+            } else
+            {
+                if (allowed.getAssignedSpace().equals(getSpace(valueOrNull)))
+                {
+                    return Status.OK;
+                }
+            }
+        }
+        return Status.createError();
+    }
+
+    public abstract SpacePE getSpace(T value);
+
+    public abstract DatabaseInstancePE getInstance(T value);
+
+    @Override
+    public void init(IAuthorizationDataProvider provider)
+    {
+
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ProjectPEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ProjectPEPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..491a48566afdacaee1cbecc6a276ee11c528d3df
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/ProjectPEPredicate.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 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.shared.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author anttil
+ */
+public class ProjectPEPredicate extends PersistentEntityPredicate<ProjectPE>
+{
+
+    @Override
+    public SpacePE getSpace(ProjectPE project)
+    {
+        return project.getSpace();
+    }
+
+    @Override
+    public DatabaseInstancePE getInstance(ProjectPE value)
+    {
+        return value.getSpace().getDatabaseInstance();
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SamplePEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SamplePEPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..d68a0d3a73631af1a884c64e5972cf85df8f7bc3
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SamplePEPredicate.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2012 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.shared.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author anttil
+ */
+public class SamplePEPredicate extends PersistentEntityPredicate<SamplePE>
+{
+
+    @Override
+    public SpacePE getSpace(SamplePE value)
+    {
+        return value.getSpace();
+    }
+
+    @Override
+    public DatabaseInstancePE getInstance(SamplePE value)
+    {
+        return value.getDatabaseInstance();
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SpacePEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SpacePEPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..64fbf5a6fe63e553a630d6992e76144fce674a0e
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/SpacePEPredicate.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2012 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.shared.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
+
+/**
+ * @author anttil
+ */
+public class SpacePEPredicate extends PersistentEntityPredicate<SpacePE>
+{
+    @Override
+    public SpacePE getSpace(SpacePE value)
+    {
+        return value;
+    }
+
+    @Override
+    public DatabaseInstancePE getInstance(SpacePE value)
+    {
+        return value.getDatabaseInstance();
+    }
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignExperimentToProjectTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignExperimentToProjectTest.java
index 2915d98fb3e4446c35797e2c944bdf51b46d764a..d2b40648d1548eaa611cc751a03371aeca7e246b 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignExperimentToProjectTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignExperimentToProjectTest.java
@@ -82,10 +82,17 @@ public class AssignExperimentToProjectTest extends BaseTest
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
-        Experiment experiment = create(anExperiment().inProject(sourceProject));
+        Space unrelatedObserver = create(aSpace());
+        Space unrelatedAdmin = create(aSpace());
+        create(aSpace().withCode("unrelatedWithoutAccess"));
         String user =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
+        Experiment experiment = create(anExperiment().inProject(sourceProject));
 
         perform(anUpdateOf(experiment).toProject(destinationProject).as(user));
     }
@@ -97,10 +104,17 @@ public class AssignExperimentToProjectTest extends BaseTest
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
-        Experiment experiment = create(anExperiment().inProject(sourceProject));
+        Space unrelatedObserver = create(aSpace());
+        Space unrelatedAdmin = create(aSpace());
+        create(aSpace().withCode("unrelatedWithoutAccess"));
         String user =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
+        Experiment experiment = create(anExperiment().inProject(sourceProject));
 
         perform(anUpdateOf(experiment).toProject(destinationProject).as(user));
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignProjectToSpaceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignProjectToSpaceTest.java
index 97814cc5c9389d4dba4118578ac4df33295f59e8..e9894362f81ad44c76431a318e7288b878c1a19a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignProjectToSpaceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignProjectToSpaceTest.java
@@ -77,10 +77,17 @@ public class AssignProjectToSpaceTest extends BaseTest
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
-        Project project = create(aProject().inSpace(sourceSpace));
+        Space unrelatedObserver = create(aSpace());
+        Space unrelatedAdmin = create(aSpace());
+        create(aSpace().withCode("unrelatedWithoutAccess"));
         String user =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
+        Project project = create(aProject().inSpace(sourceSpace));
 
         perform(anUpdateOf(project).toSpace(destinationSpace).as(user));
     }
@@ -92,10 +99,17 @@ public class AssignProjectToSpaceTest extends BaseTest
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
-        Project project = create(aProject().inSpace(sourceSpace));
+        Space unrelatedObserver = create(aSpace());
+        Space unrelatedAdmin = create(aSpace());
+        create(aSpace().withCode("unrelatedWithoutAccess"));
         String user =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
+        Project project = create(aProject().inSpace(sourceSpace));
 
         perform(anUpdateOf(project).toSpace(destinationSpace).as(user));
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
index 5a10c8ac5c96806c47955d24ad139c45459ee9de..ab3b3bfb169c86b588dfe0a723f3956f53ac9a09 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
@@ -33,6 +33,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 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.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.systemtest.base.BaseTest;
 
 /**
@@ -279,7 +282,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
                         destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
 
         relationshipService.assignExperimentToProject(sessionManager.getSession(session),
-                id(sourceExperiment), id(destinationProject));
+                pe(sourceExperiment), pe(destinationProject));
     }
 
     private void assignProjectToSpace(RoleWithHierarchy sourceSpaceRole,
@@ -291,8 +294,8 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
                         destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
 
         relationshipService.assignProjectToSpace(sessionManager.getSession(session),
-                id(sourceProject),
-                id(destinationSpace));
+                pe(sourceProject),
+                pe(destinationSpace));
     }
 
     private void assignSampleToExperiment(RoleWithHierarchy sourceSpaceRole,
@@ -578,6 +581,26 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         allSpaceRoles.add(null);
     }
 
+    private ExperimentPE pe(Experiment experiment)
+    {
+        return daoFactory.getExperimentDAO().tryGetByPermID(experiment.getPermId());
+    }
+
+    private ProjectPE pe(Project project)
+    {
+        return daoFactory.getProjectDAO().tryFindProject(
+                project.getSpace().getInstance().getCode(), project.getSpace().getCode(),
+                project.getCode());
+    }
+
+    private SpacePE pe(Space space)
+    {
+        return daoFactory.getSpaceDAO().tryFindSpaceByCodeAndDatabaseInstance(
+                space.getCode(),
+                daoFactory.getDatabaseInstanceDAO().tryFindDatabaseInstanceByCode(
+                        space.getInstance().getCode()));
+    }
+
     public static RoleWithHierarchy[][] toNestedArray(Collection<List<RoleWithHierarchy>> input)
     {
         RoleWithHierarchy[][] result = new RoleWithHierarchy[input.size()][];
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java
index 85e2bb87a93c47d01686ceb66499b2520b1e6eba..86b1babef44f598506b538ab69509d8fc31314af 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java
@@ -17,10 +17,12 @@
 package ch.systemsx.cisd.openbis.systemtest.base;
 
 import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSession;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 
@@ -31,14 +33,14 @@ public class RelationshipServiceStub implements IRelationshipService
 {
 
     @Override
-    public void assignExperimentToProject(IAuthSession session, ExperimentIdentifier experiment,
-            ProjectIdentifier project)
+    public void assignExperimentToProject(IAuthSession session, ExperimentPE experiment,
+            ProjectPE project)
     {
     }
 
     @Override
-    public void assignProjectToSpace(IAuthSession session, ProjectIdentifier project,
-            SpaceIdentifier space)
+    public void assignProjectToSpace(IAuthSession session, ProjectPE project,
+            SpacePE space)
     {
     }