diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
index 7a04ddbd043cca7341a0dd4df3a55abfa9f166af..e29fc214e745a6ebbbfba2158a06966dc3127df6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/TrashBO.java
@@ -18,7 +18,6 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -47,7 +46,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
@@ -124,7 +122,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
             if (sample != null)
             {
                 sampleIds.add(new TechId(sample));
-            } else if (dataSet.getExperiment() != null)
+            }  if (dataSet.getExperiment() != null)
             {
                 experimentIds.add(new TechId(dataSet.getExperiment()));
             }
@@ -166,7 +164,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
         trashManager.addTrashOperation(EntityKind.EXPERIMENT, experimentIds, true);
         Set<TechId> eIds = new LinkedHashSet<TechId>(experimentIds);
         Set<TechId> dependentSampleIds = trashExperimentDependentSamples(trashManager, eIds);
-        assertSampleDeletionBusinessRules(eIds, dependentSampleIds);
+        assertSampleDeletionBusinessRules(eIds, dependentSampleIds, dependentSampleIds);
         trashExperimentDependentDataSets(trashManager, eIds, dependentSampleIds);
         trashManager.trash();
     }
@@ -177,6 +175,18 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
         assert deletion != null;
 
         TrashOperationsManager trashManager = new TrashOperationsManager(deletion, getDeletionDAO());
+        Set<TechId> allSampleIds 
+                = trashSamples(trashManager, sampleIds, CascadeSampleDependentComponents.TRUE, true);
+        Set<TechId> dependentSampleIds = new HashSet<TechId>(allSampleIds);
+        dependentSampleIds.removeAll(sampleIds);
+        Set<TechId> experimentsOfSamples = getExperimentsOfSamples(sampleIds);
+        assertSampleDeletionBusinessRules(experimentsOfSamples, new HashSet<TechId>(sampleIds), dependentSampleIds);
+        trashSampleDependentDataSets(trashManager, experimentsOfSamples, allSampleIds);
+        trashManager.trash();
+    }
+
+    private Set<TechId> getExperimentsOfSamples(List<TechId> sampleIds)
+    {
         Set<TechId> experimentIds = new HashSet<TechId>();
         ISampleLister sampleLister = boFactory.createSampleLister(session);
         List<Sample> samples = sampleLister.list(new ListOrSearchSampleCriteria(TechId.asLongs(sampleIds)));
@@ -187,15 +197,16 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
             {
                 experimentIds.add(new TechId(experiment));
             }
+            Sample container = sample.getContainer();
+            if (container != null)
+            {
+                
+            }
         }
-        Set<TechId> allSampleIds = trashSamples(trashManager, experimentIds, 
-                sampleIds, CascadeSampleDependentComponents.TRUE, true);
-        assertSampleDeletionBusinessRules(experimentIds, allSampleIds);
-        trashSampleDependentDataSets(trashManager, allSampleIds);
-        trashManager.trash();
+        return experimentIds;
     }
-
-    private Set<TechId> trashSamples(TrashOperationsManager trashManager, Set<TechId> experimentIds,
+    
+    private Set<TechId> trashSamples(TrashOperationsManager trashManager, 
             final List<TechId> sampleIds, final CascadeSampleDependentComponents cascadeType, boolean isOriginalDeletion)
     {
         assert deletion != null;
@@ -205,7 +216,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
 
         if (cascadeType == CascadeSampleDependentComponents.TRUE)
         {
-            allSampleIds.addAll(trashSampleDependentComponents(trashManager, experimentIds, sampleIds));
+            allSampleIds.addAll(trashSampleDependentComponents(trashManager, sampleIds));
         }
         return allSampleIds;
     }
@@ -278,10 +289,10 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
             if (nonDeletable > 0)
             {
                 dataSetIds.removeAll(deletableOriginals);
-                throw new UserFailureException("The following related data sets couldn't be deleted "
-                        + "because they are contained in data sets outside the deletion set: " 
-                        + Code.extractCodes(datasetLister.listByDatasetIds(TechId.asLongs(dataSetIds), 
-                                EnumSet.of(DataSetFetchOption.BASIC))));
+//                throw new UserFailureException("The following related data sets couldn't be deleted "
+//                        + "because they are contained in data sets outside the deletion set: " 
+//                        + Code.extractCodes(datasetLister.listByDatasetIds(TechId.asLongs(dataSetIds), 
+//                                EnumSet.of(DataSetFetchOption.BASIC))));
             }
             trashManager.addTrashOperation(EntityKind.DATA_SET, allDeletables, false);
         }
@@ -320,7 +331,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     }
 
     private Set<TechId> trashSampleDependentComponents(TrashOperationsManager trashManager, 
-            Set<TechId> experimentIds, List<TechId> sampleIds)
+            List<TechId> sampleIds)
     {
         final ISampleDAO sampleDAO = getSampleDAO();
 
@@ -337,10 +348,11 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
         BatchOperationExecutor.executeInBatches(batchOperation);
         // We have a business rule that there is just 1 level of components and using this here
         // improves performance.
-        return trashSamples(trashManager, experimentIds, batchOperation.getResults(), CascadeSampleDependentComponents.FALSE, false);
+        return trashSamples(trashManager, batchOperation.getResults(), CascadeSampleDependentComponents.FALSE, false);
     }
 
-    private void trashSampleDependentDataSets(TrashOperationsManager trashManager, Set<TechId> sampleIds)
+    private void trashSampleDependentDataSets(TrashOperationsManager trashManager, 
+            Set<TechId> experimentsOfSamples, Set<TechId> sampleIds)
     {
         AbstractQueryBatchOperation batchOperation =
                 new AbstractQueryBatchOperation(EntityKind.DATA_SET, new ArrayList<TechId>(sampleIds),
@@ -355,7 +367,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
                     };
         BatchOperationExecutor.executeInBatches(batchOperation);
         List<TechId> dataSetIds = batchOperation.getResults();
-        assertDataSetDeletionBusinessRules(Collections.<TechId>emptySet(), sampleIds, dataSetIds);
+        assertDataSetDeletionBusinessRules(experimentsOfSamples, sampleIds, dataSetIds);
         trashDataSets(trashManager, dataSetIds, false, new DataSetFilter(sampleIds,
                             new IIdHolderProvider()
                                 {
@@ -381,7 +393,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
                     };
         BatchOperationExecutor.executeInBatches(batchOperation);
         List<TechId> sampleIds = batchOperation.getResults();
-        return trashSamples(trashManager, experimentIds, sampleIds, CascadeSampleDependentComponents.TRUE, false);
+        return trashSamples(trashManager, sampleIds, CascadeSampleDependentComponents.TRUE, false);
     }
 
     private void trashExperimentDependentDataSets(TrashOperationsManager trashManager, Set<TechId> experimentIds, 
@@ -411,10 +423,10 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
                                 }));
     }
     
-    private void assertSampleDeletionBusinessRules(Set<TechId> experimentIds, Set<TechId> sampleIds)
+    private void assertSampleDeletionBusinessRules(Set<TechId> experimentIds, Set<TechId> originalSampleIds, Set<TechId> sampleIds)
     {
         Set<Long> eIds = new LinkedHashSet<Long>(TechId.asLongs(experimentIds));
-        Set<Long> sIds = new LinkedHashSet<Long>(TechId.asLongs(sampleIds));
+        Set<Long> sIds = new LinkedHashSet<Long>(TechId.asLongs(originalSampleIds));
         ISampleLister sampleLister = boFactory.createSampleLister(session);
         List<Sample> samples = sampleLister.list(new ListOrSearchSampleCriteria(TechId.asLongs(sampleIds)));
         StringBuilder builder = new StringBuilder();
@@ -430,7 +442,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
             {
                 if (eIds.contains(experiment.getId()) == false)
                 {
-                    addTo(builder, "belongs to experiment", sample, experiment);
+                    addTo(builder, "belongs to the experiment", sample, experiment);
                     numberOfForeignSamples++;
                 }
             }
@@ -439,7 +451,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
             {
                 if (sIds.contains(container.getId()) == false)
                 {
-                    addTo(builder, "is a component of sample", sample, container);
+                    addTo(builder, "is a component of the sample", sample, container);
                     numberOfForeignSamples++;
                 }
             }
@@ -453,8 +465,9 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     private void addTo(StringBuilder builder, String entityDescription, Sample sample, IIdentifierHolder outsider)
     {
         builder.append("The sample " + sample.getIdentifier() + " " + entityDescription + " " 
-                + outsider.getIdentifier() + " is outside the deletion set.\n");
+                + outsider.getIdentifier() + " which is outside the deletion set.\n");
     }
+    
     private void assertDataSetDeletionBusinessRules(Set<TechId> experimentIds, Set<TechId> sampleIdes, 
             List<TechId> dataSetIds)
     {
@@ -509,7 +522,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     {
         String findOriginalDataSet = findOriginalDataSet(containerIds, dataSet);
         builder.append("The data set " + findOriginalDataSet + " is a component of the data set " 
-                + dataSet.getCode() + " which belongs to " + entityDescription + " outside the deletion set.\n");
+                + dataSet.getCode() + " which belongs to the " + entityDescription + " which is outside the deletion set.\n");
     }
     
     private String findOriginalDataSet(Map<Long, Set<Long>> relations, AbstractExternalData dataSet)
@@ -620,6 +633,14 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
         {
             return "trash";
         }
+
+        @Override
+        public String toString()
+        {
+            return getOperationName() + (isOriginalDeletion ? " original " : " dependent ") + entityKind 
+                    + " " + getEntityName() + " " + entityIds;
+        }
+        
     }
 
     private abstract static class AbstractQueryBatchOperation implements IBatchOperation<TechId>
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityDeletionTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityDeletionTest.java
index 5e76e16e505afbea767f1ae98ac66ddb7666884e..2101db3b6b179b18718f3795a44e218d92868514 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityDeletionTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityDeletionTest.java
@@ -83,6 +83,19 @@ public class EntityDeletionTest extends BaseTest
         assertUnmodifiedAndUndeleted(g);
     }
     
+    @Test
+    public final void testTrashExperimentWithSampleWhichIsAComponentOfASpaceSample()
+    {
+        EntityGraphGenerator g = parseAndCreateGraph("E1, samples: S2\n"
+                + "S1, components: S2\n");
+        
+        failTrashExperiment(g.e(1), createExpectedErrorMessage(g.s(2), g.s(1)));
+        
+        assertEquals("E1, samples: S2\n"
+                + "S1, components: S2\n", renderGraph(g));
+        assertUnmodifiedAndUndeleted(g);
+    }
+    
     @Test
     public final void testTrashExperimentWithSamplesAndDataSetsAndNoExternalLinks()
     {
@@ -125,7 +138,7 @@ public class EntityDeletionTest extends BaseTest
                 + "S1, data sets: DS1\n"
                 + "DS1, components: DS2\n");
         
-        failTrashExperiment(g.e(2), g.ds(2), g.ds(1), g.s(1));
+        failTrashExperiment(g.e(2), createExpectedErrorMessage(g.ds(2), g.ds(1), g.s(1)));
         
         assertEquals("E1, samples: S1, data sets: DS1\n"
                 + "E2, data sets: DS2\n"
@@ -184,7 +197,7 @@ public class EntityDeletionTest extends BaseTest
                 + "DS2, components: DS3\n"
                 );
         
-        failTrashExperiment(g.e(1), g.ds(2), g.ds(1), g.e(2));
+        failTrashExperiment(g.e(1), createExpectedErrorMessage(g.ds(2), g.ds(1), g.e(2)));
         
         assertEquals("E1, samples: S1, data sets: DS2 DS3\n"
                 + "E2, data sets: DS1\n"
@@ -249,6 +262,19 @@ public class EntityDeletionTest extends BaseTest
         assertUnmodifiedAndUndeleted(g);
     }
     
+    @Test
+    public final void testTrashComponentSample()
+    {
+        EntityGraphGenerator g = parseAndCreateGraph("S1, components: S2\n");
+        
+        deleteSamples(g.s(2));
+        
+        assertEquals("", renderGraph(g));
+        assertDeleted(g.s(2));
+        assertModified(g.s(1));
+        assertUnmodifiedAndUndeleted(g);
+    }
+    
     @Test
     public final void testTrashSampleWithAComponentWithAContainerDataSetWithAComponentDataSetOfFirstSample()
     {
@@ -286,7 +312,7 @@ public class EntityDeletionTest extends BaseTest
                 + "S1, components: S2\n"
                 + "S2, data sets: DS1\n");
         
-        failTrashSample(g.s(1), g.s(2), g.e(1));
+        failTrashSample(g.s(1), createExpectedErrorMessage(g.s(2), g.e(1)));
         
         assertEquals("E1, samples: S2, data sets: DS1\n"
                 + "S1, components: S2\n"
@@ -309,6 +335,21 @@ public class EntityDeletionTest extends BaseTest
         assertUnmodifiedAndUndeleted(g);
     }
     
+    @Test
+    public final void testTrashExperimentSampleWhichIsAComponentOfASpaceSample()
+    {
+        EntityGraphGenerator g = parseAndCreateGraph("E1, samples: S2\n"
+                + "S1, components: S2\n");
+        
+        deleteSamples(g.s(2));
+        
+        assertEquals("", renderGraph(g));
+        assertModified(g.e(1));
+        assertModified(g.s(1));
+        assertDeleted(g.s(2));
+        assertUnmodifiedAndUndeleted(g);
+    }
+    
     @Test
     public final void testTrashSampleWithComponentWithDataSetWithComponentOfAnotherSample()
     {
@@ -317,7 +358,7 @@ public class EntityDeletionTest extends BaseTest
                 + "S3, data sets: DS1[NECT]\n"
                 + "DS1[NECT], components: DS2[NET]\n");
         
-        failTrashSample(g.s(1), g.ds(2), g.ds(1), g.s(3));
+        failTrashSample(g.s(1), createExpectedErrorMessage(g.ds(2), g.ds(1), g.s(3)));
         
         assertEquals("S1, components: S2\n"
                 + "S2, data sets: DS2[NET]\n"
@@ -334,7 +375,7 @@ public class EntityDeletionTest extends BaseTest
                 + "S2, data sets: DS2[NET]\n"
                 + "DS1, components: DS2[NET]\n");
         
-        failTrashSample(g.s(1), g.ds(2), g.ds(1), g.e(1));
+        failTrashSample(g.s(1), createExpectedErrorMessage(g.ds(2), g.ds(1), g.e(1)));
         
         assertEquals("E1, data sets: DS1\n"
                 + "S1, components: S2\n"
@@ -352,7 +393,7 @@ public class EntityDeletionTest extends BaseTest
                 + "DS2[NECT], components: DS4[NECT]\n"
                 + "DS4[NECT], components: DS5[NET] DS6[NET]\n");
         
-        failTrashSample(g.s(1), g.ds(4), g.ds(2), g.s(2));
+        failTrashSample(g.s(1), createExpectedErrorMessage(g.ds(4), g.ds(2), g.s(2)));
         
         assertEquals("S1, data sets: DS1[NECT] DS3[NET] DS4[NECT] DS5[NET] DS6[NET]\n"
                 + "S2, data sets: DS2[NECT]\n"
@@ -392,6 +433,38 @@ public class EntityDeletionTest extends BaseTest
         assertUnmodifiedAndUndeleted(g);
     }
     
+    @Test
+    public final void testTrashDataSetOfAContainerWhichBelongingToSameExperiment()
+    {
+        EntityGraphGenerator g = parseAndCreateGraph("E1, data sets: DS1 DS2\n"
+                + "DS1, components: DS2\n");
+        
+        deleteDataSets(g.ds(2));
+        
+        assertEquals("E1, data sets: DS1\n", renderGraph(g));
+        assertModified(g.e(1));
+        assertModified(g.ds(1));
+        assertDeleted(g.ds(2));
+        assertUnmodifiedAndUndeleted(g);
+    }
+    
+    @Test
+    public final void testTrashDataSetOfAContainerWhichBelongingToSameExperimentButDifferentSample()
+    {
+        EntityGraphGenerator g = parseAndCreateGraph("E1, samples: S1, data sets: DS1 DS2\n"
+                + "S1, data sets: DS2\n"
+                + "DS1, components: DS2\n");
+        
+        deleteDataSets(g.ds(2));
+        
+        assertEquals("E1, samples: S1, data sets: DS1\n", renderGraph(g));
+        assertModified(g.e(1));
+        assertModified(g.s(1));
+        assertModified(g.ds(1));
+        assertDeleted(g.ds(2));
+        assertUnmodifiedAndUndeleted(g);
+    }
+    
     @Test
     public void testTrashDataSetsWithDataSetInAContainer()
     {
@@ -426,8 +499,7 @@ public class EntityDeletionTest extends BaseTest
         assertUnmodifiedAndUndeleted(g);
     }
     
-    private void failTrashExperiment(ExperimentNode experimentNode, DataSetNode originalDataSet,
-            DataSetNode relatedDataSet, EntityNode outsiderNode)
+    private void failTrashExperiment(ExperimentNode experimentNode, String expectedErrorMessage)
     {
         try
         {
@@ -435,11 +507,12 @@ public class EntityDeletionTest extends BaseTest
             fail("UserFailureException expected");
         } catch (UserFailureException ex)
         {
-            assertExceptionMessage(originalDataSet, relatedDataSet, outsiderNode, ex);
+            assertEquals(expectedErrorMessage, 
+            ex.getMessage());
         }
     }
     
-    private void failTrashSample(SampleNode sampleNode, SampleNode relatedSample, EntityNode outsiderNode)
+    private void failTrashSample(SampleNode sampleNode, String expectedErrorMessage)
     {
         try
         {
@@ -447,50 +520,28 @@ public class EntityDeletionTest extends BaseTest
             fail("UserFailureException expected");
         } catch (UserFailureException ex)
         {
-            assertEquals("The sample " + entityGraphManager.getSample(relatedSample).getIdentifier() 
-                    + " belongs to " + renderOutsider(outsiderNode) + " is outside the deletion set.", 
-                    ex.getMessage());
-        }
-    }
-
-    private void failTrashSample(SampleNode sampleNode, DataSetNode originalDataSet,
-            DataSetNode relatedDataSet, EntityNode outsiderNode)
-    {
-        try
-        {
-            deleteSamples(sampleNode);
-            fail("UserFailureException expected");
-        } catch (UserFailureException ex)
-        {
-            assertExceptionMessage(originalDataSet, relatedDataSet, outsiderNode, ex);
+            assertEquals(expectedErrorMessage, ex.getMessage());
         }
     }
     
-    private void assertExceptionMessage(DataSetNode originalDataSet, DataSetNode relatedDataSet, 
-            EntityNode outsiderNode, UserFailureException ex)
+    private String render(EntityNode entityNode)
     {
-        assertEquals("The data set " + entityGraphManager.getDataSetCodeOrNull(originalDataSet) 
-                + " is a component of the data set " + entityGraphManager.getDataSetCodeOrNull(relatedDataSet) 
-                + " which belongs to " + renderOutsider(outsiderNode) + " outside the deletion set.", 
-                ex.getMessage());
-    }
-
-    private String renderOutsider(EntityNode outsiderNode)
-    {
-        String outsiderType;
-        String outsiderIdentifier;
-        if (outsiderNode instanceof ExperimentNode)
+        String type;
+        String identifier;
+        if (entityNode instanceof ExperimentNode)
+        {
+            type = "experiment";
+            identifier = entityGraphManager.getExperimentIdentifierOrNull((ExperimentNode) entityNode);
+        } else if (entityNode instanceof SampleNode)
         {
-            outsiderType = "experiment";
-            outsiderIdentifier = entityGraphManager.getExperimentIdentifierOrNull((ExperimentNode) outsiderNode);
+            type = "sample";
+            identifier = entityGraphManager.getSample((SampleNode) entityNode).getIdentifier();
         } else
         {
-            outsiderType = "sample";
-            outsiderIdentifier = entityGraphManager.getSample((SampleNode) outsiderNode).getIdentifier();
+            type = "data set";
+            identifier = entityGraphManager.getDataSetCodeOrNull((DataSetNode) entityNode);
         }
-        String outsider = outsiderType + " " 
-        + outsiderIdentifier;
-        return outsider;
+        return type + " " + identifier;
     }
     
     private void deleteExperiments(ExperimentNode...experimentNodes)
@@ -528,6 +579,23 @@ public class EntityDeletionTest extends BaseTest
         return create(aSession().withInstanceRole(RoleCode.ADMIN));
     }
     
+    protected String createExpectedErrorMessage(SampleNode relatedSample, EntityNode outsiderNode)
+    {
+        String relation = outsiderNode instanceof ExperimentNode ? "belongs to" : "is a component of";
+        return "The sample " + entityGraphManager.getSample(relatedSample).getIdentifier() 
+                + " " + relation + " the " + render(outsiderNode) + " which is outside the deletion set.";
+    }
+
+    protected String createExpectedErrorMessage(EntityNode originalNode, EntityNode relatedEntity, EntityNode outsiderNode)
+    {
+        return "The " + render(originalNode) 
+                + " is a component of the " + render(relatedEntity) 
+                + " which belongs to the " + render(outsiderNode) + " which is outside the deletion set.";
+    }
+
+    /**
+     * Trashes specified experiments for specified user session token.
+     */
     protected void deleteExperiments(List<String> experimentIdentifiers, String userSessionToken)
     {
         List<ExperimentIdentifier> identifiers = new ArrayList<ExperimentIdentifier>();
@@ -539,12 +607,18 @@ public class EntityDeletionTest extends BaseTest
         commonServer.deleteExperiments(userSessionToken, experimentIds, "test", DeletionType.TRASH);
     }
     
+    /**
+     * Trashes specified samples for specified user session token.
+     */
     protected void deleteSamples(List<String> samplePermIds, String userSessionToken)
     {
         Sample[] samples = loadSamples(samplePermIds);
         commonServer.deleteSamples(userSessionToken, TechId.createList(Arrays.asList(samples)), "test", DeletionType.TRASH);
     }
 
+    /**
+     * Trashes specified data sets for specified user session token.
+     */
     protected void deleteDataSets(List<String> dataSetCodes, String userSessionToken)
     {
         commonServer.deleteDataSets(userSessionToken, dataSetCodes, "test", DeletionType.TRASH, true);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadOptimisticLockingTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadOptimisticLockingTestCase.java
index 61f123f205c186a1978b5c5e08f408a84059ec47..1c8c6c618e451163f47e13f42c296ad1760bbb85 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadOptimisticLockingTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadOptimisticLockingTestCase.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.systemtest.optimistic_locking;
 
+import java.lang.reflect.Method;
+
 import org.springframework.transaction.annotation.Transactional;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
@@ -40,8 +42,15 @@ public class MultiThreadOptimisticLockingTestCase extends PersistentSystemTestCa
     }
 
     @AfterMethod
-    public void deleteSpaces()
+    public void deleteSpaces(Method m)
     {
-        toolBox.deleteSpaces();
+        try
+        {
+            toolBox.deleteSpaces();
+        } catch (Throwable t)
+        {
+            throw new Error(m.getName() + "() : ", t);
+        }
     }
+    
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java
index 98764816a85488f952e55e0524df44d2e6c177ca..4a0b2af29db2ccc3abb94033928ac9008d61f79c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java
@@ -22,7 +22,9 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import ch.systemsx.cisd.common.shared.basic.string.CommaSeparatedListBuilder;
 import ch.systemsx.cisd.openbis.generic.server.util.TimeIntervalChecker;
@@ -37,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -65,6 +68,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifierFactory;
 import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
 
@@ -145,8 +149,9 @@ public class ToolBox
 
     private void deleteSpace(Space space)
     {
-        trashExperiments(space);
+        trashDataSets(space);
         trashSamples(space);
+        trashExperiments(space);
         emptyTrashCan();
         deleteProjects(space);
         commonServer.deleteSpaces(systemSessionToken, Arrays.asList(new TechId(space.getId())),
@@ -174,6 +179,50 @@ public class ToolBox
     }
 
     private void trashSamples(Space space)
+    {
+        List<TechId> sampleIds = listSampleIds(space);
+        commonServer.deleteSamples(systemSessionToken, sampleIds, "cleanup",
+                DeletionType.TRASH);
+    }
+
+    private void trashExperiments(Space space)
+    {
+        commonServer.deleteExperiments(systemSessionToken, listExperimentIds(space),
+                "cleanup", DeletionType.TRASH);
+    }
+
+    private void trashDataSets(Space space)
+    {
+        Set<String> codes = new HashSet<String>();
+        for (TechId id : listExperimentIds(space))
+        {
+            List<AbstractExternalData> dataSets = etlService.listDataSetsByExperimentID(systemSessionToken, id);
+            for (AbstractExternalData dataSet : dataSets)
+            {
+                codes.add(dataSet.getCode());
+            }
+        }
+        List<TechId> sampleIds = listSampleIds(space);
+        for (TechId id : sampleIds)
+        {
+            List<AbstractExternalData> dataSets = etlService.listDataSetsBySampleID(systemSessionToken, id, true);
+            for (AbstractExternalData dataSet : dataSets)
+            {
+                codes.add(dataSet.getCode());
+            }
+        }
+        List<String> dataSetCodes = new ArrayList<String>(codes);
+        commonServer.deleteDataSets(systemSessionToken, dataSetCodes, "cleanup", DeletionType.TRASH, true);
+    }
+    
+    private List<TechId> listExperimentIds(Space space)
+    {
+        ExperimentType experimentType = new ExperimentTypeBuilder().code(EXPERIMENT_TYPE_CODE).getExperimentType();
+        SpaceIdentifier spaceIdentifier = new SpaceIdentifierFactory(space.getIdentifier()).createIdentifier();
+        return TechId.createList(commonServer.listExperiments(systemSessionToken, experimentType, spaceIdentifier));
+    }
+    
+    private List<TechId> listSampleIds(Space space)
     {
         ListSampleCriteria criteria = new ListSampleCriteria();
         criteria.setSampleType(SampleType.createAllSampleType(Collections.<SampleType> emptyList(),
@@ -182,19 +231,7 @@ public class ToolBox
         criteria.setIncludeSpace(true);
         criteria.setIncludeInstance(false);
         criteria.setExcludeWithoutExperiment(false);
-        List<Sample> samples = commonServer.listSamples(systemSessionToken, criteria);
-        commonServer.deleteSamples(systemSessionToken, TechId.createList(samples), "cleanup",
-                DeletionType.TRASH);
-    }
-
-    private void trashExperiments(Space space)
-    {
-        List<Experiment> experiments =
-                commonServer.listExperiments(systemSessionToken,
-                        new ExperimentTypeBuilder().code(EXPERIMENT_TYPE_CODE).getExperimentType(),
-                        new SpaceIdentifierFactory(space.getIdentifier()).createIdentifier());
-        commonServer.deleteExperiments(systemSessionToken, TechId.createList(experiments),
-                "cleanup", DeletionType.TRASH);
+        return TechId.createList(commonServer.listSamples(systemSessionToken, criteria));
     }
 
     public void createInstanceAdmin(String userId)