diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncArchiver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncArchiver.java
index 06a5d836fb670e87180b4b07f2e4147e546b14ad..0b5037439ea12ed789c3345a00f9c25b916307c0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncArchiver.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncArchiver.java
@@ -27,8 +27,8 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.ArchiverTaskCon
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
 /**
- * Archiver plugin which copies data sets to a destination folder using rsync (if it is remote). 
- * The destination can be
+ * Archiver plugin which copies data sets to a destination folder using rsync (if it is remote). The
+ * destination can be
  * <ul>
  * <li>on the local file system,
  * <li>a mounted remote folder,
@@ -62,39 +62,16 @@ public class RsyncArchiver extends AbstractArchiverProcessingPlugin
         this.sshCommandExecutorFactory = sshCommandExecutorFactory;
     }
 
-    private boolean isInitialized()
-    {
-        return copier != null;
-    }
-
-    private void init()
-    {
-        this.copier =
-                new RsyncDataSetCopier(properties, pathCopierFactory, sshCommandExecutorFactory);
-    }
-
-    private Status doArchive(DatasetDescription dataset, File originalData)
-    {
-        return copier.copyToDestination(originalData, dataset);
-    }
-
-    private Status doUnarchive(DatasetDescription dataset, File originalData)
-    {
-        return copier.retrieveFromDestination(originalData, dataset);
-    }
-
     @Override
     protected DatasetProcessingStatuses doArchive(List<DatasetDescription> datasets,
             ArchiverTaskContext context) throws UserFailureException
     {
-        if (isInitialized() == false)
-        {
-            init();
-        }
+        initIfNecessary();
+
         DatasetProcessingStatuses statuses = new DatasetProcessingStatuses();
         for (DatasetDescription dataset : datasets)
         {
-            File originalData = context.getDirectoryProvider().getDataSetDirectory(dataset);
+            File originalData = getDatasetDirectory(context, dataset);
             Status status = doArchive(dataset, originalData);
             statuses.addResult(dataset.getDatasetCode(), status, true);
         }
@@ -106,36 +83,77 @@ public class RsyncArchiver extends AbstractArchiverProcessingPlugin
     protected DatasetProcessingStatuses doUnarchive(List<DatasetDescription> datasets,
             ArchiverTaskContext context) throws UserFailureException
     {
-        if (isInitialized() == false)
-        {
-            init();
-        }
+        initIfNecessary();
 
         // no need to lock - this is processing task
         DatasetProcessingStatuses statuses = new DatasetProcessingStatuses();
         for (DatasetDescription dataset : datasets)
         {
-            File originalData = context.getDirectoryProvider().getDataSetDirectory(dataset);
+            File originalData = getDatasetDirectory(context, dataset);
             Status status = doUnarchive(dataset, originalData);
             statuses.addResult(dataset.getDatasetCode(), status, false);
         }
 
-        return createStatusesFrom(Status.OK, datasets, false);
+        return statuses;
+    }
+
+    // TODO do we really need the status?
+    protected DatasetProcessingStatuses doDeleteFromArchive(List<DatasetDescription> datasets,
+            ArchiverTaskContext context)
+    {
+        initIfNecessary();
+
+        // no need to lock - this is processing task
+        DatasetProcessingStatuses statuses = new DatasetProcessingStatuses();
+        for (DatasetDescription dataset : datasets)
+        {
+            File originalData = getDatasetDirectory(context, dataset);
+            Status status = doDeleteFromArchive(dataset, originalData);
+            statuses.addResult(dataset.getDatasetCode(), status, false); // false -> deletion
+        }
+
+        return statuses;
     }
 
-    protected boolean isProperlyArchived() throws UserFailureException
+    /**
+     * @return <code>true</code> if the dataset is present in the archive, <code>false</code>
+     *         otherwise.
+     */
+    protected boolean isDataSetPresentInArchive(DatasetDescription dataset,
+            ArchiverTaskContext context)
     {
-        return true;
+        initIfNecessary();
+
+        File originalData = getDatasetDirectory(context, dataset);
+        return copier.isPresentInDestination(originalData, dataset);
     }
 
-    protected void doDeleteFromArchive() throws UserFailureException
+    private void initIfNecessary()
     {
+        if (copier == null)
+        {
+            this.copier =
+                    new RsyncDataSetCopier(properties, pathCopierFactory, sshCommandExecutorFactory);
+        }
+    }
 
+    private Status doArchive(DatasetDescription dataset, File originalData)
+    {
+        return copier.copyToDestination(originalData, dataset);
     }
 
-    protected void doDeleteFromDss() throws UserFailureException
+    private Status doUnarchive(DatasetDescription dataset, File originalData)
     {
+        return copier.retrieveFromDestination(originalData, dataset);
+    }
 
+    private Status doDeleteFromArchive(DatasetDescription dataset, File originalData)
+    {
+        return copier.deleteFromDestination(originalData, dataset);
     }
 
+    private File getDatasetDirectory(ArchiverTaskContext context, DatasetDescription dataset)
+    {
+        return context.getDirectoryProvider().getDataSetDirectory(dataset);
+    }
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncDataSetCopier.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncDataSetCopier.java
index b1428d4fdb174782e879f208677ec7fb02a4ecee..60c0ec369a1a3936648c052cdb3b76cf570e93f2 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncDataSetCopier.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/RsyncDataSetCopier.java
@@ -44,7 +44,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
  * 
  * @author Piotr Buczek
  */
-public class RsyncDataSetCopier
+public class RsyncDataSetCopier // TODO rename to DataSetFileOperationsManager
 {
 
     private static final String DESTINATION_KEY = "destination";
@@ -101,8 +101,8 @@ public class RsyncDataSetCopier
     }
 
     /**
-     * Copies specified data file/folder to destination specified in constructor. The path of the
-     * file/folder at the destination is defined by the original location of the data set.
+     * Copies specified dataset's data to destination specified in constructor. The path at the
+     * destination is defined by the original location of the data set.
      */
     public Status copyToDestination(File originalData, DatasetDescription dataset)
     {
@@ -121,8 +121,8 @@ public class RsyncDataSetCopier
     }
 
     /**
-     * Retrieves specified data file/folder from the destination specified in constructor. The path
-     * at the destination is defined by original location of the data set.
+     * Retrieves specified datases's data from the destination specified in constructor. The path at
+     * the destination is defined by original location of the data set.
      */
     public Status retrieveFromDestination(File originalData, DatasetDescription dataset)
     {
@@ -140,6 +140,51 @@ public class RsyncDataSetCopier
         }
     }
 
+    /**
+     * Deletes specified datases's data from the destination specified in constructor. The path at
+     * the destination is defined by original location of the data set.
+     */
+    public Status deleteFromDestination(File originalData, DatasetDescription dataset)
+    {
+        try
+        {
+            File destinationFolder = new File(destination, dataset.getDataSetLocation());
+            BooleanStatus destinationExists = destinationExists(destinationFolder);
+            if (destinationExists.isSuccess())
+            {
+                executor.deleteFolder(destinationFolder);
+            } else
+            {
+                operationLog.info("Data of data set '" + dataset.getDatasetCode()
+                        + "' don't exist in the destination '" + destinationFolder.getPath()
+                        + "'. There is nothing to delete.");
+            }
+            return Status.OK;
+        } catch (ExceptionWithStatus ex)
+        {
+            return ex.getStatus();
+        }
+    }
+
+    /**
+     * Checks if specified dataset's data are present in the destination specified in constructor.
+     * The path at the destination is defined by original location of the data set.
+     */
+    public boolean isPresentInDestination(File originalData, DatasetDescription dataset)
+    {
+        try
+        {
+            File destinationFolder = new File(destination, dataset.getDataSetLocation());
+            BooleanStatus destinationExists = destinationExists(destinationFolder);
+            // TODO check file sizes
+            return destinationExists.isSuccess();
+        } catch (ExceptionWithStatus ex)
+        {
+            // TODO?
+            return false; // ex.getStatus();
+        }
+    }
+
     private void checkDestinationExists(File destinationFolder)
     {
         BooleanStatus destinationExists = destinationExists(destinationFolder);