diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DataSetRegistrationAlgorithmTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DataSetRegistrationAlgorithmTest.java
index 5c6c29203f11825865628bc585bcc8851563e07b..99f2c62ad3c33629d4b75f19b57c3e903b16ad5b 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DataSetRegistrationAlgorithmTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DataSetRegistrationAlgorithmTest.java
@@ -29,9 +29,11 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.filesystem.FileOperations;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.filesystem.IFileOperations;
+import ch.systemsx.cisd.common.mail.From;
 import ch.systemsx.cisd.common.mail.IMailClient;
 import ch.systemsx.cisd.common.test.RecordingMatcher;
 import ch.systemsx.cisd.common.utilities.IDelegatedActionWithResult;
@@ -42,12 +44,19 @@ import ch.systemsx.cisd.etlserver.validation.IDataSetValidator;
 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.basic.dto.DataSetType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
 
 /**
+ * Tests the data set registration algorithm.
+ * <p>
+ * To debug: add a rollback expectation and print the contents of the exceptionMatcher.
+ * 
  * @author Chandrasekhar Ramakrishnan
  */
 public class DataSetRegistrationAlgorithmTest extends AbstractFileSystemTestCase
@@ -137,32 +146,127 @@ public class DataSetRegistrationAlgorithmTest extends AbstractFileSystemTestCase
         storedDataSetFile = createDirectory("stored_data_set");
 
         FileUtilities.writeToFile(new File(incomingDataSetFile, "read.me"), "hello world");
-        setUpExpectations(incomingDataSetFile);
 
-        createAlgorithmAndState(true, false);
+        setUpOpenBisExpectations();
+        setUpTypeExtractorExpectations();
+        setUpStorageProcessorExpectations(true);
+        setUpDataSetValidatorExpectations();
+        setUpDataStoreStrategyExpectations(DataStoreStrategyKey.IDENTIFIED);
+        setUpPreAndPostRegistrationExpectations();
+        setUpLockExpectations();
+        setUpDataSetRegistratorExpectations();
+        setUpCleanAfterwardsExpectations();
 
-        new DataSetRegistrationAlgorithmRunner(registrationAlgorithm).runAlgorithm();
+        createAlgorithmAndState(false, false);
 
-        for (Throwable ex : exceptionMatcher.getRecordedObjects())
-        {
-            ex.printStackTrace();
-        }
+        new DataSetRegistrationAlgorithmRunner(registrationAlgorithm).runAlgorithm();
 
         context.assertIsSatisfied();
     }
 
-    private void setUpExpectations(final File incomingDataSetFile) throws Throwable
+    @Test
+    public void testSuccessfulRegistrationWithNotification() throws Throwable
     {
+        incomingDataSetFile = createDirectory("data_set");
+        storedDataSetFile = createDirectory("stored_data_set");
+
+        FileUtilities.writeToFile(new File(incomingDataSetFile, "read.me"), "hello world");
+
         setUpOpenBisExpectations();
         setUpTypeExtractorExpectations();
-        setUpStorageProcessorExpectations();
+        setUpStorageProcessorExpectations(true);
         setUpDataSetValidatorExpectations();
-        setUpDataStoreStrategyExpectations();
+        setUpDataStoreStrategyExpectations(DataStoreStrategyKey.IDENTIFIED);
         setUpPreAndPostRegistrationExpectations();
         setUpLockExpectations();
         setUpDataSetRegistratorExpectations();
+        setUpMailClientExpectation();
         setUpCleanAfterwardsExpectations();
+
+        createAlgorithmAndState(false, true);
+
+        new DataSetRegistrationAlgorithmRunner(registrationAlgorithm).runAlgorithm();
+
+        context.assertIsSatisfied();
+    }
+
+    @Test
+    public void testUnidentifiedDataSetRegistration() throws Throwable
+    {
+        incomingDataSetFile = createDirectory("data_set");
+        storedDataSetFile = createDirectory("stored_data_set");
+
+        FileUtilities.writeToFile(new File(incomingDataSetFile, "read.me"), "hello world");
+
+        setUpOpenBisExpectations();
+
+        context.checking(new Expectations()
+            {
+                {
+                    one(typeExtractor).getDataSetType(incomingDataSetFile);
+                    will(returnValue(DATA_SET_TYPE));
+
+                    one(storageProcessor).getStoreRootDirectory();
+                    will(returnValue(workingDirectory));
+                }
+            });
+
+        setUpDataStoreStrategyExpectations(DataStoreStrategyKey.UNIDENTIFIED);
+
+        createAlgorithmAndState(false, true);
+
+        new DataSetRegistrationAlgorithmRunner(registrationAlgorithm).runAlgorithm();
+
+        context.assertIsSatisfied();
+    }
+
+    @Test
+    public void testFailedDataSetRegistration() throws Throwable
+    {
+        incomingDataSetFile = createDirectory("data_set");
+        storedDataSetFile = createDirectory("stored_data_set");
+
+        FileUtilities.writeToFile(new File(incomingDataSetFile, "read.me"), "hello world");
+
+        setUpOpenBisExpectations();
+        setUpTypeExtractorExpectations();
+        setUpStorageProcessorExpectations(false);
+        setUpDataSetValidatorExpectations();
+        setUpDataStoreStrategyExpectations(DataStoreStrategyKey.IDENTIFIED);
+        setUpLockExpectations();
+
+        context.checking(new Expectations()
+            {
+                {
+                    one(preRegistrationAction).execute(DATA_SET_CODE,
+                            incomingDataSetFile.getAbsolutePath());
+
+                    one(appServerRegistrator).registerDataSetInApplicationServer(
+                            with(any(NewExternalData.class)));
+                    will(throwException(new UserFailureException("Could not register")));
+
+                }
+            });
+
         setUpRollbackExpectations();
+
+        createAlgorithmAndState(false, false);
+
+        new DataSetRegistrationAlgorithmRunner(registrationAlgorithm).runAlgorithm();
+
+        context.assertIsSatisfied();
+    }
+
+    /**
+     * Used for debugging.
+     */
+    @SuppressWarnings("unused")
+    private void printExceptions()
+    {
+        for (Throwable ex : exceptionMatcher.getRecordedObjects())
+        {
+            ex.printStackTrace();
+        }
     }
 
     private void setUpOpenBisExpectations()
@@ -202,7 +306,7 @@ public class DataSetRegistrationAlgorithmTest extends AbstractFileSystemTestCase
             });
     }
 
-    private void setUpStorageProcessorExpectations()
+    private void setUpStorageProcessorExpectations(final boolean shouldSucceed)
     {
         final Action storeDataAction = new CustomAction("StoreData")
             {
@@ -227,13 +331,29 @@ public class DataSetRegistrationAlgorithmTest extends AbstractFileSystemTestCase
                     one(storageProcessor).getStorageFormat();
                     will(returnValue(StorageFormat.PROPRIETARY));
 
-                    one(storageProcessor).commit(incomingDataSetFile, workingDirectory);
+                    if (shouldSucceed)
+                    {
+                        one(storageProcessor).commit(incomingDataSetFile, workingDirectory);
+                    }
                 }
             });
     }
 
-    private void setUpDataStoreStrategyExpectations()
+    private void setUpDataStoreStrategyExpectations(final DataStoreStrategyKey key)
     {
+        final boolean isIdentified = DataStoreStrategyKey.IDENTIFIED == key;
+        if (isIdentified)
+        {
+            Experiment experiment = new Experiment();
+            experiment.setIdentifier("/SPACE/PROJECT/EXP-CODE");
+            experiment.setCode("EXP-CODE");
+            Person registrator = new Person();
+            registrator.setEmail("email@email.com");
+            experiment.setRegistrator(registrator);
+            dataSetInformation.setExperiment(experiment);
+            dataSetInformation.setExperimentIdentifier(new ExperimentIdentifierFactory(experiment
+                    .getIdentifier()).createIdentifier());
+        }
         context.checking(new Expectations()
             {
                 {
@@ -242,7 +362,14 @@ public class DataSetRegistrationAlgorithmTest extends AbstractFileSystemTestCase
                     will(returnValue(workingDirectory));
 
                     one(dataStoreStrategy).getKey();
-                    will(returnValue(DataStoreStrategyKey.IDENTIFIED));
+                    will(returnValue(key));
+
+                    if (false == isIdentified)
+                    {
+                        one(dataStoreStrategy).getTargetPath(workingDirectory, incomingDataSetFile);
+                        will(returnValue(incomingDataSetFile));
+                    }
+
                 }
             });
     }
@@ -293,12 +420,24 @@ public class DataSetRegistrationAlgorithmTest extends AbstractFileSystemTestCase
             });
     }
 
+    private void setUpMailClientExpectation()
+    {
+        context.checking(new Expectations()
+            {
+                {
+                    one(mailClient).sendMessage(with(any(String.class)), with(any(String.class)),
+                            with(aNull(String.class)), with(aNull(From.class)),
+                            with(any(String[].class)));
+                }
+            });
+    }
+
     private void setUpCleanAfterwardsExpectations()
     {
         context.checking(new Expectations()
             {
                 {
-                    one(cleanAftrewardsAction).execute();
+                    exactly(2).of(cleanAftrewardsAction).execute();
                     will(returnValue(Boolean.TRUE));
                 }
             });
@@ -309,8 +448,8 @@ public class DataSetRegistrationAlgorithmTest extends AbstractFileSystemTestCase
         context.checking(new Expectations()
             {
                 {
-                    allowing(rollbackDelegate).rollback(
-                            with(any(DataSetRegistrationAlgorithm.class)), with(exceptionMatcher));
+                    one(rollbackDelegate).rollback(with(any(DataSetRegistrationAlgorithm.class)),
+                            with(exceptionMatcher));
                 }
             });
     }