diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java
index 47953e9bae9b26e18fb65e5744d057163da1634d..936cd70082d7ab565a88d56e072069e4ab8cba70 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiver.java
@@ -151,15 +151,12 @@ public class MultiDataSetArchiver extends AbstractArchiverProcessingPlugin
      * <code>dataSets</code> and removes those which are present in the archive already (or not present, depending on the <code>filterOption</code>).
      * For those removed data sets it adds entry with <code>status</code> for <code>operation</code> in <code>result</code>
      */
-    private void filterBasedOnArchiveStatus(LinkedList<? extends IDatasetLocation> dataSets, DatasetProcessingStatuses result,
-            FilterOption filterOption,
-            Status status, Operation operation)
+    private void filterBasedOnArchiveStatus(LinkedList<? extends IDatasetLocation> dataSets, 
+            DatasetProcessingStatuses result, FilterOption filterOption, Status status, Operation operation)
     {
-
-        Iterator<? extends IDatasetLocation> it = dataSets.iterator();
-        while (it.hasNext())
+        for (Iterator<? extends IDatasetLocation> iterator = dataSets.iterator(); iterator.hasNext();)
         {
-            IDatasetLocation dataSet = it.next();
+            IDatasetLocation dataSet = iterator.next();
             boolean isPresentInArchive = isDataSetPresentInArchive(dataSet.getDataSetCode());
 
             boolean isFiltered;
@@ -179,7 +176,7 @@ public class MultiDataSetArchiver extends AbstractArchiverProcessingPlugin
             if (isFiltered)
             {
                 result.addResult(dataSet.getDataSetCode(), status, operation);
-                it.remove();
+                iterator.remove();
             }
         }
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverTest.java
index 069cd6856bf0679c0e7f6572a7a8b0c1d948c9be..2f961c209b2aedc13e07dce6cf23d0fd8b852fb4 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverTest.java
@@ -118,6 +118,10 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
 
         private List<MultiDataSetArchiverDataSetDTO> dataSets = new ArrayList<MultiDataSetArchiverDataSetDTO>();
 
+        private List<MultiDataSetArchiverContainerDTO> uncommittedContainers = new ArrayList<MultiDataSetArchiverContainerDTO>();
+        
+        private List<MultiDataSetArchiverDataSetDTO> uncommittedDataSets = new ArrayList<MultiDataSetArchiverDataSetDTO>();
+        
         private boolean committed;
 
         private boolean rolledBack;
@@ -140,7 +144,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         public MultiDataSetArchiverContainerDTO createContainer(String path)
         {
             MultiDataSetArchiverContainerDTO container = new MultiDataSetArchiverContainerDTO(id++, path);
-            containers.add(container);
+            uncommittedContainers.add(container);
             return container;
         }
 
@@ -150,7 +154,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
             String dataSetCode = dataSet.getDataSetCode();
             Long dataSetSize = dataSet.getDataSetSize();
             MultiDataSetArchiverDataSetDTO dataSetDTO = new MultiDataSetArchiverDataSetDTO(id++, dataSetCode, container.getId(), dataSetSize);
-            dataSets.add(dataSetDTO);
+            uncommittedDataSets.add(dataSetDTO);
             return dataSetDTO;
         }
 
@@ -210,13 +214,23 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         @Override
         public void commit()
         {
+            containers.addAll(uncommittedContainers);
+            dataSets.addAll(uncommittedDataSets);
             committed = true;
+            clearUncommitted();
         }
 
         @Override
         public void rollback()
         {
             rolledBack = true;
+            clearUncommitted();
+        }
+        
+        private void clearUncommitted()
+        {
+            uncommittedContainers.clear();
+            uncommittedDataSets.clear();
         }
 
         @Override
@@ -244,7 +258,23 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
             {
                 builder.append('\n').append(dataSet);
             }
-            builder.append("\ncomitted: ").append(committed);
+            if (uncommittedContainers.isEmpty() == false)
+            {
+                builder.append("\nUncommitted containers:");
+                for (MultiDataSetArchiverContainerDTO container : uncommittedContainers)
+                {
+                    builder.append('\n').append(container);
+                }
+            }
+            if (uncommittedDataSets.isEmpty() == false)
+            {
+                builder.append("\nUncommitted data sets:");
+                for (MultiDataSetArchiverDataSetDTO dataSet : uncommittedDataSets)
+                {
+                    builder.append('\n').append(dataSet);
+                }
+            }
+            builder.append("\ncommitted: ").append(committed);
             builder.append(", rolledBack: ").append(rolledBack);
             return builder.toString();
         }
@@ -450,7 +480,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
                 + "to be archived with multi dataset archiver because minimum size is 35 bytes.\"]",
                 status.getErrorStatuses().toString());
         assertEquals("[ds1, ds2]: AVAILABLE false\n", statusUpdater.toString());
-        assertEquals("Containers:\nData sets:\ncomitted: false, rolledBack: true", transaction.toString());
+        assertEquals("Containers:\nData sets:\ncommitted: false, rolledBack: true", transaction.toString());
         context.assertIsSatisfied();
     }
 
@@ -469,7 +499,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
                 + "to be archived with multi dataset archiver because maximum size is 27 bytes.\"]",
                 status.getErrorStatuses().toString());
         assertEquals("[ds1, ds2]: AVAILABLE false\n", statusUpdater.toString());
-        assertEquals("Containers:\nData sets:\ncomitted: false, rolledBack: true", transaction.toString());
+        assertEquals("Containers:\nData sets:\ncommitted: false, rolledBack: true", transaction.toString());
         context.assertIsSatisfied();
     }
 
@@ -513,7 +543,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         assertEquals("[ds2]: AVAILABLE true\n", statusUpdater.toString());
         assertEquals("Containers:\nMultiDataSetArchiverContainerDTO [id=0, path=ds2.tar]\n"
                 + "Data sets:\nMultiDataSetArchiverDataSetDTO [id=1, code=ds2, containerId=0, sizeInBytes=20]\n"
-                + "comitted: true, rolledBack: false", transaction.toString());
+                + "committed: true, rolledBack: false", transaction.toString());
         context.assertIsSatisfied();
     }
 
@@ -579,7 +609,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         assertEquals("Containers:\nMultiDataSetArchiverContainerDTO [id=0, path=ds1.tar]\n"
                 + "Data sets:\nMultiDataSetArchiverDataSetDTO [id=1, code=ds1, containerId=0, sizeInBytes=10]\n"
                 + "MultiDataSetArchiverDataSetDTO [id=2, code=ds2, containerId=0, sizeInBytes=20]\n"
-                + "comitted: true, rolledBack: false", transaction.toString());
+                + "committed: true, rolledBack: false", transaction.toString());
         context.assertIsSatisfied();
     }
 
@@ -590,6 +620,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         MultiDataSetArchiverContainerDTO container = transaction.createContainer("path");
         ds2.setDataSetSize(20L);
         transaction.insertDataset(ds2, container);
+        transaction.commit();
 
         MultiDataSetArchiver archiver = createArchiver(null);
         ProcessingStatus status = archiver.archive(Arrays.asList(ds2), archiverContext, false);
@@ -602,7 +633,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         assertEquals("[ds2]: AVAILABLE true\n", statusUpdater.toString());
         assertEquals("Containers:\nMultiDataSetArchiverContainerDTO [id=0, path=path]\n"
                 + "Data sets:\nMultiDataSetArchiverDataSetDTO [id=1, code=ds2, containerId=0, sizeInBytes=20]\n"
-                + "comitted: false, rolledBack: false", transaction.toString());
+                + "committed: true, rolledBack: false", transaction.toString());
         context.assertIsSatisfied();
     }
 
@@ -615,6 +646,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         MultiDataSetArchiverContainerDTO container = transaction.createContainer("path");
         ds2.setDataSetSize(20L);
         transaction.insertDataset(ds2, container);
+        transaction.commit();
         assertEquals(true, new File(share, ds1.getDataSetCode()).exists());
         assertEquals(true, new File(share, ds2.getDataSetCode()).exists());
 
@@ -655,16 +687,15 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
                 + "MultiDataSetArchiverContainerDTO [id=2, path=ds1.tar]\n"
                 + "Data sets:\nMultiDataSetArchiverDataSetDTO [id=1, code=ds2, containerId=0, sizeInBytes=20]\n"
                 + "MultiDataSetArchiverDataSetDTO [id=3, code=ds1, containerId=2, sizeInBytes=10]\n"
-                + "comitted: true, rolledBack: false", transaction.toString());
+                + "committed: true, rolledBack: false", transaction.toString());
         assertEquals("[Dataset 'ds1', Dataset 'ds2']\n", dataSetDeleter.toString());
         context.assertIsSatisfied();
     }
 
-    // @Test
+    @Test
     public void testArchiveDataSetFails()
     {
         prepareUpdateShareIdAndSize(ds2, 20);
-        prepareLockAndReleaseDataSet(ds2);
         properties.setProperty(MINIMUM_CONTAINER_SIZE_IN_BYTES, "15");
         final String containerPath = "data-set-path";
         prepareFileOperationsGenerateContainerPath(containerPath, ds2);
@@ -680,15 +711,12 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         MultiDataSetArchiver archiver = createArchiver(fileOperations);
         ProcessingStatus status = archiver.archive(Arrays.asList(ds2), archiverContext, false);
 
-        assertEquals("", logRecorder.getLogContent());
-        assertEquals("[ERROR: \"Archiving failed to calculate dataset sizes:Oohps!\"]", status.getErrorStatuses().toString());
+        assertEquals("[ERROR: \"Couldn't create package file in stage archive data-set-path\"]", status.getErrorStatuses().toString());
         assertEquals("[]", Arrays.asList(staging.listFiles()).toString());
         File archiveFile = new File(archive, ds2.getDataSetCode() + ".tar");
         assertEquals(false, archiveFile.exists());
-        assertEquals("[ds2]: AVAILABLE true\n", statusUpdater.toString());
-        assertEquals("Containers:\nMultiDataSetArchiverContainerDTO [id=0, path=ds2.tar]\n"
-                + "Data sets:\nMultiDataSetArchiverDataSetDTO [id=1, code=ds2, containerId=0, sizeInBytes=20]\n"
-                + "comitted: true, rolledBack: false", transaction.toString());
+        assertEquals("[ds2]: AVAILABLE false\n", statusUpdater.toString());
+        assertEquals("Containers:\nData sets:\ncommitted: false, rolledBack: true", transaction.toString());
         context.assertIsSatisfied();
     }
 
@@ -736,6 +764,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         ds2.setDataSetSize(20L);
         transaction.insertDataset(ds1, c1);
         transaction.insertDataset(ds2, c2);
+        transaction.commit();
         properties.setProperty(MINIMUM_CONTAINER_SIZE_IN_BYTES, "15");
         MultiDataSetArchiver archiver = createArchiver(null);
         
@@ -755,6 +784,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         ds2.setDataSetSize(20L);
         transaction.insertDataset(ds1, c1);
         transaction.insertDataset(ds2, c1);
+        transaction.commit();
         MultiDataSetArchiver archiver = createArchiver(null);
         
         List<String> codes = archiver.getDataSetCodesForUnarchiving(Arrays.asList(ds2.getDataSetCode()));
@@ -772,6 +802,7 @@ public class MultiDataSetArchiverTest extends AbstractFileSystemTestCase
         ds2.setDataSetSize(20L);
         transaction.insertDataset(ds1, c1);
         transaction.insertDataset(ds2, c2);
+        transaction.commit();
         MultiDataSetArchiver archiver = createArchiver(null);
         
         try