diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/logging/MockLogger.java b/common/sourceTest/java/ch/systemsx/cisd/common/logging/MockLogger.java
new file mode 100644
index 0000000000000000000000000000000000000000..a57e88cf342ffa78558781e60e8f7f57ad259ba7
--- /dev/null
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/logging/MockLogger.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.common.logging;
+
+import ch.systemsx.cisd.common.concurrent.MessageChannel;
+import ch.systemsx.cisd.common.logging.ISimpleLogger;
+import ch.systemsx.cisd.common.logging.LogLevel;
+
+/**
+ * A logger which records logging events. Log messages also sent to a {@link MessageChannel}.
+ *
+ * @author Franz-Josef Elmer
+ */
+public final class MockLogger implements ISimpleLogger
+{
+    private final StringBuilder builder = new StringBuilder();
+    private final MessageChannel messageChannel = new MessageChannel();
+    
+    public void log(LogLevel level, String message)
+    {
+        builder.append(level).append(": ").append(message).append('\n');
+        messageChannel.send(message);
+    }
+    
+    public void assertNextLogMessage(String expectedMessage)
+    {
+        messageChannel.assertNextMessage(expectedMessage);
+    }
+    
+    public void assertNoMoreLogMessages()
+    {
+        messageChannel.assertEmpty();
+    }
+
+    @Override
+    public String toString()
+    {
+        return builder.toString();
+    }
+}
\ No newline at end of file
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetDirectoryProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetDirectoryProvider.java
index 516bd86a7f4d8fc40b5cfabb895b972d2042fd30..0d9e7a70a4111d2c0fe3f7f9179148ca9512bba0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetDirectoryProvider.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetDirectoryProvider.java
@@ -51,4 +51,9 @@ public class DataSetDirectoryProvider implements IDataSetDirectoryProvider
         return new File(share, location);
     }
 
+    public IShareIdManager getShareIdManager()
+    {
+        return shareIdManager;
+    }
+
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DeletionCommand.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DeletionCommand.java
index 9b42683589b656ddb7faef55d9e6f9e6bd12bb61..b56610bba4a3673a1b80580913cabb88f61e75cd 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DeletionCommand.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DeletionCommand.java
@@ -18,17 +18,20 @@ package ch.systemsx.cisd.openbis.dss.generic.server;
 
 import java.io.File;
 import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.log4j.Logger;
 
-import ch.systemsx.cisd.common.TimingParameters;
-import ch.systemsx.cisd.common.filesystem.FileOperations;
-import ch.systemsx.cisd.common.filesystem.IFileRemover;
-import ch.systemsx.cisd.common.filesystem.LoggingPathRemoverDecorator;
+import ch.rinn.restrictions.Private;
+import ch.systemsx.cisd.common.logging.ISimpleLogger;
 import ch.systemsx.cisd.common.logging.Log4jSimpleLogger;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
+import ch.systemsx.cisd.openbis.dss.generic.shared.utils.SegmentedStoreUtils;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
 /**
@@ -43,24 +46,38 @@ class DeletionCommand extends AbstractDataSetDescriptionBasedCommand
     private final static Logger operationLog =
         LogFactory.getLogger(LogCategory.OPERATION, DeletionCommand.class);
     
-    private static final IFileRemover remover = new LoggingPathRemoverDecorator(
-            FileOperations.createMonitoredInstance(TimingParameters.getDefaultParameters()),
-            new Log4jSimpleLogger(operationLog), false);
-
     DeletionCommand(List<DatasetDescription> dataSets)
     {
         super(dataSets);
     }
 
-    public void execute(IDataSetDirectoryProvider dataSetDirectoryProvider)
+    public void execute(final IDataSetDirectoryProvider dataSetDirectoryProvider)
     {
-        for (DatasetDescription dataSet : dataSets)
+        final IShareIdManager shareIdManager = dataSetDirectoryProvider.getShareIdManager();
+        final ISimpleLogger logger = createLogger();
+        ThreadPoolExecutor executor =
+                new ThreadPoolExecutor(1, 10, 360, TimeUnit.SECONDS,
+                        new LinkedBlockingQueue<Runnable>());
+        for (final DatasetDescription dataSet : dataSets)
         {
-            File dataSetDirectory = dataSetDirectoryProvider.getDataSetDirectory(dataSet);
-            remover.removeRecursively(dataSetDirectory);
+            executor.submit(new Runnable()
+                {
+                    public void run()
+                    {
+                        File dataSetDirectory =
+                                dataSetDirectoryProvider.getDataSetDirectory(dataSet);
+                        SegmentedStoreUtils.deleteDataSet(dataSet.getDatasetCode(),
+                                dataSetDirectory, shareIdManager, logger);
+                    }
+                });
         }
     }
 
+    @Private ISimpleLogger createLogger()
+    {
+        return new Log4jSimpleLogger(operationLog);
+    }
+    
     public String getDescription()
     {
         final StringBuilder b = new StringBuilder();
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetDirectoryProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetDirectoryProvider.java
index 193b1eb10692a3bb6d63c864b52e7f42124b6618..9f3e0f8c76811b0a18f058a2f970acc101a0ba68 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetDirectoryProvider.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IDataSetDirectoryProvider.java
@@ -36,4 +36,10 @@ public interface IDataSetDirectoryProvider
      * Returns the root directory of specified data set.
      */
     public File getDataSetDirectory(DatasetDescription dataSet);
+
+    /**
+     * Returns the share id manager which is used for
+     * {@link #getDataSetDirectory(DatasetDescription)}.
+     */
+    public IShareIdManager getShareIdManager();
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
index 215631717d14e7b5c67f3d45562b5d0752d69ba9..9a5d414e8ae4c4a569eb707d2bc4714c8e388fa2 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
@@ -253,18 +253,35 @@ public class SegmentedStoreUtils
             {
                 public void run()
                 {
-                    logger.log(LogLevel.INFO, "Await for data set " + dataSetCode
-                            + " to be unlocked.");
-                    shareIdManager.await(dataSetCode);
-                    logger.log(LogLevel.INFO, "Start deleting data set " + dataSetCode + " at "
-                            + dataSetDirInStore);
-                    FileUtilities.deleteRecursively(dataSetDirInStore);
-                    logger.log(LogLevel.INFO, "Data set " + dataSetCode + " at "
-                            + dataSetDirInStore + " has been deleted.");
+                    deleteDataSet(dataSetCode, dataSetDirInStore, shareIdManager, logger);
                 }
             }).start();
     }
 
+    /**
+     * Deletes specified data set at specified location. This methods waits until any locks 
+     * on the specified data set have been released. 
+     */
+    public static void deleteDataSet(final String dataSetCode, final File dataSetDirInStore,
+            final IShareIdManager shareIdManager, final ISimpleLogger logger)
+    {
+        logger.log(LogLevel.INFO, "Await for data set " + dataSetCode
+                + " to be unlocked.");
+        shareIdManager.await(dataSetCode);
+        logger.log(LogLevel.INFO, "Start deleting data set " + dataSetCode + " at "
+                + dataSetDirInStore);
+        boolean successful = FileUtilities.deleteRecursively(dataSetDirInStore);
+        if (successful)
+        {
+            logger.log(LogLevel.INFO, "Data set " + dataSetCode + " at " + dataSetDirInStore
+                    + " has been successfully deleted.");
+        } else
+        {
+            logger.log(LogLevel.WARN, "Deletion of data set " + dataSetCode + " at "
+                    + dataSetDirInStore + " failed.");
+        }
+    }
+
     private static void copyToShare(File file, File share)
     {
         RsyncCopier copier = new RsyncCopier(OSUtilities.findExecutable(RSYNC_EXEC));
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java
index 635420e70f6014abb2f4dc7d73e70cede8ad7173..fca455531a98d25da1f303c18c307266e4d28946 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java
@@ -50,6 +50,7 @@ import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.logging.BufferedAppender;
 import ch.systemsx.cisd.common.mail.MailClientParameters;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
@@ -88,6 +89,11 @@ public class UploadingCommandTest extends AssertJUnit
         {
             return new File(new File(getStoreRoot(), SHARE_ID), dataSet.getDataSetLocation());
         }
+
+        public IShareIdManager getShareIdManager()
+        {
+            return null;
+        }
     }
     
     private static final String ZIP_FILENAME = "myData";
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java
index 8852381d70bc2c85459a47599033466f3365d761..28bc5c797b84c03cdee6d9e50ad1c39f8a26c14b 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/MockDataSetDirectoryProvider.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard;
 import java.io.File;
 
 import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
 public final class MockDataSetDirectoryProvider implements IDataSetDirectoryProvider
@@ -41,4 +42,9 @@ public final class MockDataSetDirectoryProvider implements IDataSetDirectoryProv
     {
         return new File(new File(getStoreRoot(), shareID), dataSet.getDataSetLocation());
     }
+
+    public IShareIdManager getShareIdManager()
+    {
+        return null;
+    }
 }
\ No newline at end of file
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java
index 32ffaf111cc0fa8206c92c695bbfcc90b979139e..1fe827f02783570931d9e59a0d4c8c053a715c10 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtilsTest.java
@@ -29,12 +29,10 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
-import ch.systemsx.cisd.common.concurrent.MessageChannel;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.filesystem.HostAwareFile;
 import ch.systemsx.cisd.common.filesystem.IFreeSpaceProvider;
-import ch.systemsx.cisd.common.logging.ISimpleLogger;
-import ch.systemsx.cisd.common.logging.LogLevel;
+import ch.systemsx.cisd.common.logging.MockLogger;
 import ch.systemsx.cisd.common.test.RecordingMatcher;
 import ch.systemsx.cisd.common.utilities.ITimeProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
@@ -49,34 +47,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
  */
 public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase
 {
-    private static final class MockLogger implements ISimpleLogger
-    {
-        private final StringBuilder builder = new StringBuilder();
-        private final MessageChannel messageChannel = new MessageChannel();
-        
-        public void log(LogLevel level, String message)
-        {
-            builder.append(level).append(": ").append(message).append('\n');
-            messageChannel.send(message);
-        }
-        
-        public void assertNextLogMessage(String expectedMessage)
-        {
-            messageChannel.assertNextMessage(expectedMessage);
-        }
-        
-        public void assertNoMoreLogMessages()
-        {
-            messageChannel.assertEmpty();
-        }
-
-        @Override
-        public String toString()
-        {
-            return builder.toString();
-        }
-    }
-    
     private static final String DATA_STORE_CODE = "ds-code";
     
     private Mockery context;
@@ -229,7 +199,7 @@ public class SegmentedStoreUtilsTest extends AbstractFileSystemTestCase
         log.assertNextLogMessage("Start deleting data set ds-1 at " + share1
                 + "/uuid/01/02/03/ds-1");
         log.assertNextLogMessage("Data set ds-1 at " + share1
-                + "/uuid/01/02/03/ds-1 has been deleted.");
+                + "/uuid/01/02/03/ds-1 has been successfully deleted.");
         assertEquals(false, dataSetDirInStore.exists());
         assertFileNames(share2uuid01, "02", "22");
         assertEquals("hello world\n",