diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 2ef82420b646d4912227ddd0dc1aae62f54428d8..5cd21516eec66039509b0124c01077af53399f56 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -170,7 +170,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentHolderPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AuthorizationGroupPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetRelationshipPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
@@ -201,7 +200,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
 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.SampleTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ScriptPE;
@@ -2069,10 +2067,11 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         Session session = getSession(sessionToken);
         // NOTE: logical deletion and new implementation of permanent deletion doesn't use
         // IDataSetTypeSlaveServerPlugin (we have just 1 implementation!)
-        updateModificationDateAndModifierOfRelatedEntitiesOfDataSets(dataSetCodes, session);
         switch (type)
         {
             case PERMANENT:
+                List<DataPE> dataSets1 = getDAOFactory().getDataDAO().listByCode(new HashSet<String>(dataSetCodes));
+                RelationshipUtils.updateModificationDateAndModifierOfRelatedEntitiesOfDataSets(dataSets1, session);
                 if (isTrashEnabled)
                 {
                     IDeletedDataSetTable deletedDataSetTable =
@@ -2100,41 +2099,6 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         }
     }
 
-    private void updateModificationDateAndModifierOfRelatedEntitiesOfDataSets(
-            Collection<String> dataSetCodes, Session session)
-    {
-        List<DataPE> dataSets =
-                getDAOFactory().getDataDAO().listByCode(new HashSet<String>(dataSetCodes));
-        for (DataPE dataSet : dataSets)
-        {
-            ExperimentPE experiment = dataSet.getExperiment();
-            RelationshipUtils.updateModificationDateAndModifier(experiment, session);
-            SamplePE sample = dataSet.tryGetSample();
-            if (sample != null)
-            {
-                RelationshipUtils.updateModificationDateAndModifier(sample, session);
-            }
-            updateModificationDateAndModifierOfDataSets(dataSet.getChildren(), session);
-            updateModificationDateAndModifierOfDataSets(dataSet.getParents(), session);
-            Set<DataSetRelationshipPE> relationships = dataSet.getParentRelationships();
-            for (DataSetRelationshipPE relationship : RelationshipUtils.getContainerComponentRelationships(relationships))
-            {
-                RelationshipUtils.updateModificationDateAndModifier(relationship.getParentDataSet(), session);
-            }
-        }
-    }
-
-    private void updateModificationDateAndModifierOfDataSets(List<DataPE> dataSets, Session session)
-    {
-        if (dataSets != null)
-        {
-            for (DataPE child : dataSets)
-            {
-                RelationshipUtils.updateModificationDateAndModifier(child, session);
-            }
-        }
-    }
-
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
     @Capability("DELETE_SAMPLE")
@@ -2143,10 +2107,11 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
             List<TechId> sampleIds, String reason, DeletionType deletionType)
     {
         Session session = getSession(sessionToken);
-        updateModificationDateAndModifierOfRelatedEntitiesOfSamples(sampleIds, session);
         switch (deletionType)
         {
             case PERMANENT:
+                List<SamplePE> samples = getDAOFactory().getSampleDAO().listByIDs(TechId.asLongs(sampleIds));
+                RelationshipUtils.updateModificationDateAndModifierOfRelatedEntitiesOfSamples(samples, session);
                 ISampleTable sampleTableBO = businessObjectFactory.createSampleTable(session);
                 sampleTableBO.deleteByTechIds(sampleIds, reason);
                 break;
@@ -2158,43 +2123,6 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         }
     }
 
-    private void updateModificationDateAndModifierOfRelatedEntitiesOfSamples(
-            Collection<TechId> sampleIds, Session session)
-    {
-        List<SamplePE> samples =
-                getDAOFactory().getSampleDAO().listByIDs(TechId.asLongs(sampleIds));
-        for (SamplePE sample : samples)
-        {
-            ExperimentPE experiment = sample.getExperiment();
-            if (experiment != null)
-            {
-                RelationshipUtils.updateModificationDateAndModifier(experiment, session);
-            }
-            SamplePE container = sample.getContainer();
-            if (container != null)
-            {
-                RelationshipUtils.updateModificationDateAndModifier(container, session);
-            }
-            List<SamplePE> parents = sample.getParents();
-            if (parents != null)
-            {
-                for (SamplePE parent : parents)
-                {
-                    RelationshipUtils.updateModificationDateAndModifier(parent, session);
-                }
-            }
-            Set<SampleRelationshipPE> childRelationships = sample.getChildRelationships();
-            if (childRelationships != null)
-            {
-                for (SampleRelationshipPE childRelationship : childRelationships)
-                {
-                    SamplePE childSample = childRelationship.getChildSample();
-                    RelationshipUtils.updateModificationDateAndModifier(childSample, session);
-                }
-            }
-        }
-    }
-
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
     @Capability("DELETE_EXPERIMENT")
@@ -2203,11 +2131,12 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
             List<TechId> experimentIds, String reason, DeletionType deletionType)
     {
         Session session = getSession(sessionToken);
-        updateModificationDateAndModifierOfRelatedProjectsOfExperiments(experimentIds, session);
         IExperimentBO experimentBO = businessObjectFactory.createExperimentBO(session);
         switch (deletionType)
         {
             case PERMANENT:
+                List<ExperimentPE> experiments = getDAOFactory().getExperimentDAO().listByIDs(TechId.asLongs(experimentIds));
+                RelationshipUtils.updateModificationDateAndModifierOfRelatedProjectsOfExperiments(experiments, session);
                 experimentBO.deleteByTechIds(experimentIds, reason);
                 break;
             case TRASH:
@@ -2218,17 +2147,6 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         }
     }
 
-    private void updateModificationDateAndModifierOfRelatedProjectsOfExperiments(
-            Collection<TechId> experimentIds, Session session)
-    {
-        List<ExperimentPE> experiments =
-                getDAOFactory().getExperimentDAO().listByIDs(TechId.asLongs(experimentIds));
-        for (ExperimentPE experiment : experiments)
-        {
-            RelationshipUtils.updateModificationDateAndModifier(experiment.getProject(), session);
-        }
-    }
-
     @Override
     @RolesAllowed(RoleWithHierarchy.INSTANCE_ADMIN)
     @Capability("DELETE_VOCABULARY")
@@ -4038,10 +3956,12 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                 trashBO.revertDeletion(new TechId(deletionId));
             }
         }
-        updateModificationDateAndModifierOfRelatedProjectsOfExperiments(deletedExperimentIds,
-                session);
-        updateModificationDateAndModifierOfRelatedEntitiesOfSamples(deletedSampleIds, session);
-        updateModificationDateAndModifierOfRelatedEntitiesOfDataSets(deletedDataSetCodes, session);
+        List<ExperimentPE> experiments = getDAOFactory().getExperimentDAO().listByIDs(TechId.asLongs(deletedExperimentIds));
+        RelationshipUtils.updateModificationDateAndModifierOfRelatedProjectsOfExperiments(experiments, session);
+        List<SamplePE> samples = getDAOFactory().getSampleDAO().listByIDs(TechId.asLongs(deletedSampleIds));
+        RelationshipUtils.updateModificationDateAndModifierOfRelatedEntitiesOfSamples(samples, session);
+        List<DataPE> dataSets = getDAOFactory().getDataDAO().listByCode(new HashSet<String>(deletedDataSetCodes));
+        RelationshipUtils.updateModificationDateAndModifierOfRelatedEntitiesOfDataSets(dataSets, session);
     }
 
     @Override
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 e29fc214e745a6ebbbfba2158a06966dc3127df6..c7147e20c61bda8a71e0dd42f6aaec6e9fbbd412 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
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.EnumSet;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -43,7 +44,6 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOption;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 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.DataSetArchivingStatus;
@@ -59,6 +59,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
+import ch.systemsx.cisd.openbis.generic.shared.util.RelationshipUtils;
 
 /**
  * @author Piotr Buczek
@@ -122,13 +123,14 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
             if (sample != null)
             {
                 sampleIds.add(new TechId(sample));
-            }  if (dataSet.getExperiment() != null)
+            }  
+            if (dataSet.getExperiment() != null)
             {
                 experimentIds.add(new TechId(dataSet.getExperiment()));
             }
         }
         assertDataSetDeletionBusinessRules(experimentIds, sampleIds, dataSetIds);
-        TrashOperationsManager trashManager = new TrashOperationsManager(deletion, getDeletionDAO());
+        TrashOperationsManager trashManager = new TrashOperationsManager(session, deletion, this);
         trashDataSets(trashManager, dataSetIds, true, new IDataSetFilter()
             {
                 @Override
@@ -159,12 +161,10 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     public void trashExperiments(List<TechId> experimentIds)
     {
         assert deletion != null;
-        
-        TrashOperationsManager trashManager = new TrashOperationsManager(deletion, getDeletionDAO());
+        TrashOperationsManager trashManager = new TrashOperationsManager(session, deletion, this);
         trashManager.addTrashOperation(EntityKind.EXPERIMENT, experimentIds, true);
         Set<TechId> eIds = new LinkedHashSet<TechId>(experimentIds);
         Set<TechId> dependentSampleIds = trashExperimentDependentSamples(trashManager, eIds);
-        assertSampleDeletionBusinessRules(eIds, dependentSampleIds, dependentSampleIds);
         trashExperimentDependentDataSets(trashManager, eIds, dependentSampleIds);
         trashManager.trash();
     }
@@ -174,13 +174,12 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     {
         assert deletion != null;
 
-        TrashOperationsManager trashManager = new TrashOperationsManager(deletion, getDeletionDAO());
+        TrashOperationsManager trashManager = new TrashOperationsManager(session, deletion, this);
         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();
     }
@@ -197,11 +196,6 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
             {
                 experimentIds.add(new TechId(experiment));
             }
-            Sample container = sample.getContainer();
-            if (container != null)
-            {
-                
-            }
         }
         return experimentIds;
     }
@@ -282,20 +276,8 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
         {
             allDeletables.removeAll(deletableOriginals);
             trashManager.addTrashOperation(EntityKind.DATA_SET, deletableOriginals, true);
-            trashManager.addTrashOperation(EntityKind.DATA_SET, allDeletables, false);
-        } else
-        {
-            int nonDeletable = dataSetIds.size() - deletableOriginals.size();
-            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))));
-            }
-            trashManager.addTrashOperation(EntityKind.DATA_SET, allDeletables, false);
         }
+        trashManager.addTrashOperation(EntityKind.DATA_SET, allDeletables, false);
     }
 
     private void checkForNonDeletableDataSets(List<ExternalDataPE> unavailableDataSets)
@@ -423,51 +405,6 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
                                 }));
     }
     
-    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(originalSampleIds));
-        ISampleLister sampleLister = boFactory.createSampleLister(session);
-        List<Sample> samples = sampleLister.list(new ListOrSearchSampleCriteria(TechId.asLongs(sampleIds)));
-        StringBuilder builder = new StringBuilder();
-        int numberOfForeignSamples = 0;
-        for (Sample sample : samples)
-        {
-            if (numberOfForeignSamples >= 10)
-            {
-                break;
-            }
-            Experiment experiment = sample.getExperiment();
-            if (experiment != null)
-            {
-                if (eIds.contains(experiment.getId()) == false)
-                {
-                    addTo(builder, "belongs to the experiment", sample, experiment);
-                    numberOfForeignSamples++;
-                }
-            }
-            Sample container = sample.getContainer();
-            if (container != null)
-            {
-                if (sIds.contains(container.getId()) == false)
-                {
-                    addTo(builder, "is a component of the sample", sample, container);
-                    numberOfForeignSamples++;
-                }
-            }
-        }
-        if (numberOfForeignSamples > 0)
-        {
-            throw new UserFailureException(builder.toString().trim());
-        }
-    }
-    
-    private void addTo(StringBuilder builder, String entityDescription, Sample sample, IIdentifierHolder outsider)
-    {
-        builder.append("The sample " + sample.getIdentifier() + " " + entityDescription + " " 
-                + outsider.getIdentifier() + " which is outside the deletion set.\n");
-    }
-    
     private void assertDataSetDeletionBusinessRules(Set<TechId> experimentIds, Set<TechId> sampleIdes, 
             List<TechId> dataSetIds)
     {
@@ -561,31 +498,67 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     
     private static final class TrashOperationsManager
     {
+        private final Session session;
         private final DeletionPE deletion;
-        private final IDeletionDAO deletionDAO;
+        private final IDAOFactory daoFactory;
+        
+        private final Map<EntityKind, Set<TechId>> entityIdsByKind = new HashMap<EntityKind, Set<TechId>>();
         private final List<TrashBatchOperation> operations = new ArrayList<TrashBatchOperation>();
         
-        TrashOperationsManager(DeletionPE deletion, IDeletionDAO deletionDAO)
+        TrashOperationsManager(Session session, DeletionPE deletion, IDAOFactory daoFactory)
         {
+            this.session = session;
             this.deletion = deletion;
-            this.deletionDAO = deletionDAO;
+            this.daoFactory = daoFactory;
+            EntityKind[] values = EntityKind.values();
+            for (EntityKind entityKind : values)
+            {
+                entityIdsByKind.put(entityKind, new HashSet<TechId>());
+            }
         }
         
         void addTrashOperation(EntityKind entityKind, List<TechId> entityIds, boolean isOriginalDeletion)
         {
             if (entityIds.isEmpty() == false)
             {
+                entityIdsByKind.get(entityKind).addAll(entityIds);
+                IDeletionDAO deletionDAO = daoFactory.getDeletionDAO();
                 operations.add(new TrashBatchOperation(entityKind, entityIds, deletion, deletionDAO, isOriginalDeletion));
             }
         }
         
         void trash()
         {
+            updateModificationDateAndModifierOfRelatedProjectsOfExperiments();
+            updateModificationDateAndModifierOfRelatedEntitiesOfSamples();
+            updateModificationDateAndModifierOfRelatedEntitiesOfDataSets();
             for (TrashBatchOperation operation : operations)
             {
                 BatchOperationExecutor.executeInBatches(operation);
             }
         }
+        
+        private void updateModificationDateAndModifierOfRelatedProjectsOfExperiments()
+        {
+            List<Long> ids = TechId.asLongs(entityIdsByKind.get(EntityKind.EXPERIMENT));
+            List<ExperimentPE> experiments = daoFactory.getExperimentDAO().listByIDs(ids);
+            RelationshipUtils.updateModificationDateAndModifierOfRelatedProjectsOfExperiments(experiments, session);
+        }
+        
+        private void updateModificationDateAndModifierOfRelatedEntitiesOfSamples()
+        {
+            List<Long> ids = TechId.asLongs(entityIdsByKind.get(EntityKind.SAMPLE));
+            List<SamplePE> samples = daoFactory.getSampleDAO().listByIDs(ids);
+            RelationshipUtils.updateModificationDateAndModifierOfRelatedEntitiesOfSamples(samples, session);
+        }
+        
+        private void updateModificationDateAndModifierOfRelatedEntitiesOfDataSets()
+        {
+            List<Long> ids = TechId.asLongs(entityIdsByKind.get(EntityKind.DATA_SET));
+            List<DataPE> dataSets = daoFactory.getDataDAO().listByIDs(ids);
+            RelationshipUtils.updateModificationDateAndModifierOfRelatedEntitiesOfDataSets(dataSets, session);
+
+        }
     }
 
     private static class TrashBatchOperation implements IBatchOperation<TechId>
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/RelationshipUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/RelationshipUtils.java
index 2785bf4f7d3db1d2a0dc72c7606305b3ca29cf4b..820f996a26df69ab9d5a55c5a53e9cab999f9941 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/RelationshipUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/RelationshipUtils.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
@@ -29,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSession;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IModifierAndModificationDateBean;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SampleRelationshipPE;
 
 /**
  * Utility function for relation ship.
@@ -37,6 +39,81 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
  */
 public class RelationshipUtils
 {
+
+    public static void updateModificationDateAndModifierOfRelatedProjectsOfExperiments(List<ExperimentPE> experiments, IAuthSession session)
+    {
+        for (ExperimentPE experiment : experiments)
+        {
+            updateModificationDateAndModifier(experiment.getProject(), session);
+        }
+    }
+
+    public static void updateModificationDateAndModifierOfRelatedEntitiesOfSamples(List<SamplePE> samples, IAuthSession session)
+    {
+        for (SamplePE sample : samples)
+        {
+            ExperimentPE experiment = sample.getExperiment();
+            if (experiment != null)
+            {
+                updateModificationDateAndModifier(experiment, session);
+            }
+            SamplePE container = sample.getContainer();
+            if (container != null)
+            {
+                updateModificationDateAndModifier(container, session);
+            }
+            List<SamplePE> parents = sample.getParents();
+            if (parents != null)
+            {
+                for (SamplePE parent : parents)
+                {
+                    updateModificationDateAndModifier(parent, session);
+                }
+            }
+            Set<SampleRelationshipPE> childRelationships = sample.getChildRelationships();
+            if (childRelationships != null)
+            {
+                for (SampleRelationshipPE childRelationship : childRelationships)
+                {
+                    SamplePE childSample = childRelationship.getChildSample();
+                    updateModificationDateAndModifier(childSample, session);
+                }
+            }
+        }
+    }
+
+    public static void updateModificationDateAndModifierOfRelatedEntitiesOfDataSets(List<DataPE> dataSets, IAuthSession session)
+    {
+        for (DataPE dataSet : dataSets)
+        {
+            ExperimentPE experiment = dataSet.getExperiment();
+            updateModificationDateAndModifier(experiment, session);
+            SamplePE sample = dataSet.tryGetSample();
+            if (sample != null)
+            {
+                updateModificationDateAndModifier(sample, session);
+            }
+            RelationshipUtils.updateModificationDateAndModifierOfDataSets(dataSet.getChildren(), session);
+            RelationshipUtils.updateModificationDateAndModifierOfDataSets(dataSet.getParents(), session);
+            Set<DataSetRelationshipPE> relationships = dataSet.getParentRelationships();
+            for (DataSetRelationshipPE relationship : getContainerComponentRelationships(relationships))
+            {
+                updateModificationDateAndModifier(relationship.getParentDataSet(), session);
+            }
+        }
+    }
+
+    private static void updateModificationDateAndModifierOfDataSets(List<DataPE> dataSets, IAuthSession session)
+    {
+        if (dataSets != null)
+        {
+            for (DataPE child : dataSets)
+            {
+                updateModificationDateAndModifier(child, session);
+            }
+        }
+    }
+
     public static boolean isParentChildRelationship(DataSetRelationshipPE relationship)
     {
         return isRelationshipOfType(relationship, BasicConstant.PARENT_CHILD_INTERNAL_RELATIONSHIP);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeletionTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeletionTestCase.java
index 6f00a7805e322b7818ae5c0d7c1c7ecb52275b05..07f59affe13170e97cb572e252e5baafa3aa9ad4 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeletionTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeletionTestCase.java
@@ -31,6 +31,7 @@ import java.util.Set;
 
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.Predicate;
+import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.testng.annotations.AfterMethod;
@@ -183,6 +184,7 @@ public class DeletionTestCase extends SystemTestCase
                     }
                 }
             }
+            flushAndClearHibernateSession();
             commonServer.deleteExperiments(sessionToken, TechId.createList(existingExperiments),
                     REASON, DeletionType.TRASH);
             commonServer.deletePermanently(sessionToken, TechId.createList(listDeletions()));
@@ -220,6 +222,7 @@ public class DeletionTestCase extends SystemTestCase
         assertSamplesExist(registeredSamples);
 
         // delete permanently
+        flushAndClearHibernateSession();
         commonServer.deleteExperiments(sessionToken, Collections.singletonList(experimentId),
                 REASON, DeletionType.TRASH);
         final TechId deletionId2 = TechId.create(listDeletions().get(0));
@@ -228,7 +231,6 @@ public class DeletionTestCase extends SystemTestCase
         assertSamplesDoNotExist(registeredSamplesThatShouldBeDeleted);
     }
 
-    
     @Autowired
     SessionFactory sessionFactory;
     @Test
@@ -529,4 +531,11 @@ public class DeletionTestCase extends SystemTestCase
         return result;
     }
 
+    private void flushAndClearHibernateSession()
+    {
+        Session currentSession = daoFactory.getSessionFactory().getCurrentSession();
+        currentSession.flush();
+        currentSession.clear();
+    }
+
 }
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 2101db3b6b179b18718f3795a44e218d92868514..49f1aa6727873702a4c7150b37634e2d5d74d809 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityDeletionTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityDeletionTest.java
@@ -89,10 +89,12 @@ public class EntityDeletionTest extends BaseTest
         EntityGraphGenerator g = parseAndCreateGraph("E1, samples: S2\n"
                 + "S1, components: S2\n");
         
-        failTrashExperiment(g.e(1), createExpectedErrorMessage(g.s(2), g.s(1)));
+        deleteExperiments(g.e(1));
         
-        assertEquals("E1, samples: S2\n"
-                + "S1, components: S2\n", renderGraph(g));
+        assertEquals("", renderGraph(g));
+        assertModified(g.s(1));
+        assertDeleted(g.e(1));
+        assertDeleted(g.s(2));
         assertUnmodifiedAndUndeleted(g);
     }
     
@@ -265,12 +267,14 @@ public class EntityDeletionTest extends BaseTest
     @Test
     public final void testTrashComponentSample()
     {
-        EntityGraphGenerator g = parseAndCreateGraph("S1, components: S2\n");
+        EntityGraphGenerator g = parseAndCreateGraph("E1, samples: S2\n"
+                + "S1, components: S2\n");
         
         deleteSamples(g.s(2));
         
         assertEquals("", renderGraph(g));
         assertDeleted(g.s(2));
+        assertModified(g.e(1));
         assertModified(g.s(1));
         assertUnmodifiedAndUndeleted(g);
     }
@@ -312,11 +316,12 @@ public class EntityDeletionTest extends BaseTest
                 + "S1, components: S2\n"
                 + "S2, data sets: DS1\n");
         
-        failTrashSample(g.s(1), createExpectedErrorMessage(g.s(2), g.e(1)));
+        deleteSamples(g.s(1));
         
-        assertEquals("E1, samples: S2, data sets: DS1\n"
-                + "S1, components: S2\n"
-                + "S2, data sets: DS1\n", renderGraph(g));
+        assertEquals("", renderGraph(g));
+        assertDeleted(g.s(1), g.s(2));
+        assertDeleted(g.ds(1));
+        assertModified(g.e(1));
         assertUnmodifiedAndUndeleted(g);
     }
     
@@ -552,6 +557,7 @@ public class EntityDeletionTest extends BaseTest
             experimentIdentifiers.add(entityGraphManager.getExperimentIdentifierOrNull(experimentNode));
         }
         deleteExperiments(experimentIdentifiers, createAdminUser());
+        flushAndClearHibernateSession();
     }
 
     private void deleteSamples(SampleNode...sampleNodes)
@@ -562,6 +568,7 @@ public class EntityDeletionTest extends BaseTest
             samplePermIds.add(entityGraphManager.getSamplePermIdOrNull(sampleNode));
         }
         deleteSamples(samplePermIds, createAdminUser());
+        flushAndClearHibernateSession();
     }
     
     private void deleteDataSets(DataSetNode...dataSetNodes)
@@ -572,6 +579,7 @@ public class EntityDeletionTest extends BaseTest
             dataSetCodes.add(entityGraphManager.getDataSetCodeOrNull(dataSetNode));
         }
         deleteDataSets(dataSetCodes, createAdminUser());
+        flushAndClearHibernateSession();
     }
     
     private String createAdminUser()
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 ad6a27abc0d9771378cc9fc6e257299f533d5d3f..df369108ff180a5c94f2d8dcfa076b6ab915c649 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
@@ -477,10 +477,15 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT
     protected EntityGraphGenerator parseAndCreateGraph(String graphDefinition)
     {
         EntityGraphGenerator graphGenerator = entityGraphManager.parseAndCreateGraph(graphDefinition);
+        flushAndClearHibernateSession();
+        return graphGenerator;
+    }
+
+    protected void flushAndClearHibernateSession()
+    {
         org.hibernate.Session currentSession = daoFactory.getSessionFactory().getCurrentSession();
         currentSession.flush();
         currentSession.clear();
-        return graphGenerator;
     }
 
     protected String renderGraph(EntityGraphGenerator g)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/entitygraph/EntityGraphManager.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/entitygraph/EntityGraphManager.java
index 7e917a592c514004bd528c5129d090e3c05aef45..fdae11f7e8c707f0ab78b5dd5a3e337d4186b239 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/entitygraph/EntityGraphManager.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/entitygraph/EntityGraphManager.java
@@ -689,6 +689,11 @@ public class EntityGraphManager
                 CodeWithRegistrationAndModificationDate<?> entity)
         {
             builder.append(prefix).append(id).append(" -> ").append(entity.getCode()).append(" (");
+            if (entity instanceof IIdHolder)
+            {
+                IIdHolder idHolder = (IIdHolder) entity;
+                builder.append(idHolder.getId()).append(", ");
+            }
             builder.append(entity.getModifier().getUserId()).append(", ");
             builder.append(entity.getModificationDate()).append(")\n");
         }