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 b73fe2a4af9ee544cccd3dffbb5f89c5e79da757..ec45cbbc6f6e8a0ea690cbf9091e920e3eeb307b 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
@@ -20,12 +20,16 @@ import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleUtils;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.DAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService;
+import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
 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.ExperimentPE;
 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.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.RelationshipTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SampleRelationshipPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
@@ -58,6 +62,9 @@ public class RelationshipService implements IRelationshipService
     private static final String ERR_DATASET_NOT_FOUND =
             "Sample '%s' not found";
 
+    private static final String ERR_SAMPLE_PARENT_RELATIONSHIP_NOT_FOUND =
+            "Sample '%s' did not have parent '%s'";
+
     private DAOFactory daoFactory;
 
     @Override
@@ -155,6 +162,40 @@ public class RelationshipService implements IRelationshipService
         data.setSample(sample);
     }
 
+    @Override
+    public void addParentToSample(IAuthSession session, SampleIdentifier sampleId,
+            SampleIdentifier parentId)
+    {
+        PersonPE actor = session.tryGetPerson();
+        RelationshipTypePE relationshipType =
+                daoFactory.getRelationshipTypeDAO().tryFindRelationshipTypeByCode(
+                        BasicConstant.PARENT_CHILD_INTERNAL_RELATIONSHIP);
+
+        SamplePE sample = findSample(sampleId);
+        SamplePE parent = findSample(parentId);
+
+        sample.addParentRelationship(new SampleRelationshipPE(parent, sample, relationshipType,
+                actor));
+    }
+
+    @Override
+    public void removeParentFromSample(IAuthSession session, SampleIdentifier sampleId,
+            SampleIdentifier parentId)
+    {
+        SamplePE sample = findSample(sampleId);
+        SamplePE parent = findSample(parentId);
+        for (SampleRelationshipPE relationship : sample.getParentRelationships())
+        {
+            if (relationship.getParentSample().equals(parent))
+            {
+                sample.removeParentRelationship(relationship);
+                return;
+            }
+        }
+        throw UserFailureException.fromTemplate(ERR_SAMPLE_PARENT_RELATIONSHIP_NOT_FOUND, sampleId,
+                parentId);
+    }
+
     private DataPE findDataSet(String dataSetCode)
     {
         DataPE data = daoFactory.getDataDAO().tryToFindDataSetByCode(dataSetCode);
@@ -248,5 +289,4 @@ public class RelationshipService implements IRelationshipService
     {
         this.daoFactory = daoFactory;
     }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
index 6d04a0e508443d1682bac3ac8ae2145e3e666526..b874d3b41671ba44780897695391c2691b3487f5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
@@ -237,8 +237,6 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi
 
     private void replaceParents(SamplePE child, Set<SamplePE> newParents)
     {
-        PersonPE actor = findPerson();
-
         for (SamplePE parent : newParents)
         {
             checkParentDeletion(parent, child.getSampleIdentifier());
@@ -259,14 +257,28 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi
                 newParents.remove(r.getParentSample());
             } else
             {
-                child.removeParentRelationship(r);
+                relationshipService.removeParentFromSample(session, IdentifierHelper.sample(child),
+                        IdentifierHelper.sample(r.getParentSample()));
             }
         }
-        RelationshipTypePE relationship = tryFindParentChildRelationshipType();
-        for (SamplePE newParent : newParents)
+
+        SampleIdentifier childId = IdentifierHelper.sample(child);
+        if (this.tryToGetSampleByIdentifier(childId) == null) // new sample
+        {
+            PersonPE actor = findPerson();
+            RelationshipTypePE relationship = tryFindParentChildRelationshipType();
+            for (SamplePE newParent : newParents)
+            {
+                child.addParentRelationship(new SampleRelationshipPE(newParent, child,
+                        relationship, actor));
+            }
+        } else
         {
-            child.addParentRelationship(new SampleRelationshipPE(newParent, child, relationship,
-                    actor));
+            for (SamplePE newParent : newParents)
+            {
+                relationshipService.addParentToSample(session, childId,
+                        IdentifierHelper.sample(newParent));
+            }
         }
     }
 
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 a8527fa12b1d61e2d371cbc6aa1965031141cf65..c7cd598c4f56fcff6a1eface66b6702063575560 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
@@ -114,4 +114,22 @@ public interface IRelationshipService
             @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
             SampleIdentifier sample);
 
+    @RolesAllowed(value =
+        { RoleWithHierarchy.SPACE_ETL_SERVER, RoleWithHierarchy.SPACE_POWER_USER })
+    @Capability("ADD_PARENT_TO_SAMPLE")
+    public void addParentToSample(IAuthSession session,
+            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
+            SampleIdentifier sample,
+            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
+            SampleIdentifier parent);
+
+    @RolesAllowed(value =
+        { RoleWithHierarchy.SPACE_ETL_SERVER, RoleWithHierarchy.SPACE_POWER_USER })
+    @Capability("REMOVE_PARENT_FROM_SAMPLE")
+    public void removeParentFromSample(IAuthSession session,
+            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
+            SampleIdentifier sample,
+            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
+            SampleIdentifier parent);
+
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java
index 3f63944999354b42a9dedf936ea731771d965053..ca1d36610e80f23932ada31a5e051117412da5b4 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java
@@ -297,6 +297,10 @@ public final class SampleBOTest extends AbstractBOTest
                             EXAMPLE_GROUP);
                     will(returnValue(container));
 
+                    allowing(sampleDAO).tryFindByCodeAndSpace(with(any(String.class)),
+                            with(any(SpacePE.class)));
+                    will(returnValue(null));
+
                     one(sampleTypeDAO).tryFindSampleTypeByCode(DILUTION_PLATE);
                     will(returnValue(sampleType));
 
@@ -403,6 +407,10 @@ public final class SampleBOTest extends AbstractBOTest
                     allowing(sampleDAO).tryFindByCodeAndSpace(parent.getCode(), EXAMPLE_GROUP);
                     will(returnValue(parent));
 
+                    allowing(sampleDAO).tryFindByCodeAndSpace(with(any(String.class)),
+                            with(any(SpacePE.class)));
+                    will(returnValue(null));
+
                     allowing(dataDAO).hasDataSet(with(sample));
                     will(returnValue(false));
 
@@ -474,6 +482,10 @@ public final class SampleBOTest extends AbstractBOTest
                             EXAMPLE_GROUP2);
                     will(returnValue(parent3Group2));
 
+                    allowing(sampleDAO).tryFindByCodeAndSpace(with(any(String.class)),
+                            with(any(SpacePE.class)));
+                    will(returnValue(null));
+
                     allowing(dataDAO).hasDataSet(with(sample));
                     will(returnValue(false));
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityRelationshipChangeTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityRelationshipChangeTest.java
index 349bc5b7f2320d976740df4329222fca35da7f46..76d5324e19627e638ec42380f0c7244bfab8f2db 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityRelationshipChangeTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityRelationshipChangeTest.java
@@ -20,6 +20,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
@@ -41,19 +42,35 @@ import ch.systemsx.cisd.openbis.systemtest.base.BaseTest;
  * 
  * @author anttil
  */
-@Test(groups = "system test")
+@Test(groups =
+    { "system-cleandb", "basic" })
 public class EntityRelationshipChangeTest extends BaseTest
 {
 
+    private String session;
+
+    private Space space;
+
+    private Space sourceSpace;
+
+    private Space destinationSpace;
+
+    @BeforeClass
+    public void createFixture()
+    {
+        space = create(aSpace());
+        sourceSpace = create(aSpace());
+        destinationSpace = create(aSpace());
+        session = create(aSession().withInstanceRole(RoleCode.ADMIN));
+    }
+
     @Test
     public void dataSetCanBeUpdatedToAnotherExperiment()
     {
-        Space space = create(aSpace());
         Project project = create(aProject().inSpace(space));
         Experiment sourceExperiment = create(anExperiment().inProject(project));
         Experiment destinationExperiment = create(anExperiment().inProject(project));
         DataSet dataset = create(aDataSet().inExperiment(sourceExperiment));
-        String session = create(aSession().withInstanceRole(RoleCode.ADMIN));
         DataSetUpdatesDTO updates =
                 create(anUpdateOf(dataset).withExperiment(destinationExperiment));
 
@@ -65,12 +82,9 @@ public class EntityRelationshipChangeTest extends BaseTest
     @Test
     public void registeringAnExperimentWithExistingSpaceLevelSampleAssociatesTheSampleWithTheExperiment()
     {
-        Space space = create(aSpace());
         Project project = create(aProject().inSpace(space));
         Sample sample = create(aSample().inSpace(space));
 
-        String session = create(aSession().withInstanceRole(RoleCode.ADMIN));
-
         Experiment experiment =
                 create(anExperiment().asUser(session).withCode("the_experiment").inProject(project)
                         .withSamples(sample));
@@ -82,18 +96,13 @@ public class EntityRelationshipChangeTest extends BaseTest
     @Test
     public void updatingSampleToAnotherExperimentUpdatesTheExperimentOfAllDatasetsInSample()
     {
-        Space space = create(aSpace());
         Project project = create(aProject().inSpace(space));
         Experiment sourceExperiment =
                 create(anExperiment().inProject(project).withCode("source_experiment"));
         Experiment destinationExperiment =
                 create(anExperiment().inProject(project).withCode("destination_experiment"));
-
         Sample sample = create(aSample().inExperiment(sourceExperiment));
         ExternalData data = create(aDataSet().inSample(sample));
-
-        String session = create(aSession().withInstanceRole(RoleCode.ADMIN));
-
         SampleUpdatesDTO updates =
                 create(anUpdateOf(serverSays(sample)).inExperiment(destinationExperiment));
 
@@ -106,15 +115,10 @@ public class EntityRelationshipChangeTest extends BaseTest
     @Test
     public void updatingSampleToHaveNoExperimentIsAllowedIfSampleDoesNotHaveDataSets()
     {
-        Space space = create(aSpace());
         Project project = create(aProject().inSpace(space));
         Experiment experiment = create(anExperiment().inProject(project));
         Sample sample = create(aSample().inExperiment(experiment));
-
-        String session = create(aSession().withInstanceRole(RoleCode.ADMIN));
-
-        SampleUpdatesDTO updates =
-                create(anUpdateOf(sample).withoutExperiment());
+        SampleUpdatesDTO updates = create(anUpdateOf(sample).withoutExperiment());
 
         commonServer.updateSample(session, updates);
 
@@ -125,16 +129,11 @@ public class EntityRelationshipChangeTest extends BaseTest
         { UserFailureException.class })
     public void updatingSampleToHaveNoExperimentIsNotAllowedIfSampleHasDataSets()
     {
-        Space space = create(aSpace());
         Project project = create(aProject().inSpace(space));
         Experiment experiment = create(anExperiment().inProject(project));
         Sample sample = create(aSample().inExperiment(experiment));
         create(aDataSet().inSample(sample));
-
-        String session = create(aSession().withInstanceRole(RoleCode.ADMIN));
-
-        SampleUpdatesDTO updates =
-                create(anUpdateOf(serverSays(sample)).withoutExperiment());
+        SampleUpdatesDTO updates = create(anUpdateOf(serverSays(sample)).withoutExperiment());
 
         commonServer.updateSample(session, updates);
     }
@@ -142,15 +141,10 @@ public class EntityRelationshipChangeTest extends BaseTest
     @Test
     public void experimentCanBeUpdatedToContainSpaceSamples()
     {
-        Space space = create(aSpace());
         Project project = create(aProject().inSpace(space));
         Experiment experiment = create(anExperiment().inProject(project));
         Sample sample = create(aSample().inSpace(space));
-
-        String session = create(aSession().withInstanceRole(RoleCode.ADMIN));
-
-        ExperimentUpdatesDTO updates =
-                create(anUpdateOf(experiment).withSamples(sample));
+        ExperimentUpdatesDTO updates = create(anUpdateOf(experiment).withSamples(sample));
 
         commonServer.updateExperiment(session, updates);
 
@@ -160,64 +154,43 @@ public class EntityRelationshipChangeTest extends BaseTest
     @Test
     public void sampleBecomesSpaceSampleIfExperimentUpdateRemovesItFromExperiment()
     {
-        Space space = create(aSpace());
         Project project = create(aProject().inSpace(space));
         Experiment experiment = create(anExperiment().inProject(project));
         Sample sample = create(aSample().inExperiment(experiment));
         Sample anotherSample = create(aSample().inExperiment(experiment));
-
-        String session = create(aSession().withInstanceRole(RoleCode.ADMIN));
-
-        ExperimentUpdatesDTO updates =
-                create(anUpdateOf(experiment).withSamples(sample));
+        ExperimentUpdatesDTO updates = create(anUpdateOf(experiment).withSamples(sample));
 
         commonServer.updateExperiment(session, updates);
 
         assertThat(serverSays(sample), is(inExperiment(experiment)));
         assertThat(serverSays(anotherSample).getExperiment(), is(nullValue()));
-
     }
 
     @Test
     public void experimentsCanBeUpdatedToAnotherProject()
     {
-        Space space = create(aSpace());
-
         Project sourceProject = create(aProject().inSpace(space));
         Project destinationProject = create(aProject().inSpace(space));
-
         Experiment experiment = create(anExperiment().inProject(sourceProject));
-
         ExperimentUpdatesDTO updates =
                 create(anUpdateOf(experiment).withProject(destinationProject));
 
-        String session =
-                create(aSession().withInstanceRole(RoleCode.ADMIN));
-
         commonServer.updateExperiment(session, updates);
+
+        assertThat(serverSays(experiment), is(inProject(destinationProject)));
     }
 
     @Test
     public void updatingExperimentToProjectInAnotherSpaceChangesTheSpaceOfSamplesInThatExperiment()
     {
-        Space sourceSpace = create(aSpace());
-        Space destinationSpace = create(aSpace());
-
         Project sourceProject = create(aProject().withCode("source").inSpace(sourceSpace));
         Project destinationProject =
                 create(aProject().withCode("destination").inSpace(destinationSpace));
-
         Experiment experiment = create(anExperiment().inProject(sourceProject));
-
         Sample sample = create(aSample().inExperiment(experiment));
-
         ExperimentUpdatesDTO updates =
                 create(anUpdateOf(experiment).withProject(destinationProject));
 
-        String session =
-                create(aSession().withSpaceRole(RoleCode.ADMIN, sourceSpace).withSpaceRole(
-                        RoleCode.ADMIN, destinationSpace));
-
         commonServer.updateExperiment(session, updates);
 
         assertThat(serverSays(experiment), is(inProject(destinationProject)));
@@ -227,44 +200,28 @@ public class EntityRelationshipChangeTest extends BaseTest
     @Test
     public void dataSetCanBeUpdatedToAnotherSample()
     {
-        Space space = create(aSpace());
         Project project = create(aProject().inSpace(space));
         Experiment experiment = create(anExperiment().inProject(project));
-
         Sample sourceSample = create(aSample().inExperiment(experiment));
         Sample destinationSample = create(aSample().inExperiment(experiment));
-
         DataSet dataset = create(aDataSet().inSample(sourceSample));
-        String session = create(aSession().withInstanceRole(RoleCode.ADMIN));
-
-        DataSetUpdatesDTO updates =
-                create(anUpdateOf(dataset).withSample(destinationSample));
+        DataSetUpdatesDTO updates = create(anUpdateOf(dataset).withSample(destinationSample));
 
         commonServer.updateDataSet(session, updates);
 
         assertThat(serverSays(dataset), is(inSample(destinationSample)));
-
     }
 
     @Test
     public void updatingProjectToAnotherSpaceChangesSpaceOfAllSamplesOfAllExperimentsInThatProject()
     {
-        Space sourceSpace = create(aSpace());
-        Space destinationSpace = create(aSpace());
         Project project = create(aProject().inSpace(sourceSpace));
-
         Experiment experiment1 = create(anExperiment().inProject(project));
         Experiment experiment2 = create(anExperiment().inProject(project));
-
         Sample sample1 = create(aSample().inExperiment(experiment1));
         Sample sample2 = create(aSample().inExperiment(experiment2));
-
         ProjectUpdatesDTO updates = create(anUpdateOf(project).withSpace(destinationSpace));
 
-        String session =
-                create(aSession().withSpaceRole(RoleCode.ADMIN, sourceSpace).withSpaceRole(
-                        RoleCode.ADMIN, destinationSpace));
-
         commonServer.updateProject(session, updates);
 
         assertThat(serverSays(project), is(inSpace(destinationSpace)));
@@ -275,33 +232,21 @@ public class EntityRelationshipChangeTest extends BaseTest
     @Test
     public void spaceLevelSampleCanBeUpdatedToAnotherSpace()
     {
-        Space sourceSpace = create(aSpace());
-        Space destinationSpace = create(aSpace());
         Sample sample = create(aSample().inSpace(sourceSpace));
-
         SampleUpdatesDTO updates =
                 create(anUpdateOf(sample).inSpace(destinationSpace));
 
-        String session =
-                create(aSession().withInstanceRole(RoleCode.ADMIN));
-
         commonServer.updateSample(session, updates);
 
         assertThat(serverSays(sample), is(inSpace(destinationSpace)));
-
     }
 
     @Test
     public void spaceLevelSampleCanBeUpdatedToSharedSample()
     {
-        Space space = create(aSpace());
         Sample sample = create(aSample().inSpace(space));
-
         SampleUpdatesDTO updates = create(anUpdateOf(sample).withoutSpace());
 
-        String session =
-                create(aSession().withInstanceRole(RoleCode.ADMIN));
-
         commonServer.updateSample(session, updates);
 
         assertThat(serverSays(sample).getSpace(), is(nullValue()));
@@ -311,14 +256,63 @@ public class EntityRelationshipChangeTest extends BaseTest
     public void sharedSampleCanBeUpdatedToSpaceLevelSample()
     {
         Sample sample = create(aSample());
-        Space space = create(aSpace());
         SampleUpdatesDTO updates = create(anUpdateOf(sample).inSpace(space));
 
-        String session =
-                create(aSession().withInstanceRole(RoleCode.ADMIN));
-
         commonServer.updateSample(session, updates);
 
         assertThat(serverSays(sample), is(inSpace(space)));
     }
+
+    @Test
+    public void addParent()
+    {
+        Sample parentToBe = create(aSample().inSpace(space));
+        Sample childToBe = create(aSample().inSpace(space));
+        SampleUpdatesDTO updates = create(anUpdateOf(childToBe).withParent(parentToBe));
+
+        commonServer.updateSample(session, updates);
+
+        assertThat(serverSays(childToBe).getParents(), containsExactly(parentToBe));
+    }
+
+    @Test
+    public void changeParentOfSample()
+    {
+        Sample currentParent = create(aSample().inSpace(space));
+        Sample child = create(aSample().inSpace(space).withParent(currentParent));
+        Sample newParent = create(aSample().inSpace(space));
+        SampleUpdatesDTO updates = create(anUpdateOf(child).withParent(newParent));
+
+        commonServer.updateSample(session, updates);
+
+        assertThat(serverSays(child).getParents(), containsExactly(newParent));
+    }
+
+    @Test
+    public void removeParentOfSample()
+    {
+        Sample parent1 = create(aSample().inSpace(space));
+        Sample parent2 = create(aSample().inSpace(space));
+
+        Sample child = create(aSample().inSpace(space).withParents(parent1, parent2));
+        SampleUpdatesDTO updates = create(anUpdateOf(child).withParent(parent1));
+
+        commonServer.updateSample(session, updates);
+
+        assertThat(serverSays(child).getParents(), containsExactly(parent1));
+    }
+
+    @Test
+    public void duplicateParents()
+    {
+        Sample parent1 = create(aSample().inSpace(space));
+        Sample parent2 = create(aSample().inSpace(space));
+        Sample child = create(aSample().inSpace(space));
+        SampleUpdatesDTO updates = create(anUpdateOf(child).withParents(parent1, parent2, parent1));
+
+        commonServer.updateSample(session, updates);
+
+        assertThat(serverSays(child).getParents(), containsExactly(parent1, parent2));
+    }
+
 }
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 23706b8de28d0fcc42f7703f7622cb6c39524019..d2bb61f639d9798fb4221cd90cea613acf56d328 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
@@ -21,37 +21,68 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
-import ch.systemsx.cisd.authentication.ISessionManager;
 import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException;
-import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
 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.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.Session;
 import ch.systemsx.cisd.openbis.systemtest.base.BaseTest;
 
 /**
  * @author anttil
  */
-@Test(enabled = false, groups = "system test")
+@Test(groups =
+    { "system-cleandb", "stub-relationship-service" })
+@ContextConfiguration(locations =
+    { "classpath:stub_relationship_service.xml" }, inheritLocations = true)
 public class RelationshipServiceAuthorizationTest extends BaseTest
 {
 
-    @DataProvider(name = "rolesAllowedToAssignExperimentToProject")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignExperimentToProject()
+    private Space sourceSpace;
+
+    private Space destinationSpace;
+
+    private Project sourceProject;
+
+    private Project destinationProject;
+
+    private Experiment sourceExperiment;
+
+    private Experiment destinationExperiment;
+
+    private Sample sourceSample;
+
+    private Sample destinationSample;
+
+    private Sample sharedSample;
+
+    private DataSet dataSet;
+
+    @BeforeClass
+    public void createFixture()
     {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        sourceSpace = create(aSpace());
+        sourceProject = create(aProject().inSpace(sourceSpace));
+        sourceExperiment = create(anExperiment().inProject(sourceProject));
+        sourceSample = create(aSample().inExperiment(sourceExperiment));
+        dataSet = create(aDataSet().inSample(sourceSample));
+
+        destinationSpace = create(aSpace());
+        destinationProject = create(aProject().inSpace(destinationSpace));
+        destinationExperiment = create(anExperiment().inProject(destinationProject));
+        destinationSample = create(aSample().inExperiment(destinationExperiment));
+
+        sharedSample = create(aSample());
     }
 
-    @Test(enabled = false, dataProvider = "rolesAllowedToAssignExperimentToProject")
+    @Test(dataProvider = "rolesAllowedToAssignExperimentToProject")
     public void assigningExperimentToProjectIsAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
@@ -59,14 +90,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignExperimentToProject(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesNotAllowedToAssignExperimentToProject")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignExperimentToProject()
-    {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesNotAllowedToAssignExperimentToProject", expectedExceptions =
+    @Test(dataProvider = "rolesNotAllowedToAssignExperimentToProject", expectedExceptions =
         { AuthorizationFailureException.class })
     public void assigningExperimentToProjectIsNotAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
@@ -75,14 +99,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignExperimentToProject(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesAllowedToAssignProjectToSpace")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignProjectToSpace()
-    {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesAllowedToAssignProjectToSpace")
+    @Test(dataProvider = "rolesAllowedToAssignProjectToSpace")
     public void assigningProjectToSpaceIsAuthorizedFor(
             RoleWithHierarchy sourceSpaceRole, RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
@@ -90,14 +107,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignProjectToSpace(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesNotAllowedToAssignProjectToSpace")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignProjectToSpace()
-    {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesNotAllowedToAssignProjectToSpace", expectedExceptions =
+    @Test(dataProvider = "rolesNotAllowedToAssignProjectToSpace", expectedExceptions =
         { AuthorizationFailureException.class })
     public void assignProjectToSpaceIsNotAuthorizedFor(
             RoleWithHierarchy sourceSpaceRole, RoleWithHierarchy destinationSpaceRole,
@@ -106,14 +116,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignProjectToSpace(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesAllowedToAssignSampleToExperiment")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignSampleToExperiment()
-    {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesAllowedToAssignSampleToExperiment")
+    @Test(dataProvider = "rolesAllowedToAssignSampleToExperiment")
     public void assigningSampleToExperimentIsAuthorizedFor(
             RoleWithHierarchy sourceSpaceRole, RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
@@ -121,14 +124,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignSampleToExperiment(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesNotAllowedToAssignSampleToExperiment")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignSampleToExperiment()
-    {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesNotAllowedToAssignSampleToExperiment", expectedExceptions =
+    @Test(dataProvider = "rolesNotAllowedToAssignSampleToExperiment", expectedExceptions =
         { AuthorizationFailureException.class })
     public void assignSampleToExperimentIsNotAuthorizedFor(
             RoleWithHierarchy sourceSpaceRole, RoleWithHierarchy destinationSpaceRole,
@@ -137,14 +133,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignSampleToExperiment(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesAllowedToUnassignSampleFromExperiment")
-    public static RoleWithHierarchy[][] rolesAllowedToUnassignSampleFromExperiment()
-    {
-        return toNestedArray(acceptedRoles(1, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesAllowedToUnassignSampleFromExperiment")
+    @Test(dataProvider = "rolesAllowedToUnassignSampleFromExperiment")
     public void unassigningSampleFromExperimentIsAuthorizedFor(
             RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole)
@@ -152,14 +141,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         unassignSampleFromExperiment(spaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesNotAllowedToUnassignSampleFromExperiment")
-    public static RoleWithHierarchy[][] rolesNotAllowedToUnassignSampleFromExperiment()
-    {
-        return toNestedArray(rejectedRoles(1, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesNotAllowedToUnassignSampleFromExperiment", expectedExceptions =
+    @Test(dataProvider = "rolesNotAllowedToUnassignSampleFromExperiment", expectedExceptions =
         { AuthorizationFailureException.class })
     public void unassigningSampleFromExperimentIsNotAuthorizedFor(
             RoleWithHierarchy spaceRole,
@@ -168,28 +150,14 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         unassignSampleFromExperiment(spaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesAllowedToUnshareSample")
-    public static RoleWithHierarchy[][] rolesAllowedToUnshareSample()
-    {
-        return toNestedArray(acceptedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
-                RoleWithHierarchy.INSTANCE_ADMIN));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesAllowedToUnshareSample")
+    @Test(dataProvider = "rolesAllowedToUnshareSample")
     public void unsharingSampleIsAuthorizedFor(RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole)
     {
         unshareSample(spaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesNotAllowedToUnshareSample")
-    public static RoleWithHierarchy[][] rolesNotAllowedToUnshareSample()
-    {
-        return toNestedArray(rejectedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
-                RoleWithHierarchy.INSTANCE_ADMIN));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesNotAllowedToUnshareSample", expectedExceptions =
+    @Test(dataProvider = "rolesNotAllowedToUnshareSample", expectedExceptions =
         { AuthorizationFailureException.class })
     public void unsharingSampleIsNotAuthorizedFor(RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole)
@@ -197,14 +165,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         unshareSample(spaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesAllowedToAssignSampleToSpace")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignSampleToSpace()
-    {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesAllowedToAssignSampleToSpace")
+    @Test(dataProvider = "rolesAllowedToAssignSampleToSpace")
     public void assigningSampleToSpaceIsAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
@@ -212,14 +173,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignSampleToSpace(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesNotAllowedToAssignSampleToSpace")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignSampleToSpace()
-    {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesNotAllowedToAssignSampleToSpace", expectedExceptions =
+    @Test(dataProvider = "rolesNotAllowedToAssignSampleToSpace", expectedExceptions =
         { AuthorizationFailureException.class })
     public void assigningSampleToSpaceIsNotAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
@@ -228,28 +182,14 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignSampleToSpace(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesAllowedToShareSample")
-    public static RoleWithHierarchy[][] rolesAllowedToShareSample()
-    {
-        return toNestedArray(acceptedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
-                RoleWithHierarchy.INSTANCE_ADMIN));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesAllowedToshareSample")
+    @Test(dataProvider = "rolesAllowedToShareSample")
     public void sharingSampleIsAuthorizedFor(RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole)
     {
         shareSample(spaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesNotAllowedToShareSample")
-    public static RoleWithHierarchy[][] rolesNotAllowedToShareSample()
-    {
-        return toNestedArray(rejectedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
-                RoleWithHierarchy.INSTANCE_ADMIN));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesNotAllowedToShareSample", expectedExceptions =
+    @Test(dataProvider = "rolesNotAllowedToShareSample", expectedExceptions =
         { AuthorizationFailureException.class })
     public void sharingSampleIsNotAuthorizedFor(RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole)
@@ -257,14 +197,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         shareSample(spaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesAllowedToAssignDataSetToExperiment")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignDataSetToExperiment()
-    {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesAllowedToAssignDataSetToExperiment")
+    @Test(dataProvider = "rolesAllowedToAssignDataSetToExperiment")
     public void assigningDataSetToExperimentIsAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
@@ -272,14 +205,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignDataSetToExperiment(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesNotAllowedToAssignDataSetToExperiment")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignDataSetToExperiment()
-    {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesNotAllowedToAssignDataSetToExperiment", expectedExceptions =
+    @Test(dataProvider = "rolesNotAllowedToAssignDataSetToExperiment", expectedExceptions =
         { AuthorizationFailureException.class })
     public void assigningDataSetToExperimentIsNotAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
@@ -288,14 +214,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignDataSetToExperiment(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesAllowedToAssignDataSetToSample")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignDataSetToSample()
-    {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesAllowedToAssignDataSetToSample")
+    @Test(dataProvider = "rolesAllowedToAssignDataSetToSample")
     public void assigningDataSetToSampleIsAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
@@ -303,14 +222,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         assignDataSetToSample(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    @DataProvider(name = "rolesNotAllowedToAssignDataSetToSample")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignDataSetToSample()
-    {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
-    }
-
-    @Test(enabled = false, dataProvider = "rolesNotAllowedToAssignDataSetToExperiment", expectedExceptions =
+    @Test(dataProvider = "rolesNotAllowedToAssignDataSetToExperiment", expectedExceptions =
         { AuthorizationFailureException.class })
     public void assigningDataSetToSampleIsNotAuthorizedFor(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
@@ -323,32 +235,24 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
     {
-        Space sourceSpace = create(aSpace());
-        Space destinationSpace = create(aSpace());
-        Project sourceProject = create(aProject().inSpace(sourceSpace));
-        Project destinationProject = create(aProject().inSpace(destinationSpace));
-        Experiment experiment = create(anExperiment().inProject(sourceProject));
-
         String session =
                 create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
                         destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
 
         relationshipService.assignExperimentToProject(sessionManager.getSession(session),
-                id(experiment), id(destinationProject));
+                id(sourceExperiment), id(destinationProject));
     }
 
     private void assignProjectToSpace(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
     {
-        Space sourceSpace = create(aSpace());
-        Space destinationSpace = create(aSpace());
-        Project project = create(aProject().inSpace(sourceSpace));
         String session =
                 create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
                         destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
 
-        relationshipService.assignProjectToSpace(sessionManager.getSession(session), id(project),
+        relationshipService.assignProjectToSpace(sessionManager.getSession(session),
+                id(sourceProject),
                 id(destinationSpace));
     }
 
@@ -356,88 +260,62 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
     {
-        Space sourceSpace = create(aSpace());
-        Space destinationSpace = create(aSpace());
-        Project sourceProject = create(aProject().inSpace(sourceSpace));
-        Project destinationProject = create(aProject().inSpace(destinationSpace));
-        Experiment sourceExperiment = create(anExperiment().inProject(sourceProject));
-        Experiment destinationExperiment = create(anExperiment().inProject(destinationProject));
-        Sample sample = create(aSample().inExperiment(sourceExperiment));
-
         String session =
                 create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
                         destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
 
         relationshipService.assignSampleToExperiment(sessionManager.getSession(session),
-                id(sample),
+                id(sourceSample),
                 id(destinationExperiment));
     }
 
     private void unassignSampleFromExperiment(RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole)
     {
-        Space space = create(aSpace());
-        Project project = create(aProject().inSpace(space));
-        Experiment experiment = create(anExperiment().inProject(project));
-        Sample sample = create(aSample().inExperiment(experiment));
-
         String session =
-                create(aSession().withSpaceRole(spaceRole, space).withInstanceRole(instanceRole));
+                create(aSession().withSpaceRole(spaceRole, sourceSpace).withInstanceRole(
+                        instanceRole));
 
         relationshipService.unassignSampleFromExperiment(sessionManager.getSession(session),
-                id(sample));
+                id(sourceSample));
     }
 
     private void unshareSample(RoleWithHierarchy spaceRole, RoleWithHierarchy instanceRole)
     {
-        Sample sample = create(aSample());
-        Space space = create(aSpace());
         String session =
-                create(aSession().withSpaceRole(spaceRole, space).withInstanceRole(instanceRole));
+                create(aSession().withSpaceRole(spaceRole, destinationSpace).withInstanceRole(
+                        instanceRole));
         relationshipService
-                .unshareSample(sessionManager.getSession(session), id(sample), id(space));
+                .unshareSample(sessionManager.getSession(session), id(sharedSample),
+                        id(destinationSpace));
     }
 
     private void assignSampleToSpace(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
     {
-        Space sourceSpace = create(aSpace());
-        Space destinationSpace = create(aSpace());
-        Sample sample = create(aSample().inSpace(sourceSpace));
 
         String session =
                 create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
                         destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
 
         relationshipService.assignSampleToSpace(sessionManager.getSession(session),
-                id(sample),
+                id(sourceSample),
                 id(destinationSpace));
     }
 
     private void shareSample(RoleWithHierarchy spaceRole, RoleWithHierarchy instanceRole)
     {
-        Space space = create(aSpace());
-        Sample sample = create(aSample().inSpace(space));
         String session =
-                create(aSession().withSpaceRole(spaceRole, space).withInstanceRole(instanceRole));
-        relationshipService.shareSample(sessionManager.getSession(session), id(sample));
+                create(aSession().withSpaceRole(spaceRole, sourceSpace).withInstanceRole(
+                        instanceRole));
+        relationshipService.shareSample(sessionManager.getSession(session), id(sourceSample));
     }
 
     private void assignDataSetToExperiment(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
     {
-        Space sourceSpace = create(aSpace());
-        Project sourceProject = create(aProject().inSpace(sourceSpace));
-        Experiment sourceExperiment = create(anExperiment().inProject(sourceProject));
-
-        Space destinationSpace = create(aSpace());
-        Project destinationProject = create(aProject().inSpace(destinationSpace));
-        Experiment destinationExperiment = create(anExperiment().inProject(destinationProject));
-
-        DataSet dataSet = create(aDataSet().inExperiment(sourceExperiment));
-
         String session =
                 create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
                         destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
@@ -451,17 +329,6 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole)
     {
-        Space sourceSpace = create(aSpace());
-        Project sourceProject = create(aProject().inSpace(sourceSpace));
-        Experiment sourceExperiment = create(anExperiment().inProject(sourceProject));
-        Sample sourceSample = create(aSample().inExperiment(sourceExperiment));
-
-        Space destinationSpace = create(aSpace());
-        Project destinationProject = create(aProject().inSpace(destinationSpace));
-        Experiment destinationExperiment = create(anExperiment().inProject(destinationProject));
-        Sample destinationSample = create(aSample().inExperiment(destinationExperiment));
-
-        DataSet dataSet = create(aDataSet().inSample(sourceSample));
 
         String session =
                 create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
@@ -472,22 +339,130 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
                 id(destinationSample));
     }
 
-    private IRelationshipService relationshipService;
+    @DataProvider(name = "rolesAllowedToAssignExperimentToProject")
+    public static RoleWithHierarchy[][] rolesAllowedToAssignExperimentToProject()
+    {
+        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesNotAllowedToAssignExperimentToProject")
+    public static RoleWithHierarchy[][] rolesNotAllowedToAssignExperimentToProject()
+    {
+        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesAllowedToAssignProjectToSpace")
+    public static RoleWithHierarchy[][] rolesAllowedToAssignProjectToSpace()
+    {
+        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesNotAllowedToAssignProjectToSpace")
+    public static RoleWithHierarchy[][] rolesNotAllowedToAssignProjectToSpace()
+    {
+        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesAllowedToAssignSampleToExperiment")
+    public static RoleWithHierarchy[][] rolesAllowedToAssignSampleToExperiment()
+    {
+        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesNotAllowedToAssignSampleToExperiment")
+    public static RoleWithHierarchy[][] rolesNotAllowedToAssignSampleToExperiment()
+    {
+        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesAllowedToUnassignSampleFromExperiment")
+    public static RoleWithHierarchy[][] rolesAllowedToUnassignSampleFromExperiment()
+    {
+        return toNestedArray(acceptedRoles(1, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesNotAllowedToUnassignSampleFromExperiment")
+    public static RoleWithHierarchy[][] rolesNotAllowedToUnassignSampleFromExperiment()
+    {
+        return toNestedArray(rejectedRoles(1, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesAllowedToUnshareSample")
+    public static RoleWithHierarchy[][] rolesAllowedToUnshareSample()
+    {
+        return toNestedArray(acceptedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
+                RoleWithHierarchy.INSTANCE_ADMIN));
+    }
 
-    @Autowired
-    @Test(enabled = false)
-    public void setRelationshipService(final IRelationshipService relationshipService)
+    @DataProvider(name = "rolesNotAllowedToUnshareSample")
+    public static RoleWithHierarchy[][] rolesNotAllowedToUnshareSample()
     {
-        this.relationshipService = relationshipService;
+        return toNestedArray(rejectedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
+                RoleWithHierarchy.INSTANCE_ADMIN));
     }
 
-    ISessionManager<Session> sessionManager;
+    @DataProvider(name = "rolesAllowedToAssignSampleToSpace")
+    public static RoleWithHierarchy[][] rolesAllowedToAssignSampleToSpace()
+    {
+        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesNotAllowedToAssignSampleToSpace")
+    public static RoleWithHierarchy[][] rolesNotAllowedToAssignSampleToSpace()
+    {
+        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
 
-    @Autowired
-    @Test(enabled = false)
-    public void setSessionManager(final ISessionManager<Session> sessionManager)
+    @DataProvider(name = "rolesAllowedToShareSample")
+    public static RoleWithHierarchy[][] rolesAllowedToShareSample()
     {
-        this.sessionManager = sessionManager;
+        return toNestedArray(acceptedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
+                RoleWithHierarchy.INSTANCE_ADMIN));
+    }
+
+    @DataProvider(name = "rolesNotAllowedToShareSample")
+    public static RoleWithHierarchy[][] rolesNotAllowedToShareSample()
+    {
+        return toNestedArray(rejectedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
+                RoleWithHierarchy.INSTANCE_ADMIN));
+    }
+
+    @DataProvider(name = "rolesAllowedToAssignDataSetToExperiment")
+    public static RoleWithHierarchy[][] rolesAllowedToAssignDataSetToExperiment()
+    {
+        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesNotAllowedToAssignDataSetToExperiment")
+    public static RoleWithHierarchy[][] rolesNotAllowedToAssignDataSetToExperiment()
+    {
+        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesAllowedToAssignDataSetToSample")
+    public static RoleWithHierarchy[][] rolesAllowedToAssignDataSetToSample()
+    {
+        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
+    }
+
+    @DataProvider(name = "rolesNotAllowedToAssignDataSetToSample")
+    public static RoleWithHierarchy[][] rolesNotAllowedToAssignDataSetToSample()
+    {
+        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
+                RoleWithHierarchy.SPACE_POWER_USER));
     }
 
     public static Collection<RoleWithHierarchy> allInstanceRoles = new HashSet<RoleWithHierarchy>();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java
index dd067a78bc1e5f4605f88c4734730efae99eefb3..f69d534ecd7dad57d835dbfc4d2cc5730c38730a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java
@@ -16,8 +16,28 @@
 
 package ch.systemsx.cisd.openbis.systemtest.base;
 
+import java.util.Collection;
+
 import org.hamcrest.Matcher;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.support.GenericApplicationContext;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
+import org.springframework.test.context.transaction.TransactionConfiguration;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeTest;
 
+import ch.systemsx.cisd.authentication.ISessionManager;
+import ch.systemsx.cisd.common.logging.LogInitializer;
+import ch.systemsx.cisd.common.servlet.SpringRequestContextProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientService;
+import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IndexMode;
+import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService;
+import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
@@ -27,19 +47,158 @@ 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.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
 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;
-import ch.systemsx.cisd.openbis.systemtest.SystemTestCase;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientService;
+import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
 
 /**
  * @author anttil
  */
-public abstract class BaseTest extends SystemTestCase
+@ContextConfiguration(locations = "classpath:applicationContext.xml")
+@TransactionConfiguration(transactionManager = "transaction-manager")
+public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextTests
 {
 
+    protected ICommonServerForInternalUse commonServer;
+
+    protected IGenericServer genericServer;
+
+    protected ICommonClientService commonClientService;
+
+    protected IGenericClientService genericClientService;
+
+    protected IETLLIMSService etlService;
+
+    protected MockHttpServletRequest request;
+
+    protected IDAOFactory daoFactory;
+
+    protected IRelationshipService relationshipService;
+
+    protected ISessionManager<Session> sessionManager;
+
+    protected String systemSessionToken;
+
+    @BeforeTest(groups =
+        { "system-cleandb" })
+    public void initializeLog()
+    {
+        LogInitializer.init();
+    }
+
+    @BeforeTest(groups =
+        { "system-cleandb" }, dependsOnMethods =
+        { "initializeLog" })
+    public void initializeProperties()
+    {
+        System.setProperty("database.create-from-scratch", "true");
+        System.setProperty("database.kind", "test");
+        System.setProperty("script-folder", "../openbis/source");
+        System.setProperty("hibernate.search.index-mode", IndexMode.INDEX_FROM_SCRATCH.name());
+        System.setProperty("hibernate.search.index-base", "../openbis/targets/lucene/cleandb");
+        System.setProperty("hibernate.search.worker.execution", "sync");
+    }
+
+    @BeforeTest(groups =
+        { "system-cleandb" }, dependsOnMethods =
+        { "initializeProperties" })
+    public void setContext() throws Exception
+    {
+        super.springTestContextPrepareTestInstance();
+    }
+
+    @BeforeTest(groups =
+        { "system-cleandb" }, dependsOnMethods =
+        { "setContext" })
+    public void createDataStore()
+    {
+        DataStorePE dataStore = new DataStorePE();
+        dataStore.setCode("STANDARD");
+        dataStore.setDatabaseInstance(this.daoFactory.getDatabaseInstanceDAO()
+                .getDatabaseInstanceById(1));
+        dataStore.setDownloadUrl("http://localhost");
+        dataStore.setRemoteUrl("http://remotehost");
+        dataStore.setSessionToken("");
+
+        this.daoFactory.getDataStoreDAO().createOrUpdateDataStore(dataStore);
+    }
+
+    @AfterTest(groups =
+        { "system-cleandb" })
+    public void testingThis()
+    {
+        System.out.println("!!!!!!!! AFTER TEST RUN - DESTROYING!!!");
+        ((GenericApplicationContext) applicationContext).destroy();
+    }
+
+    @BeforeClass(alwaysRun = true)
+    public void loginAsSystem()
+    {
+        systemSessionToken = commonServer.tryToAuthenticateAsSystem().getSessionToken();
+    }
+
+    @Autowired
+    public final void setRequestContextProvider(final SpringRequestContextProvider contextProvider)
+    {
+        request = new MockHttpServletRequest();
+        contextProvider.setRequest(request);
+    }
+
+    @Autowired
+    public void setDaoFactory(IDAOFactory daoFactory)
+    {
+        this.daoFactory = daoFactory;
+    }
+
+    @Autowired
+    public final void setCommonServer(final ICommonServerForInternalUse commonServer)
+    {
+        this.commonServer = commonServer;
+    }
+
+    @Autowired
+    public final void setGenericServer(final IGenericServer genericServer)
+    {
+        this.genericServer = genericServer;
+    }
+
+    @Autowired
+    public final void setCommonClientService(final ICommonClientService commonClientService)
+    {
+        this.commonClientService = commonClientService;
+    }
+
+    @Autowired
+    public final void setGenericClientService(final IGenericClientService genericClientService)
+    {
+        this.genericClientService = genericClientService;
+    }
+
+    @Autowired
+    public void setETLService(IETLLIMSService etlService)
+    {
+        this.etlService = etlService;
+
+    }
+
+    @Autowired
+    public void setRelationshipService(final IRelationshipService relationshipService)
+    {
+        this.relationshipService = relationshipService;
+    }
+
+    @Autowired
+    public void setSessionManager(final ISessionManager<Session> sessionManager)
+    {
+        this.sessionManager = sessionManager;
+    }
+
     protected static <T> T create(Builder<T> builder)
     {
         return builder.create();
@@ -115,6 +274,11 @@ public abstract class BaseTest extends SystemTestCase
         return new InSampleMatcher(sample);
     }
 
+    protected <T> Matcher<Collection<T>> containsExactly(T... elements)
+    {
+        return new CollectionContainsExactlyMatcher<T>(elements);
+    }
+
     protected Experiment serverSays(Experiment experiment)
     {
         return commonServer.getExperimentInfo(systemSessionToken, new TechId(experiment.getId()));
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/CollectionContainsExactlyMatcher.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/CollectionContainsExactlyMatcher.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7162d01ed1be98d5bb8c4d52c15ef180aef2c00
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/CollectionContainsExactlyMatcher.java
@@ -0,0 +1,55 @@
+/*
+ * 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.systemtest.base;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import org.hamcrest.Description;
+import org.hamcrest.TypeSafeMatcher;
+
+public class CollectionContainsExactlyMatcher<T> extends TypeSafeMatcher<Collection<T>>
+{
+
+    private Collection<T> expected;
+
+    public CollectionContainsExactlyMatcher(T... elements)
+    {
+        expected = new HashSet<T>();
+        for (T t : elements)
+        {
+            expected.add(t);
+        }
+    }
+
+    @Override
+    public void describeTo(Description description)
+    {
+        description.appendText("A collection containing exactly these elements: " + expected);
+    }
+
+    @Override
+    public boolean matchesSafely(Collection<T> actual)
+    {
+        if (actual == null)
+        {
+            return false;
+        }
+        return actual.size() == expected.size() && actual.containsAll(expected);
+    }
+
+}
\ No newline at end of file
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/DataSetBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/DataSetBuilder.java
index c8ba9bf0d4fb3443f9389d4e3f296d2ffdf79165..41ddf365212be7b544d47ad4a6b7b494f0f166c4 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/DataSetBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/DataSetBuilder.java
@@ -83,7 +83,7 @@ public class DataSetBuilder extends Builder<DataSet>
         data.setFileFormatType(new FileFormatType(FileFormatType.DEFAULT_FILE_FORMAT_TYPE_CODE));
         data.setSampleIdentifierOrNull(this.sampleIdentifier);
         data.setLocatorType(new LocatorType(LocatorType.DEFAULT_LOCATOR_TYPE_CODE));
-        data.setLocation("location");
+        data.setLocation(UUID.randomUUID().toString());
         data.setStorageFormat(StorageFormat.PROPRIETARY);
         data.setDataStoreCode("STANDARD");
         data.setExperimentIdentifierOrNull(this.experimentIdentifier);
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
new file mode 100644
index 0000000000000000000000000000000000000000..fbe3f369e9d3196e5c48cabbcf77decaf8db45ec
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/RelationshipServiceStub.java
@@ -0,0 +1,99 @@
+/*
+ * 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.systemtest.base;
+
+import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSession;
+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;
+
+/**
+ * @author anttil
+ */
+public class RelationshipServiceStub implements IRelationshipService
+{
+
+    @Override
+    public void assignExperimentToProject(IAuthSession session, ExperimentIdentifier experiment,
+            ProjectIdentifier project)
+    {
+    }
+
+    @Override
+    public void assignProjectToSpace(IAuthSession session, ProjectIdentifier project,
+            SpaceIdentifier space)
+    {
+    }
+
+    @Override
+    public void assignSampleToExperiment(IAuthSession session, SampleIdentifier sample,
+            ExperimentIdentifier experiment)
+    {
+    }
+
+    @Override
+    public void unassignSampleFromExperiment(IAuthSession session, SampleIdentifier sample)
+    {
+    }
+
+    @Override
+    public void unshareSample(IAuthSession session, SampleIdentifier sample, SpaceIdentifier space)
+    {
+    }
+
+    @Override
+    public void assignSampleToSpace(IAuthSession session, SampleIdentifier sample,
+            SpaceIdentifier space)
+    {
+    }
+
+    @Override
+    public void shareSample(IAuthSession session, SampleIdentifier sample)
+    {
+    }
+
+    @Override
+    public void assignDataSetToExperiment(IAuthSession session, String dataSetCode,
+            ExperimentIdentifier experiment)
+    {
+    }
+
+    @Override
+    public void assignDataSetToSample(IAuthSession session, String dataSetCode,
+            SampleIdentifier sample)
+    {
+    }
+
+    @Override
+    public void addParentToSample(IAuthSession session, SampleIdentifier sample,
+            SampleIdentifier parent)
+    {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void removeParentFromSample(IAuthSession session, SampleIdentifier sample,
+            SampleIdentifier parent)
+    {
+        // TODO Auto-generated method stub
+
+    }
+
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleBuilder.java
index bdfb31a806bb72cf92fe4c4d6b1c822e6d6938bc..321f7cf96234c205760c39087c506b7be77f3feb 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleBuilder.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.systemtest.base;
 
 import java.util.ArrayList;
+import java.util.List;
 import java.util.UUID;
 
 import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
@@ -36,16 +37,18 @@ import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
 
 public class SampleBuilder extends Builder<Sample>
 {
+    private Experiment experiment;
+
+    private Space space;
+
+    private List<Sample> parents;
 
     public SampleBuilder(ICommonServerForInternalUse commonServer, IGenericServer genericServer)
     {
         super(commonServer, genericServer);
+        this.parents = new ArrayList<Sample>();
     }
 
-    private Experiment experiment;
-
-    private Space space;
-
     @SuppressWarnings("hiding")
     public SampleBuilder inExperiment(Experiment experiment)
     {
@@ -60,6 +63,20 @@ public class SampleBuilder extends Builder<Sample>
         return this;
     }
 
+    public SampleBuilder withParent(Sample parent)
+    {
+        return this.withParents(parent);
+    }
+
+    public SampleBuilder withParents(Sample... samples)
+    {
+        for (Sample parent : samples)
+        {
+            this.parents.add(parent);
+        }
+        return this;
+    }
+
     @Override
     public Sample create()
     {
@@ -106,7 +123,15 @@ public class SampleBuilder extends Builder<Sample>
             data.setExperimentIdentifier(this.experiment.getIdentifier());
         }
 
-        data.setParentsOrNull(null);
+        String[] parentIds = new String[this.parents.size()];
+        int i = 0;
+        for (Sample s : this.parents)
+        {
+            parentIds[i] = s.getIdentifier();
+            i++;
+        }
+
+        data.setParentsOrNull(parentIds);
         data.setProperties(new IEntityProperty[0]);
         data.setSampleType(sampleType);
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleUpdateBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleUpdateBuilder.java
index 05a702306440036c883efb0181f30c459c638826..2b50827456ab0bed0c13ed3b17081a784e28bfee 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleUpdateBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/SampleUpdateBuilder.java
@@ -20,6 +20,7 @@ import static ch.systemsx.cisd.openbis.systemtest.base.BaseTest.id;
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -47,6 +48,8 @@ public class SampleUpdateBuilder extends Builder<SampleUpdatesDTO>
 
     private SampleIdentifier sampleIdentifier;
 
+    private List<Sample> parents;
+
     public SampleUpdateBuilder(ICommonServerForInternalUse commonServer,
             IGenericServer genericServer, Sample sample)
     {
@@ -59,6 +62,7 @@ public class SampleUpdateBuilder extends Builder<SampleUpdatesDTO>
         }
         this.version = sample.getModificationDate();
         this.sampleIdentifier = id(sample);
+        this.parents = new ArrayList<Sample>();
     }
 
     public SampleUpdateBuilder inExperiment(Experiment experiment)
@@ -91,6 +95,20 @@ public class SampleUpdateBuilder extends Builder<SampleUpdatesDTO>
         return this;
     }
 
+    public SampleUpdateBuilder withParent(Sample sample)
+    {
+        return this.withParents(sample);
+    }
+
+    public SampleUpdateBuilder withParents(Sample... samples)
+    {
+        for (Sample parent : samples)
+        {
+            this.parents.add(parent);
+        }
+        return this;
+    }
+
     /*
      *     public SampleUpdatesDTO(TechId sampleId, List<IEntityProperty> properties,
             ExperimentIdentifier experimentIdentifierOrNull, Collection<NewAttachment> attachments,
@@ -101,8 +119,13 @@ public class SampleUpdateBuilder extends Builder<SampleUpdatesDTO>
     @Override
     public SampleUpdatesDTO create()
     {
+        String[] parentCodes = new String[this.parents.size()];
+        for (int i = 0; i < this.parents.size(); i++)
+        {
+            parentCodes[i] = this.parents.get(i).getCode();
+        }
         return new SampleUpdatesDTO(this.sampleId, new ArrayList<IEntityProperty>(),
                 this.experimentId, new ArrayList<NewAttachment>(), this.version,
-                this.sampleIdentifier, null, null);
+                this.sampleIdentifier, null, parentCodes);
     }
 }
\ No newline at end of file
diff --git a/openbis/sourceTest/java/stub_relationship_service.xml b/openbis/sourceTest/java/stub_relationship_service.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bc9fe497966207d0e382a8d8cbf03e5e8741d9aa
--- /dev/null
+++ b/openbis/sourceTest/java/stub_relationship_service.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:tx="http://www.springframework.org/schema/tx"
+    xsi:schemaLocation="http://www.springframework.org/schema/beans
+			http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+			http://www.springframework.org/schema/tx
+			http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
+
+    <bean id="relationship-service"
+        class="ch.systemsx.cisd.openbis.systemtest.base.RelationshipServiceStub" primary="true"> 
+    </bean>    
+</beans>
\ No newline at end of file
diff --git a/openbis/sourceTest/java/tests.xml b/openbis/sourceTest/java/tests.xml
index a6203350eff9f8ff14300aca7950a08781575ad9..2f6640cb209a293a0775078b9800d4e983a30e61 100644
--- a/openbis/sourceTest/java/tests.xml
+++ b/openbis/sourceTest/java/tests.xml
@@ -5,6 +5,7 @@
         <exclude name="abstract" />
         <exclude name="broken" />
         <exclude name="scalability"/>
+        <exclude name="system-cleandb"/>
       </run>
     </groups>
     <packages>
diff --git a/openbis/sourceTest/java/tests_system_cleandb.xml b/openbis/sourceTest/java/tests_system_cleandb.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7735eff03e74beaa350a4674540d028689c1e10c
--- /dev/null
+++ b/openbis/sourceTest/java/tests_system_cleandb.xml
@@ -0,0 +1,34 @@
+<suite name="All" verbose="2" parallel = "false" threadCount = "1">
+  <groups>
+    <run>
+      <include name="system-cleandb"/>
+    </run>
+  </groups>
+  
+  <test name="system-cleandb-basic" annotations="JDK">
+    <classes>
+      <class name="ch.systemsx.cisd.openbis.systemtest.EntityRelationshipChangeTest" />
+    </classes>
+  </test>
+
+  <!--  test name="system-cleandb-basic" annotations="JDK">
+     <method-selectors>
+       <method-selector>
+         <script language="beanshell"><![CDATA[
+           groups.containsKey("system-cleandb") && groups.containsKey("basic")
+          ]]></script>
+        </method-selector>
+      </method-selectors>
+  
+    <packages>
+      <package name="ch.systemsx.cisd.openbis.*" />
+    </packages>
+  </test -->
+
+  <test name="system-cleandb-stub-relationship-service" annotations="JDK">
+    <classes>
+      <class name="ch.systemsx.cisd.openbis.systemtest.RelationshipServiceAuthorizationTest" />
+    </classes>
+  </test>
+  
+</suite>