diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
index 517874a56a17ff9625b4e39658ef6eb351e70276..d4ec1e0e09df5e02165f17144d5897cb67f8ffc8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonBusinessObjectFactory.java
@@ -40,7 +40,6 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.IExperimentBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IExperimentTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IGridCustomFilterOrColumnBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IGroupBO;
-import ch.systemsx.cisd.openbis.generic.server.business.bo.ITrashBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IMaterialBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IMaterialTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IProjectBO;
@@ -50,9 +49,9 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.IRoleAssignmentTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ISampleBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ISampleTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IScriptBO;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.ITrashBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IVocabularyBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IVocabularyTermBO;
-import ch.systemsx.cisd.openbis.generic.server.business.bo.TrashBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ProjectBO;
@@ -62,6 +61,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.RoleAssignmentTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.SampleBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.SampleTable;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ScriptBO;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.TrashBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.VocabularyBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.VocabularyTermBO;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.DatasetLister;
@@ -216,6 +216,6 @@ public final class CommonBusinessObjectFactory extends AbstractBusinessObjectFac
 
     public ITrashBO createTrashBO(Session session)
     {
-        return new TrashBO(getDaoFactory(), session, this);
+        return new TrashBO(getDaoFactory(), session);
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
index 4c73d12f65ee6c42c4b804447f2393eec07ea8db..868d208f595d2c19eb4f855d287ba301cd383004 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
@@ -57,7 +57,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE;
@@ -235,19 +234,6 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements
         dataSets.addAll(getDataDAO().listDataSets(experiment));
     }
 
-    public int trashByTechIds(List<TechId> dataSetIds, DeletionPE deletion)
-            throws UserFailureException
-    {
-        try
-        {
-            return getDataDAO().trash(dataSetIds, deletion);
-        } catch (final DataAccessException ex)
-        {
-            throwException(ex, "Data Set", EntityKind.DATA_SET);
-        }
-        return -1; // not possible
-    }
-
     public void deleteLoadedDataSets(String reason)
     {
         assertDatasetsAreDeletable(dataSets);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
index 20348f239ed3d73dd30ab3cd3bff3bbc1fbfcb18..98fd39655fc6f869898728644671d5ae8d1dbb28 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
@@ -39,7 +39,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType;
@@ -208,19 +207,6 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
                 + "') not found in experiment '" + experiment.getIdentifier() + "'.");
     }
 
-    public int trashByTechIds(List<TechId> experimentIds, DeletionPE deletion)
-            throws UserFailureException
-    {
-        try
-        {
-            return getExperimentDAO().trash(experimentIds, deletion);
-        } catch (final DataAccessException ex)
-        {
-            throwException(ex, "Experiment", EntityKind.EXPERIMENT);
-        }
-        return -1; // not possible
-    }
-
     public void deleteByTechIds(List<TechId> experimentIds, String reason)
             throws UserFailureException
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataSetTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataSetTable.java
index d3bb6d8ffc3b250dc0510a97d772153eb2f84c7c..895671ce2035888e70c6958c41decd44894c4ce0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataSetTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IDataSetTable.java
@@ -19,7 +19,6 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo;
 import java.util.List;
 import java.util.Map;
 
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewDataSet;
@@ -27,7 +26,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 
 /**
@@ -70,15 +68,6 @@ public interface IDataSetTable
      */
     void setDataSets(List<DataPE> dataSets);
 
-    /**
-     * Moves data sets to trash with given deletion.
-     * 
-     * @param dataSetIds data set technical identifiers
-     * @throws UserFailureException if one of the data sets can not be moved to trash.
-     */
-    public int trashByTechIds(List<TechId> dataSetIds, DeletionPE deletion)
-            throws UserFailureException;
-
     /**
      * Permanently Deletes loaded data sets for specified reason.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java
index 6d4512b92111263d5aad09625e277872afa28b63..830393007de4cd98a8a3fd92f1f74fb87db59085 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java
@@ -23,7 +23,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.api.IManagedProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
@@ -83,14 +82,6 @@ public interface IExperimentBO extends IEntityBusinessObject
      */
     void deleteByTechIds(List<TechId> experimentIds, String reason);
 
-    /**
-     * Moves experiment to trash with given deletion.
-     * 
-     * @param experimentIds experiment technical identifiers
-     * @throws UserFailureException if one of the experiments can not be moved to trash.
-     */
-    int trashByTechIds(List<TechId> experimentIds, DeletionPE deletion);
-
     /**
      * Changes the value of a managed property.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleTable.java
index 1fa3e8fcc176a2e41fd8a798af9e8c37dc0eacea..edf03ef6e9e455e23b74b9926f9cd96cd69e3d81 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleTable.java
@@ -21,7 +21,6 @@ import java.util.List;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ListSamplesByPropertyCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleBatchUpdatesDTO;
@@ -72,13 +71,4 @@ public interface ISampleTable
      */
     public void deleteByTechIds(List<TechId> sampleIds, String reason) throws UserFailureException;
 
-    /**
-     * Moves samples to trash with given deletion.
-     * 
-     * @param sampleIds sample technical identifiers
-     * @throws UserFailureException if one of the samples can not be moved to trash.
-     */
-    public int trashByTechIds(List<TechId> sampleIds, DeletionPE deletion)
-            throws UserFailureException;
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
index 5942b4b7f07601b0d445a63e0f49033243de4a01..42c245bbe3f9647ba4caa3f46ccf581a380798ea 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
@@ -31,7 +31,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleBatchUpdateDetails;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
@@ -341,17 +340,4 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I
         }
     }
 
-    public int trashByTechIds(List<TechId> sampleIds, DeletionPE deletion)
-            throws UserFailureException
-    {
-        try
-        {
-            return getSampleDAO().trash(sampleIds, deletion);
-        } catch (final DataAccessException ex)
-        {
-            throwException(ex, "Sample", EntityKind.SAMPLE);
-        }
-        return -1; // not possible
-    }
-
 }
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 de43071759f206b50b0b0052c9f2359ef3d67efe..d8b21fdaa42f7a2995941a67ff430431d5e29d56 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
@@ -27,21 +27,18 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
  * @author Piotr Buczek
  */
 public class TrashBO extends AbstractBusinessObject implements ITrashBO
 {
-
-    private final ICommonBusinessObjectFactory boFactory;
-
     private DeletionPE deletion;
 
-    public TrashBO(IDAOFactory daoFactory, Session session, ICommonBusinessObjectFactory boFactory)
+    public TrashBO(IDAOFactory daoFactory, Session session)
     {
         super(daoFactory, session);
-        this.boFactory = boFactory;
     }
 
     public void createDeletion(String reason)
@@ -61,8 +58,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     public void trashSamples(List<TechId> sampleIds)
     {
         assert deletion != null;
-        ISampleTable sampleTableBO = boFactory.createSampleTable(session);
-        int trashedCount = sampleTableBO.trashByTechIds(sampleIds, deletion);
+        int trashedCount = getDeletionDAO().trash(EntityKind.SAMPLE, sampleIds, deletion);
         if (trashedCount > 0)
         {
             trashSampleDependentChildrenAndComponents(sampleIds);
@@ -73,8 +69,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     public void trashExperiments(List<TechId> experimentIds)
     {
         assert deletion != null;
-        IExperimentBO experimentBO = boFactory.createExperimentBO(session);
-        int trashedCount = experimentBO.trashByTechIds(experimentIds, deletion);
+        int trashedCount = getDeletionDAO().trash(EntityKind.EXPERIMENT, experimentIds, deletion);
         if (trashedCount > 0)
         {
             trashExperimentDependentDataSets(experimentIds);
@@ -85,8 +80,7 @@ public class TrashBO extends AbstractBusinessObject implements ITrashBO
     public void trashDataSets(List<TechId> dataSetIds)
     {
         assert deletion != null;
-        IDataSetTable dataSetTable = boFactory.createDataSetTable(session);
-        dataSetTable.trashByTechIds(dataSetIds, deletion);
+        getDeletionDAO().trash(EntityKind.DATA_SET, dataSetIds, deletion);
         // NOTE: data set children are not cascade trashed - a conscious decision made by Tomek
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java
index d79f4e2a933a9ca0249a3b1a7c01281071add610..bfd7356f50e3ed89ca06c38b752357d5933f01cb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDataDAO.java
@@ -27,7 +27,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -120,9 +119,6 @@ public interface IDataDAO extends IGenericDAO<DataPE>
 
     public void updateDataSets(List<DataPE> externalData);
 
-    /** Move given data sets to trash using specified deletion. */
-    public int trash(List<TechId> dataSetIds, DeletionPE deletion) throws DataAccessException;
-
     /** Returns ids of data sets connected with samples specified by given ids. */
     public List<TechId> listDataSetIdsBySampleIds(final Collection<TechId> samples);
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDeletionDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDeletionDAO.java
index 191b15b9de360442f2cc76a4c4e3fb5556f833c4..61ae9a0ede56fd69cabc649a91759d1e1a145640 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDeletionDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDeletionDAO.java
@@ -22,6 +22,7 @@ import org.springframework.dao.DataAccessException;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
  * An interface that contains all data access operations on {@link DeletionPE}s.
@@ -30,17 +31,28 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
  */
 public interface IDeletionDAO extends IGenericDAO<DeletionPE>
 {
+    /** Inserts given {@link DeletionPE} into the database. */
+    void create(final DeletionPE deletion) throws DataAccessException;
+
     /**
-     * Inserts given {@link DeletionPE} into the database.
+     * Moves entities with given ids to trash using specified deletion. Ignores ids of entities that
+     * don't exist or are already in the trash.
+     * 
+     * @return number of trashed entities
      */
-    void create(final DeletionPE deletion) throws DataAccessException;
+    int trash(EntityKind entityKind, List<TechId> entityIds, DeletionPE deletion)
+            throws DataAccessException;
 
+    /** Reverts given deletion. The deletion record will be removed from DB. */
     void revert(DeletionPE deletion);
 
+    /** Returns list of ids of samples moved to trash in specified deletions. */
     List<TechId> findTrashedSampleIds(List<TechId> deletionIds);
 
+    /** Returns list of ids of experiments moved to trash in specified deletions. */
     List<TechId> findTrashedExperimentIds(List<TechId> deletionIds);
 
+    /** Returns list of codes of data sets moved to trash in specified deletions. */
     List<String> findTrashedDataSetCodes(List<TechId> deletionIds);
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IExperimentDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IExperimentDAO.java
index 924057cf6fef822f38fdf30449993a4e34091136..f691f6341f67456205618ced4fb1b4a938678d0e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IExperimentDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IExperimentDAO.java
@@ -22,8 +22,6 @@ import java.util.Set;
 
 import org.springframework.dao.DataAccessException;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
@@ -107,9 +105,4 @@ public interface IExperimentDAO extends IGenericDAO<ExperimentPE>
      */
     public void createOrUpdateExperiments(List<ExperimentPE> experiments);
 
-    /**
-     * Move experiments with given ids to trash using specified deletion.
-     */
-    public int trash(List<TechId> experimentIds, DeletionPE deletion);
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java
index bb35bce72172e509518765e730103512adb72c43..47c210432390b99e9db5e4213ee64d8c633f294e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/ISampleDAO.java
@@ -24,7 +24,6 @@ import org.springframework.dao.DataAccessException;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 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.SpacePE;
@@ -131,10 +130,4 @@ public interface ISampleDAO extends IGenericDAO<SamplePE>
      */
     void delete(List<TechId> sampleIds, PersonPE registrator, String reason)
             throws DataAccessException;
-
-    /**
-     * Move samples with given ids to trash using specified deletion.
-     */
-    int trash(List<TechId> sampleIds, DeletionPE deletion) throws DataAccessException;
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
index 650a1753641d783cfefadfb6e4123483daf25dcb..1dcebb657f74312cae1edbfbd65ac4aa401259dc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
@@ -51,7 +51,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -464,42 +463,6 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
         super.delete(entity);
     }
 
-    public int trash(final List<TechId> dataSetIds, final DeletionPE deletion)
-            throws DataAccessException
-    {
-        if (dataSetIds.isEmpty())
-        {
-            return 0;
-        }
-        final HibernateTemplate hibernateTemplate = getHibernateTemplate();
-        int updatedRows = (Integer) hibernateTemplate.execute(new HibernateCallback()
-            {
-
-                //
-                // HibernateCallback
-                //
-
-                public final Object doInHibernate(final Session session) throws HibernateException,
-                        SQLException
-                {
-                    // NOTE: 'VERSIONED' makes modification time modified too
-                    return session
-                            .createQuery(
-                                    "UPDATE VERSIONED "
-                                            + DataPE.class.getSimpleName()
-                                            + " SET deletion = :deletion WHERE deletion IS NULL AND id IN (:ids) ")
-                            .setParameter("deletion", deletion)
-                            .setParameterList("ids", TechId.asLongs(dataSetIds)).executeUpdate();
-                }
-            });
-        if (operationLog.isInfoEnabled())
-        {
-            operationLog.info(String.format("trashing %d data sets", updatedRows));
-        }
-        hibernateTemplate.flush();
-        return updatedRows;
-    }
-
     @SuppressWarnings("unchecked")
     public Set<TechId> findParentIds(final Collection<TechId> dataSetIds)
     {
@@ -587,7 +550,8 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
         final List<Long> results = cast(getHibernateTemplate().findByCriteria(criteria));
         if (operationLog.isDebugEnabled())
         {
-           operationLog.info(String.format("found %s data sets for given samples", results.size()));
+            operationLog
+                    .info(String.format("found %s data sets for given samples", results.size()));
         }
         return transformNumbers2TechIdList(results);
     }
@@ -601,8 +565,8 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
         final List<Long> results = cast(getHibernateTemplate().findByCriteria(criteria));
         if (operationLog.isDebugEnabled())
         {
-           operationLog
-                .info(String.format("found %s data sets for given experiments", results.size()));
+            operationLog.info(String.format("found %s data sets for given experiments",
+                    results.size()));
         }
         return transformNumbers2TechIdList(results);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
index 57e1bdf695da05104d81668ee08d23cd8354b028..eb8ffd44d73b4e7aa235a058a11ae0e8c47f8ad1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DeletionDAO.java
@@ -16,15 +16,19 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
+import java.sql.SQLException;
 import java.util.List;
 
 import org.apache.log4j.Logger;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.Projections;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.dao.DataAccessException;
 import org.springframework.jdbc.support.JdbcAccessor;
+import org.springframework.orm.hibernate3.HibernateCallback;
 import org.springframework.orm.hibernate3.HibernateTemplate;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
@@ -137,4 +141,41 @@ final class DeletionDAO extends AbstractGenericEntityDAO<DeletionPE> implements
         return transformNumbers2TechIdList(results);
     }
 
+    public int trash(final EntityKind entityKind, final List<TechId> entityIds,
+            final DeletionPE deletion) throws DataAccessException
+    {
+        if (entityIds.isEmpty())
+        {
+            return 0;
+        }
+        final HibernateTemplate hibernateTemplate = getHibernateTemplate();
+        int updatedRows = (Integer) hibernateTemplate.execute(new HibernateCallback()
+            {
+
+                //
+                // HibernateCallback
+                //
+
+                public final Object doInHibernate(final Session session) throws HibernateException,
+                        SQLException
+                {
+                    // NOTE: 'VERSIONED' makes modification time modified too
+                    return session
+                            .createQuery(
+                                    "UPDATE VERSIONED "
+                                            + entityKind.getEntityClass().getSimpleName()
+                                            + " SET deletion = :deletion"
+                                            + " WHERE deletion IS NULL AND id IN (:ids) ")
+                            .setParameter("deletion", deletion)
+                            .setParameterList("ids", TechId.asLongs(entityIds)).executeUpdate();
+                }
+            });
+        if (operationLog.isInfoEnabled())
+        {
+            operationLog.info(String.format("trashing %d %ss", updatedRows, entityKind.getLabel()));
+        }
+        hibernateTemplate.flush();
+        return updatedRows;
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
index 756de7db2665d3725ad1962b9ddb996c30eb814a..2ab18131f7cedf587fc12664d854ad3a05348760 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
-import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -26,12 +25,9 @@ import java.util.Set;
 import org.apache.log4j.Logger;
 import org.hibernate.Criteria;
 import org.hibernate.FetchMode;
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.dao.DataAccessException;
-import org.springframework.orm.hibernate3.HibernateCallback;
 import org.springframework.orm.hibernate3.HibernateTemplate;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
@@ -40,9 +36,7 @@ import ch.systemsx.cisd.common.utilities.MethodUtils;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExperimentDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
-import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentTypePE;
@@ -304,40 +298,4 @@ public class ExperimentDAO extends AbstractGenericEntityWithPropertiesDAO<Experi
         }
     }
 
-    public int trash(final List<TechId> experimentIds, final DeletionPE deletion)
-            throws DataAccessException
-    {
-        if (experimentIds.isEmpty())
-        {
-            return 0;
-        }
-        final HibernateTemplate hibernateTemplate = getHibernateTemplate();
-        int updatedRows = (Integer) hibernateTemplate.execute(new HibernateCallback()
-            {
-
-                //
-                // HibernateCallback
-                //
-
-                public final Object doInHibernate(final Session session) throws HibernateException,
-                        SQLException
-                {
-                    // NOTE: 'VERSIONED' makes modification time modified too
-                    return session
-                            .createQuery(
-                                    "UPDATE VERSIONED "
-                                            + ExperimentPE.class.getSimpleName()
-                                            + " SET deletion = :deletion WHERE deletion IS NULL AND id IN (:ids) ")
-                            .setParameter("deletion", deletion)
-                            .setParameterList("ids", TechId.asLongs(experimentIds)).executeUpdate();
-                }
-            });
-        if (operationLog.isInfoEnabled())
-        {
-            operationLog.info(String.format("trashing %d experiments", updatedRows));
-        }
-        hibernateTemplate.flush();
-        return updatedRows;
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
index 5f1d9619aad0886bbb01b4c2de48bb0fbbd20a97..19f2d87176601f4165282ac6be4a5f90f81798c5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
-import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -26,7 +25,6 @@ import java.util.Set;
 import org.apache.log4j.Logger;
 import org.hibernate.Criteria;
 import org.hibernate.FetchMode;
-import org.hibernate.HibernateException;
 import org.hibernate.SQLQuery;
 import org.hibernate.Session;
 import org.hibernate.StatelessSession;
@@ -46,7 +44,6 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
@@ -467,42 +464,6 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
         scheduleRemoveFromFullTextIndex(ids);
     }
 
-    public int trash(final List<TechId> sampleIds, final DeletionPE deletion)
-            throws DataAccessException
-    {
-        if (sampleIds.isEmpty())
-        {
-            return 0;
-        }
-        final HibernateTemplate hibernateTemplate = getHibernateTemplate();
-        int updatedRows = (Integer) hibernateTemplate.execute(new HibernateCallback()
-            {
-
-                //
-                // HibernateCallback
-                //
-
-                public final Object doInHibernate(final Session session) throws HibernateException,
-                        SQLException
-                {
-                    // NOTE: 'VERSIONED' makes modification time modified too
-                    return session
-                            .createQuery(
-                                    "UPDATE VERSIONED "
-                                            + SamplePE.class.getSimpleName()
-                                            + " SET deletion = :deletion WHERE deletion IS NULL AND id IN (:ids) ")
-                            .setParameter("deletion", deletion)
-                            .setParameterList("ids", TechId.asLongs(sampleIds)).executeUpdate();
-                }
-            });
-        if (operationLog.isInfoEnabled())
-        {
-            operationLog.info(String.format("trashing %d samples", updatedRows));
-        }
-        hibernateTemplate.flush();
-        return updatedRows;
-    }
-
     public Set<TechId> listSampleIdsByChildrenIds(final Collection<TechId> children,
             final TechId relationship)
     {
@@ -550,7 +511,7 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
         if (operationLog.isDebugEnabled())
         {
             operationLog.info(String.format("found %d sample children for given parents",
-                results.size()));
+                    results.size()));
         }
         return result;
     }
@@ -565,7 +526,7 @@ public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE>
         if (operationLog.isDebugEnabled())
         {
             operationLog.info(String.format("found %s sample components for given containers",
-                results.size()));
+                    results.size()));
         }
         return transformNumbers2TechIdList(results);
     }