diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/ContainerDataSetStorageAlgorithm.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/ContainerDataSetStorageAlgorithm.java
index 86890aa7565ae8761062a42e507947526750da14..a6e9d090377d1601053be2c0fc530780065a939b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/ContainerDataSetStorageAlgorithm.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/ContainerDataSetStorageAlgorithm.java
@@ -25,6 +25,9 @@ import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional.IStorageProcessorTransaction;
 import ch.systemsx.cisd.etlserver.NullStorageProcessorTransaction;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.impl.ConversionUtils;
+import ch.systemsx.cisd.etlserver.registrator.recovery.DataSetStoragePrecommitRecoveryAlgorithm;
+import ch.systemsx.cisd.etlserver.registrator.recovery.DataSetStorageRecoveryAlgorithm;
+import ch.systemsx.cisd.etlserver.registrator.recovery.DataSetStorageStoredRecoveryAlgorithm;
 import ch.systemsx.cisd.etlserver.validation.IDataSetValidator;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
@@ -63,6 +66,16 @@ public class ContainerDataSetStorageAlgorithm<T extends DataSetInformation> exte
                 precommitDirectory);
     }
 
+    /**
+     * Creates algorithm from a recovery algorithm.
+     */
+    public ContainerDataSetStorageAlgorithm(IDataStoreStrategy dataStoreStrategy,
+            IStorageProcessorTransactional storageProcessor, IFileOperations fileOperations,
+            IMailClient mailClient, DataSetStorageRecoveryAlgorithm<T> recoveryAlgorithm)
+    {
+        super(dataStoreStrategy, storageProcessor, fileOperations, mailClient, recoveryAlgorithm);
+    }
+
     @Override
     public IStorageProcessorTransaction prepare(IRollbackStack rollbackStack)
     {
@@ -100,6 +113,12 @@ public class ContainerDataSetStorageAlgorithm<T extends DataSetInformation> exte
         // assert precommitted state - return in committed state
     }
 
+    @Override
+    public void cleanPrecommitDirectory()
+    {
+        // do nothing
+    }
+
     @Override
     public NewExternalData createExternalData()
     {
@@ -121,4 +140,21 @@ public class ContainerDataSetStorageAlgorithm<T extends DataSetInformation> exte
         return "Error trying to register container data set '" + getDataSetInformation().toString()
                 + "'.";
     }
+
+    @Override
+    public DataSetStoragePrecommitRecoveryAlgorithm<T> getPrecommitRecoveryAlgorithm()
+    {
+        return new DataSetStoragePrecommitRecoveryAlgorithm<T>(getDataSetInformation(),
+                getDataStoreStrategy().getKey(), getIncomingDataSetFile(), getStagingDirectory(),
+                getPreCommitDirectory(), getDataStoreCode());
+    }
+
+    @Override
+    public DataSetStorageStoredRecoveryAlgorithm<T> getStoredRecoveryAlgorithm()
+    {
+        return new DataSetStorageStoredRecoveryAlgorithm<T>(getDataSetInformation(),
+                getDataStoreStrategy().getKey(), getIncomingDataSetFile(), getStagingDirectory(),
+                getPreCommitDirectory(), getDataStoreCode());
+    }
+
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageAlgorithm.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageAlgorithm.java
index 19131e2fe0bd4665cac907ea52f2e112ffe34056..27ad989e489e584632b42bdd4e91dd27d664a19f 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageAlgorithm.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageAlgorithm.java
@@ -44,6 +44,7 @@ import ch.systemsx.cisd.etlserver.registrator.api.v1.impl.MkdirsCommand;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.impl.MoveFileCommand;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.impl.NewFileCommand;
 import ch.systemsx.cisd.etlserver.registrator.recovery.DataSetStoragePrecommitRecoveryAlgorithm;
+import ch.systemsx.cisd.etlserver.registrator.recovery.DataSetStorageRecoveryAlgorithm;
 import ch.systemsx.cisd.etlserver.registrator.recovery.DataSetStorageStoredRecoveryAlgorithm;
 import ch.systemsx.cisd.etlserver.validation.IDataSetValidator;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
@@ -177,20 +178,8 @@ public class DataSetStorageAlgorithm<T extends DataSetInformation>
             IMailClient mailClient,
             DataSetStoragePrecommitRecoveryAlgorithm<T> precommitRecoveryAlgorithm)
     {
-        this.incomingDataSetFile = precommitRecoveryAlgorithm.getIncomingDataSetFile();
-        this.registrationDetails = null;
-        this.dataSetInformation = precommitRecoveryAlgorithm.getDataSetInformation();
-        
-        this.dataStoreStrategy = dataStoreStrategy;
-        this.storageProcessor = storageProcessor;
-        this.dataStoreCode = precommitRecoveryAlgorithm.getDataStoreCode();
-        this.fileOperations = fileOperations;
-        this.mailClient = mailClient;
-        this.stagingDirectory = precommitRecoveryAlgorithm.getStagingDirectory();
-        this.preCommitDirectory = precommitRecoveryAlgorithm.getPreCommitDirectory();
-
-        this.storeRoot = storageProcessor.getStoreRootDirectory();
-        this.dataSetType = null;
+        this(dataStoreStrategy, storageProcessor, fileOperations, mailClient,
+                precommitRecoveryAlgorithm.getRecoveryAlgorithm());
         
         state = new PrecommittedState<T>(this, precommitRecoveryAlgorithm);
     }
@@ -203,6 +192,16 @@ public class DataSetStorageAlgorithm<T extends DataSetInformation>
             IFileOperations fileOperations,
             IMailClient mailClient,
             DataSetStorageStoredRecoveryAlgorithm<T> storedRecoveryAlgorithm)
+    {
+        this(dataStoreStrategy, storageProcessor, fileOperations, mailClient,
+                storedRecoveryAlgorithm.getRecoveryAlgorithm());
+        
+        state = new StoredState<T>(this, storedRecoveryAlgorithm);
+    }
+
+    public DataSetStorageAlgorithm(IDataStoreStrategy dataStoreStrategy,
+            IStorageProcessorTransactional storageProcessor, IFileOperations fileOperations,
+            IMailClient mailClient, DataSetStorageRecoveryAlgorithm<T> storedRecoveryAlgorithm)
     {
         this.incomingDataSetFile = storedRecoveryAlgorithm.getIncomingDataSetFile();
         this.registrationDetails = null;
@@ -218,8 +217,6 @@ public class DataSetStorageAlgorithm<T extends DataSetInformation>
 
         this.storeRoot = storageProcessor.getStoreRootDirectory();
         this.dataSetType = null;
-        
-        state = new StoredState<T>(this, storedRecoveryAlgorithm);
     }
     
     public DataSetStoragePrecommitRecoveryAlgorithm<T> getPrecommitRecoveryAlgorithm()
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/ContainerRecoveryAlgorithm.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/ContainerRecoveryAlgorithm.java
new file mode 100644
index 0000000000000000000000000000000000000000..d89d17a578f224d26305b36373081c9d9470b7bc
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/ContainerRecoveryAlgorithm.java
@@ -0,0 +1,27 @@
+/*
+ * 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.recovery;
+
+/**
+ * 
+ *
+ * @author jakubs
+ */
+public class ContainerRecoveryAlgorithm
+{
+
+}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStoragePrecommitRecoveryAlgorithm.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStoragePrecommitRecoveryAlgorithm.java
index b87d41bd5f64c72724e95d1e7f4406688c0e8baf..d07b77d512de958de610ce8f7988e5f2e606e92c 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStoragePrecommitRecoveryAlgorithm.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStoragePrecommitRecoveryAlgorithm.java
@@ -26,6 +26,7 @@ import ch.systemsx.cisd.etlserver.IDataStoreStrategy;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional.IStorageProcessorTransaction;
 import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState;
+import ch.systemsx.cisd.etlserver.registrator.ContainerDataSetStorageAlgorithm;
 import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm;
 import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm.DataSetStoragePaths;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
@@ -45,31 +46,67 @@ public class DataSetStoragePrecommitRecoveryAlgorithm<T extends DataSetInformati
 
     private final File markerFile;
 
+    private boolean isContainer;
+
+    /**
+     * simplified constructor for container algorithm
+     * 
+     * @param dataSetInformation
+     * @param dataStoreStrategyKey
+     * @param incomingDataSetFile
+     * @param stagingDirectory
+     * @param preCommitDirectory
+     * @param dataStoreCode
+     */
+    public DataSetStoragePrecommitRecoveryAlgorithm(T dataSetInformation,
+            DataStoreStrategyKey dataStoreStrategyKey, File incomingDataSetFile,
+            File stagingDirectory, File preCommitDirectory, String dataStoreCode)
+    {
+        this.recoveryAlgorithm =
+                new DataSetStorageRecoveryAlgorithm<T>(dataSetInformation, dataStoreStrategyKey,
+                        incomingDataSetFile, stagingDirectory, preCommitDirectory, dataStoreCode,
+                        null);
+        this.markerFile = null;
+        this.transaction = null;
+        this.isContainer = true;
+    }
+
     public DataSetStoragePrecommitRecoveryAlgorithm(T dataSetInformation,
             DataStoreStrategyKey dataStoreStrategyKey, File incomingDataSetFile,
             File stagingDirectory, File preCommitDirectory, String dataStoreCode,
             DataSetStorageAlgorithm.DataSetStoragePaths dataSetStoragePaths, File markerFile,
             IStorageProcessorTransaction transaction)
     {
-        this.recoveryAlgorithm = new DataSetStorageRecoveryAlgorithm<T>(dataSetInformation, dataStoreStrategyKey, incomingDataSetFile, stagingDirectory,
-                preCommitDirectory, dataStoreCode, dataSetStoragePaths);
+        this.recoveryAlgorithm =
+                new DataSetStorageRecoveryAlgorithm<T>(dataSetInformation, dataStoreStrategyKey,
+                        incomingDataSetFile, stagingDirectory, preCommitDirectory, dataStoreCode,
+                        dataSetStoragePaths);
         this.transaction = transaction;
         this.markerFile = markerFile;
+        this.isContainer = false;
     }
 
     public DataSetStorageAlgorithm<T> recoverDataSetStorageAlgorithm(
             OmniscientTopLevelDataSetRegistratorState state)
     {
         IDataStoreStrategy dataStoreStrategy =
-                state.getDataStrategyStore().getDataStoreStrategy(recoveryAlgorithm.getDataStoreStrategyKey());
+                state.getDataStrategyStore().getDataStoreStrategy(
+                        recoveryAlgorithm.getDataStoreStrategyKey());
 
         IMailClient mailClient = state.getGlobalState().getMailClient();
         IFileOperations fileOperations = state.getFileOperations();
 
         IStorageProcessorTransactional storageProcessor = state.getStorageProcessor();
 
-        return new DataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor, fileOperations,
-                mailClient, this);
+        if (isContainer)
+        {
+            return new ContainerDataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor,
+                    fileOperations, mailClient, recoveryAlgorithm);
+        } else
+        {
+            return new DataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor,
+                    fileOperations, mailClient, this);
+        }
     }
 
     public IStorageProcessorTransaction getTransaction()
@@ -146,6 +183,9 @@ public class DataSetStoragePrecommitRecoveryAlgorithm<T extends DataSetInformati
         return recoveryAlgorithm.getDataSetStoragePaths();
     }
 
-    
-    
+    public DataSetStorageRecoveryAlgorithm<T> getRecoveryAlgorithm()
+    {
+        return recoveryAlgorithm;
+    }
+
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageStoredRecoveryAlgorithm.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageStoredRecoveryAlgorithm.java
index 7385b7f4b7a7f988ffb3ba4527b938d3979669b0..663587ba0289390267b1fa0fb5cf65728d53e7bb 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageStoredRecoveryAlgorithm.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/recovery/DataSetStorageStoredRecoveryAlgorithm.java
@@ -25,31 +25,51 @@ import ch.systemsx.cisd.etlserver.DataStoreStrategyKey;
 import ch.systemsx.cisd.etlserver.IDataStoreStrategy;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
 import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState;
+import ch.systemsx.cisd.etlserver.registrator.ContainerDataSetStorageAlgorithm;
 import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm;
 import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm.DataSetStoragePaths;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 
 /**
- * 
- *
  * @author jakubs
  */
-public class DataSetStorageStoredRecoveryAlgorithm<T extends DataSetInformation>implements
-Serializable
+public class DataSetStorageStoredRecoveryAlgorithm<T extends DataSetInformation> implements
+        Serializable
 {
     private static final long serialVersionUID = 1L;
 
     private DataSetStorageRecoveryAlgorithm<T> recoveryAlgorithm;
-    
+
+    private boolean isContainer;
+
+    public boolean isContainer()
+    {
+        return isContainer;
+    }
+
     public DataSetStorageStoredRecoveryAlgorithm(T dataSetInformation,
             DataStoreStrategyKey dataStoreStrategyKey, File incomingDataSetFile,
             File stagingDirectory, File preCommitDirectory, String dataStoreCode,
             DataSetStorageAlgorithm.DataSetStoragePaths dataSetStoragePaths)
     {
-        recoveryAlgorithm = new DataSetStorageRecoveryAlgorithm<T>(dataSetInformation, dataStoreStrategyKey, incomingDataSetFile, stagingDirectory,
-                preCommitDirectory, dataStoreCode, dataSetStoragePaths);
+        recoveryAlgorithm =
+                new DataSetStorageRecoveryAlgorithm<T>(dataSetInformation, dataStoreStrategyKey,
+                        incomingDataSetFile, stagingDirectory, preCommitDirectory, dataStoreCode,
+                        dataSetStoragePaths);
+        isContainer = false;
     }
-    
+
+    public DataSetStorageStoredRecoveryAlgorithm(T dataSetInformation,
+            DataStoreStrategyKey dataStoreStrategyKey, File incomingDataSetFile,
+            File stagingDirectory, File preCommitDirectory, String dataStoreCode)
+    {
+        recoveryAlgorithm =
+                new DataSetStorageRecoveryAlgorithm<T>(dataSetInformation, dataStoreStrategyKey,
+                        incomingDataSetFile, stagingDirectory, preCommitDirectory, dataStoreCode,
+                        null);
+        isContainer = true;
+    }
+
     public DataSetStorageAlgorithm<T> recoverDataSetStorageAlgorithm(
             OmniscientTopLevelDataSetRegistratorState state)
     {
@@ -61,8 +81,20 @@ Serializable
 
         IStorageProcessorTransactional storageProcessor = state.getStorageProcessor();
 
-        return new DataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor, fileOperations,
-                mailClient, this);
+        if (isContainer)
+        {
+            return new ContainerDataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor,
+                    fileOperations, mailClient, recoveryAlgorithm);
+        } else
+        {
+            return new DataSetStorageAlgorithm<T>(dataStoreStrategy, storageProcessor,
+                    fileOperations, mailClient, this);
+        }
+    }
+
+    public DataSetStorageRecoveryAlgorithm<T> getRecoveryAlgorithm()
+    {
+        return recoveryAlgorithm;
     }
 
     /**
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 cde0cf806b14df48c3b330a20007fc6466e5b9d4..ef6dc9258f238b521d3ec54111dc06cffb843937 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
@@ -111,6 +111,8 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
 
     protected static final DataSetType DATA_SET_TYPE = new DataSetType("O1");
 
+    protected static final DataSetType CONTAINER_DATA_SET_TYPE = new DataSetType("CONTAINER_TYPE");
+    
     protected static final String EXPERIMENT_PERM_ID = "experiment-perm-id";
 
     protected static final String EXPERIMENT_IDENTIFIER = "/SPACE/PROJECT/EXP";
@@ -411,9 +413,9 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
     }
 
     protected void assertStorageProcess(AtomicEntityOperationDetails recordedObject,
-            String dataSetCode, String dataSetDirectory, int testId)
+            String dataSetCode, String dataSetDirectory, int testId, boolean withContainer)
     {
-        assertEquals(1, recordedObject.getDataSetRegistrations().size());
+        assertEquals(1 + (withContainer ? 1 : 0), recordedObject.getDataSetRegistrations().size());
 
         NewExternalData dataSet = recordedObject.getDataSetRegistrations().get(0);
 
@@ -443,6 +445,13 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
                         .trim());
     }
 
+    protected void assertStorageProcess(AtomicEntityOperationDetails recordedObject,
+            String dataSetCode, String dataSetDirectory, int testId)
+    {
+        assertStorageProcess(recordedObject, dataSetCode, dataSetDirectory, testId, false);
+        assertEquals(1, recordedObject.getDataSetRegistrations().size());
+    }
+
     protected void assertDataSetNotStoredProcess(String dataSetCode)
     {
         File datasetLocation =
@@ -462,7 +471,6 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
      */
     protected static void makeFileSystemUnavailable(File storeRootDirectory)
     {
-        System.out.println("Make stuff anavailabl!!!!!!!!!!!!!!!!!!!e");
         for (String regDir : registrationDirectories)
         {
             new File(storeRootDirectory, regDir).renameTo(new File(storeRootDirectory, regDir
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java
index 7ed7c23cfe0f3d7bbd9f69d223833e865d75a089..2cf58156d0f275f101fb8f62db29f9f5211f2b67 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java
@@ -527,12 +527,21 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest
 
     }
 
+    @DataProvider(name = "multipleCheckpointsDataProvider")
+    public Object[][] multipleCheckpointsData()
+    {
+        return new Object[][]
+            {
+                { "v2-simple-testcase.py", false },
+                { "v2-container-testcase.py", true } };
+    }
+
     /**
      * This tests the registration with adventure, where the failure and recovery happens at every
      * possible step.
      */
-    @Test
-    public void testRecoveryAtMultipleCheckpoints()
+    @Test(dataProvider = "multipleCheckpointsDataProvider")
+    public void testRecoveryAtMultipleCheckpoints(String script, boolean includeContainer)
     {
         RecoveryTestCase testCase = new RecoveryTestCase("No name");
         setUpHomeDataBaseExpectations();
@@ -540,8 +549,7 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest
         createData();
 
         Properties properties =
-                createThreadPropertiesRelativeToScriptsFolder(testCase.dropboxScriptPath,
-                        testCase.overrideProperties);
+                createThreadPropertiesRelativeToScriptsFolder(script, testCase.overrideProperties);
 
         createHandler(properties, true, false);
 
@@ -549,7 +557,7 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest
                 new RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails>();
 
         // create expectations
-        context.checking(new MultipleErrorsExpectations(atomicatOperationDetails));
+        context.checking(new MultipleErrorsExpectations(atomicatOperationDetails, includeContainer));
 
         handler.handle(markerFile);
         setTheRecoveryInfo(testCase.recoveryRertyCount, testCase.recoveryLastTry);
@@ -573,10 +581,10 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest
         // now the storage has succeeded, but storage confirmation has not.
 
         handler.handle(markerFile);
-//        setTheRecoveryInfo(testCase.recoveryRertyCount, testCase.recoveryLastTry);
+        // setTheRecoveryInfo(testCase.recoveryRertyCount, testCase.recoveryLastTry);
         // now the storage confirmation has succeeded
         assertStorageProcess(atomicatOperationDetails.recordedObject(), DATA_SET_CODE,
-                "sub_data_set_1", 0);
+                "sub_data_set_1", 0, includeContainer);
 
         assertNoOriginalMarkerFileExists();
         assertNoRecoveryMarkerFile();
@@ -592,15 +600,20 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest
     class MultipleErrorsExpectations extends AbstractExpectations
     {
         public MultipleErrorsExpectations(
-                final RecordingMatcher<AtomicEntityOperationDetails> atomicatOperationDetails)
+                final RecordingMatcher<AtomicEntityOperationDetails> atomicatOperationDetails,
+                boolean withContainer)
         {
             super(atomicatOperationDetails);
-            prepareExpectations();
+            prepareExpectations(withContainer);
         }
 
-        private void prepareExpectations()
+        private void prepareExpectations(boolean withContainer)
         {
             initialExpectations();
+            if (withContainer)
+            {
+                initialContainerExpectations();
+            }
             // first try - fail at registration
             registerDataSetsAndThrow(true);
 
@@ -613,6 +626,10 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest
 
             // fourth try - success
             setStorageConfirmed(false);
+            if (withContainer)
+            {
+                setStorageConfirmed(CONTAINER_DATA_SET_CODE, false);
+            }
         }
     }
 
@@ -736,6 +753,17 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest
                     new File(new File(stagingDirectory, DATA_SET_CODE), "sub_data_set_1"));
         }
 
+        protected void initialContainerExpectations()
+        {
+
+            // create dataset
+            one(openBisService).createDataSetCode();
+            will(returnValue(CONTAINER_DATA_SET_CODE));
+
+            // validate dataset
+            one(dataSetValidator).assertValidDataSet(CONTAINER_DATA_SET_TYPE, null);
+        }
+
         protected CustomAction makeFileSystemUnavailableAction()
         {
             return new CustomAction("makeSystemUnavailable")
@@ -794,7 +822,16 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest
          */
         protected void setStorageConfirmed(boolean shouldFail)
         {
-            one(openBisService).setStorageConfirmed(DATA_SET_CODE);
+            setStorageConfirmed(DATA_SET_CODE, shouldFail);
+        }
+
+        /**
+         * @param dataSetCode - the dataset to be confirmed
+         * @param shouldFail - if true the call to as should throw an exception
+         */
+        protected void setStorageConfirmed(String dataSetCode, boolean shouldFail)
+        {
+            one(openBisService).setStorageConfirmed(dataSetCode);
             if (shouldFail)
             {
                 will(throwException(new EnvironmentFailureException(
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-container-testcase.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-container-testcase.py
new file mode 100644
index 0000000000000000000000000000000000000000..1b1b1d9613f80cfee9059338b7c77ccb71f3026d
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-container-testcase.py
@@ -0,0 +1,9 @@
+execfile("sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py")
+def process():
+    dataSet = transaction.createNewDataSet()
+    transaction.moveFile(incoming.getPath() + '/sub_data_set_1', dataSet)
+    dataSet.setDataSetType('O1')
+    dataSet.setExperiment(transaction.getExperiment('/SPACE/PROJECT/EXP'))
+    container = transaction.createNewDataSet("CONTAINER_TYPE")
+    container.setExperiment(transaction.getExperiment("/SPACE/PROJECT/EXP"))
+    container.setContainedDataSetCodes([dataSet.getDataSetCode()])
\ No newline at end of file