diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java
index 406417c21d8dc485a7cff3dfea45d16e84b1c52c..6993ee1df2c424d68714bd44117a0e5cfaac8f7b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessor.java
@@ -101,9 +101,10 @@ abstract public class AbstractDelegatingStorageProcessor implements IStorageProc
                 incomingDataSetDirectory, rootDir);
     }
 
-    public void unstoreData(final File incomingDataSetDirectory, final File storedDataDirectory)
+    public UnstoreDataAction unstoreData(final File incomingDataSetDirectory,
+            final File storedDataDirectory, Throwable exception)
     {
-        delegate.unstoreData(incomingDataSetDirectory, storedDataDirectory);
+        return delegate.unstoreData(incomingDataSetDirectory, storedDataDirectory, exception);
     }
 
     public StorageFormat getStorageFormat()
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java
index 6ca7187bffba8cd893fb3e73ac5334ed28f1bd20..0f82df7c0a8a7b675ba5b58e725ed48164837751 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/AbstractDelegatingStorageProcessorWithDropbox.java
@@ -147,14 +147,14 @@ abstract public class AbstractDelegatingStorageProcessorWithDropbox extends
     }
 
     @Override
-    public final void unstoreData(final File incomingDataSetDirectory,
-            final File storedDataDirectory)
+    public UnstoreDataAction unstoreData(final File incomingDataSetDirectory,
+            final File storedDataDirectory, Throwable exception)
     {
         if (recentlyStoredDropboxDataset != null && recentlyStoredDropboxDataset.exists())
         {
             fileOperations.deleteRecursively(recentlyStoredDropboxDataset);
         }
         recentlyStoredDropboxDataset = null;
-        super.unstoreData(incomingDataSetDirectory, storedDataDirectory);
+        return super.unstoreData(incomingDataSetDirectory, storedDataDirectory, exception);
     }
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java
index e5cc4408327c67190ea87985083b66587ad8bcc9..9336bbac572f3ddce2208a76c92ee9887777f5ba 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/BDSStorageProcessor.java
@@ -478,7 +478,14 @@ public final class BDSStorageProcessor extends AbstractStorageProcessor implemen
         return dataStructureDir;
     }
 
-    public final void unstoreData(final File incomingDataSetDirectory,
+    public UnstoreDataAction unstoreData(File incomingDataSetDirectory, File storedDataDirectory,
+            Throwable exception)
+    {
+        unstoreData(incomingDataSetDirectory, storedDataDirectory);
+        return UnstoreDataAction.MOVE_TO_ERROR;
+    }
+
+    private final void unstoreData(final File incomingDataSetDirectory,
             final File storedDataDirectory)
     {
         checkParameters(incomingDataSetDirectory, storedDataDirectory);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java
index 35fa2700b6dda857d7a24d748f1a647befd15b4a..f756a57ab94fd8faeb72f68bd3358d6fbe8ccee1 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultStorageProcessor.java
@@ -68,8 +68,8 @@ public class DefaultStorageProcessor extends AbstractStorageProcessor
         return rootDir;
     }
 
-    public final void unstoreData(final File incomingDataSetDirectory,
-            final File storedDataDirectory)
+    public UnstoreDataAction unstoreData(final File incomingDataSetDirectory,
+            final File storedDataDirectory, Throwable exception)
     {
         checkParameters(incomingDataSetDirectory, storedDataDirectory);
         File targetFile =
@@ -79,6 +79,7 @@ public class DefaultStorageProcessor extends AbstractStorageProcessor
         // directory structure will persist. Right now, we consider this is fine as these empty
         // directories will not disturb the running application.
         FileRenamer.renameAndLog(targetFile, incomingDataSetDirectory);
+        return UnstoreDataAction.MOVE_TO_ERROR;
     }
 
     private static File getOriginalDirectory(final File storedDataDirectory)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java
index 4e87d141299efd4c340b7b91dded3105949b7ce5..dce604405eeb5777791f0dd4bd318f897325ac33 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IStorageProcessor.java
@@ -62,6 +62,22 @@ public interface IStorageProcessor extends IStoreRootDirectoryHolder
             final ITypeExtractor typeExtractor, final IMailClient mailClient,
             final File incomingDataSetDirectory, final File rootDir);
 
+    /**
+     * Instructs the dataset handler what to do with the data in incoming directory if there was an
+     * error during registration in openbis.
+     */
+    public enum UnstoreDataAction
+    {
+        /**
+         * moved the data to the error directory
+         */
+        MOVE_TO_ERROR,
+        /**
+         * leave the data in the incoming directory
+         */
+        LEAVE_UNTOUCH
+    }
+
     /**
      * Performs a rollback of
      * {@link #storeData(SamplePE, DataSetInformation, ITypeExtractor, IMailClient, File, File)} The
@@ -73,8 +89,11 @@ public interface IStorageProcessor extends IStoreRootDirectoryHolder
      * 
      * @param incomingDataSetDirectory original folder to be restored.
      * @param storedDataDirectory directory which contains the data to be restored.
+     * @param exception an exception which has caused that the unstore operation has to be performed
+     * @return an instruction what to do with the data in incoming directory
      */
-    public void unstoreData(final File incomingDataSetDirectory, final File storedDataDirectory);
+    public UnstoreDataAction unstoreData(final File incomingDataSetDirectory,
+            final File storedDataDirectory, Throwable exception);
 
     /**
      * Returns the format that this storage processor is storing data sets in.
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java
index d5ef3778cd6bbc9c109e9f88d7a653c997348d14..56471ee83f4a60ee7382e35a571b97f016c19aa0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java
@@ -55,6 +55,7 @@ import ch.systemsx.cisd.common.types.BooleanOrUnknown;
 import ch.systemsx.cisd.common.utilities.BeanUtils;
 import ch.systemsx.cisd.common.utilities.IDelegatedActionWithResult;
 import ch.systemsx.cisd.common.utilities.ISelfTestable;
+import ch.systemsx.cisd.etlserver.IStorageProcessor.UnstoreDataAction;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetType;
@@ -466,9 +467,10 @@ public final class TransferredDataSetHandler implements IPathHandler, ISelfTesta
             {
                 throw (Error) throwable;
             }
-            storageProcessor.unstoreData(incomingDataSetFile, baseDirectoryHolder
-                    .getBaseDirectory());
-            if (stopped == false)
+            UnstoreDataAction action =
+                    storageProcessor.unstoreData(incomingDataSetFile, baseDirectoryHolder
+                            .getBaseDirectory(), throwable);
+            if (stopped == false && action == UnstoreDataAction.MOVE_TO_ERROR)
             {
                 final File baseDirectory =
                         createBaseDirectory(ERROR_DATA_STRATEGY, storeRoot, dataSetInformation);