diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/IncomingFileDeletedBeforeRegistrationException.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/IncomingFileDeletedBeforeRegistrationException.java
new file mode 100644
index 0000000000000000000000000000000000000000..f26abc4e6b8f68706f2e07660d2474fb49f99f0f
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/IncomingFileDeletedBeforeRegistrationException.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2012 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.etlserver.registrator;
+
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+/**
+ * An exception that is thrown if it is determined that the incoming file to register was deleted
+ * before any registrations happened.
+ * 
+ * @author Chandrasekhar Ramakrishnan
+ */
+public class IncomingFileDeletedBeforeRegistrationException extends UserFailureException
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * @param message
+     */
+    public IncomingFileDeletedBeforeRegistrationException(String message)
+    {
+        super(message);
+    }
+
+}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
index 0c76ea2ccb3f055a34e6d016312ee590e2d87029..7d20982bce93469d4d828b8550c849ccce4dc30f 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
@@ -42,6 +42,7 @@ import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithmRunner;
 import ch.systemsx.cisd.etlserver.registrator.IDataSetOnErrorActionDecision.ErrorType;
 import ch.systemsx.cisd.etlserver.registrator.IDataSetRegistrationDetailsFactory;
 import ch.systemsx.cisd.etlserver.registrator.IEntityOperationService;
+import ch.systemsx.cisd.etlserver.registrator.IncomingFileDeletedBeforeRegistrationException;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSet;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetRegistrationTransaction;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetUpdatable;
@@ -541,6 +542,18 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem
         IEntityOperationService<T> entityRegistrationService =
                 registrationService.getEntityRegistrationService();
 
+        File realIncomingFile = getIncomingDataSetFile().getRealIncomingFile();
+        if (false == realIncomingFile.exists())
+        {
+            StringBuilder sb = new StringBuilder();
+            sb.append("Incoming file [");
+            sb.append(realIncomingFile.getAbsolutePath());
+            sb.append("] ");
+            sb.append(" was deleted before registration.");
+
+            throw new IncomingFileDeletedBeforeRegistrationException(sb.toString());
+        }
+
         entityRegistrationService.performOperationsInApplcationServer(registrationDetails);
     }
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java
index d04e8b8fe21f6c7d463910f2c85422d9d06f4928..443206b71d78b72790085341dfd84b021fa4d36a 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java
@@ -411,7 +411,6 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
                 StorageProcessorTransactionParameters parameters)
         {
             final File rootDir = parameters.getRootDir();
-            System.out.println("Store dir " + rootDir);
             dataSetInfoString = parameters.getDataSetInformation().toString();
             return new IStorageProcessorTransaction()
                 {
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
index 0183c0b601e46f2a9ea191fde4e697663b4a92d9..5776da5cdfcf86cfdc895d5c326c530946a48c6d 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
@@ -921,6 +921,10 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH
         {
             TestCaseParameters testCase = new TestCaseParameters(title);
             testCase.shouldUseAutoRecovery = true;
+            if (deletionPoint == DeletionPoint.BEFORE_OPENBIS_REGISTRATION)
+            {
+                testCase.failurePoint = TestCaseParameters.FailurePoint.BEFORE_OPENBIS_REGISTRATION;
+            }
 
             return testCase;
         }
@@ -982,10 +986,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH
         {
             return;
         }
-        if (testCase.deletionPoint == IncomingFileDeletedTestCaseParameters.DeletionPoint.BEFORE_OPENBIS_REGISTRATION)
-        {
-            return;
-        }
         initializeStorageRecoveryManagerMock();
         setUpHomeDataBaseExpectations();
 
@@ -1015,7 +1015,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH
             assertEquals("[]", Arrays.asList(stagingDirectory.list()).toString());
         } else
         {
-            assertEquals(0, MockStorageProcessor.instance.incomingDirs.size());
+            assertEquals(1, MockStorageProcessor.instance.incomingDirs.size());
             assertEquals(0, MockStorageProcessor.instance.calledCommitCount);
             assertEquals("[]", Arrays.asList(stagingDirectory.list()).toString());
         }
@@ -1023,12 +1023,31 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH
         context.assertIsSatisfied();
     }
 
+    @SuppressWarnings("unchecked")
     private ExpectationBuilder getTestIncomingFileDeletedExcpectations(
             final IncomingFileDeletedTestCaseParameters testCase,
             final RecordingMatcher<AtomicEntityOperationDetails> atomicOperationDetails)
     {
-        return getSimpleTransactionExpectations(testCase.toTestCaseParameters(),
-                atomicOperationDetails);
+        Expectations e =
+                getSimpleTransactionExpectations(testCase.toTestCaseParameters(),
+                        atomicOperationDetails);
+        if (testCase.deletionPoint == IncomingFileDeletedTestCaseParameters.DeletionPoint.BEFORE_OPENBIS_REGISTRATION)
+        {
+            e.one(openBisService).drawANewUniqueID();
+            e.will(Expectations.returnValue(new Long(1)));
+
+            e.one(storageRecoveryManager).checkpointPrecommittedState(
+                    e.with(Expectations.any(TechId.class)),
+                    e.with(Expectations.any(DataSetStorageAlgorithmRunner.class)));
+
+            e.one(storageRecoveryManager).canRecoverFromError(
+                    e.with(Expectations.any(UserFailureException.class)));
+            e.will(Expectations.returnValue(false));
+
+            // e.one(storageRecoveryManager).removeCheckpoint(
+            // e.with(Expectations.any(DataSetStorageAlgorithmRunner.class)));
+        }
+        return e;
     }
 
     @Test
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py
index 1130ccdee95a70ac8145e0f99434490fb726cc40..e675be1c6ace8bde8062524eaf4a773f2a579c3d 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py
@@ -1,12 +1,13 @@
 from java.lang import IllegalArgumentException
 from java.io import File
+from ch.systemsx.cisd.common.filesystem import FileUtilities
 
 execfile("sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py")
 
 def post_metadata_registration(context):
   path_to_delete = context.getPersistentMap().get("path")
   file_to_delete = File(path_to_delete)
-  file_to_delete.delete()
+  FileUtilities.deleteRecursively(file_to_delete)
   jythonHookTestTool.log("post_metadata_registration")
 
 def process(tr):
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py
index 7a3206ddbfe8f8cb6cfbb834f93e755a28f5f01a..72990392c350b3e79e8f5c0bfe7bd4c0f783db99 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py
@@ -1,12 +1,13 @@
 from java.lang import IllegalArgumentException
 from java.io import File
+from ch.systemsx.cisd.common.filesystem import FileUtilities
 
 execfile("sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py")
 
 def pre_metadata_registration(context):
   path_to_delete = context.getPersistentMap().get("path")
   file_to_delete = File(path_to_delete)
-  file_to_delete.delete()
+  FileUtilities.deleteRecursively(file_to_delete)
   jythonHookTestTool.log("pre_metadata_registration")
 
 def process(tr):