diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java
index 57b3b504399a48d573854cfa90b6d3f056626e40..73d10113f360b1419ea7f4713469f3a5f67f9498 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractArchiverProcessingPlugin.java
@@ -653,7 +653,7 @@ public abstract class AbstractArchiverProcessingPlugin extends AbstractDatastore
         return tempFolder;
     }
 
-    private IShareFinder getShareFinder()
+    protected IShareFinder getShareFinder()
     {
         Properties props =
                 PropertyParametersUtil.extractSingleSectionProperties(properties, SHARE_FINDER_KEY,
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/IMultiDataSetFileOperationsManager.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/IMultiDataSetFileOperationsManager.java
index f42e67431610241b8821cbe9bfe97d5436658471..4c5302b0833df1c1bfb91f384cbd9e0c90029f9b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/IMultiDataSetFileOperationsManager.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/IMultiDataSetFileOperationsManager.java
@@ -20,6 +20,7 @@ import java.util.List;
 
 import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
 /**
@@ -42,4 +43,6 @@ public interface IMultiDataSetFileOperationsManager
      */
     IHierarchicalContent getContainerAsHierarchicalContent(String containerPath);
 
+    Status restoreDataSetsFromContainerInFinalDestination(String containerPath,
+            List<? extends IDatasetLocation> dataSetLocations);
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverShareFinder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverShareFinder.java
new file mode 100644
index 0000000000000000000000000000000000000000..6bf6ed7b4e202940b1618ca8d438a8e367252dab
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetArchiverShareFinder.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2014 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.openbis.dss.generic.server.plugins.standard.archiver;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.dss.generic.shared.IShareFinder;
+import ch.systemsx.cisd.openbis.dss.generic.shared.utils.Share;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
+
+/**
+ * @author Jakub Straszewski
+ */
+public class MultiDataSetArchiverShareFinder implements IShareFinder
+{
+    private Share share;
+
+    public MultiDataSetArchiverShareFinder()
+    {
+    }
+
+    @Override
+    public Share tryToFindShare(SimpleDataSetInformationDTO dataSet, List<Share> shares)
+    {
+        if (share == null)
+        {
+            share = tryToFindShare(shares);
+        }
+        return share;
+    }
+
+    public Share tryToFindShare(List<Share> shares)
+    {
+        for (Share sh : shares)
+        {
+            if (sh.isUnarchivingScratchShare())
+            {
+                return sh;
+            }
+        }
+        throw new IllegalArgumentException("Could not find proper share");
+    }
+}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetFileOperationsManager.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetFileOperationsManager.java
index f86b35a62b393a7fff726c30b4d86c0739ac8a19..51f8311faddbb11d87c39e1a83412693ea58f84b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetFileOperationsManager.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/archiver/MultiDataSetFileOperationsManager.java
@@ -44,6 +44,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.IPathCopierF
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.ISshCommandExecutorFactory;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
 /**
@@ -141,14 +142,15 @@ public class MultiDataSetFileOperationsManager extends AbstractDataSetFileOperat
         return success ? Status.OK : Status.createError("Couldn't delete archive container '" + containerPath);
     }
 
-    public Status restoreDataSetsFromContainerInFinalDestination(String containerPath, String unarchivingShareId,
-            List<DatasetDescription> dataSetDescriptions)
+    @Override
+    public Status restoreDataSetsFromContainerInFinalDestination(String containerPath,
+            List<? extends IDatasetLocation> dataSetLocations)
     {
         HashMap<String, File> dataSetToLocation = new HashMap<String, File>();
-        for (DatasetDescription datasetDescription : dataSetDescriptions)
+        for (IDatasetLocation dataSetLocation : dataSetLocations)
         {
-            File location = getDirectoryProvider().getDataSetDirectory(unarchivingShareId, datasetDescription.getDataSetLocation());
-            dataSetToLocation.put(datasetDescription.getDataSetCode(), location);
+            File location = getDirectoryProvider().getDataSetDirectory(dataSetLocation);
+            dataSetToLocation.put(dataSetLocation.getDataSetCode(), location);
         }
 
         File stageArchiveContainerFile = new File(getFinalArchive().getDestination(), containerPath);
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 11fcd67a9b04555c62d8aea9ffac861e66d96d94..b4134f3fe8c43f0ad6685aa1632bdd388e903bb1 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
@@ -43,6 +43,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.dat
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.dataaccess.MultiDatasetArchiverDBTransaction;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.dataaccess.MultiDatasetArchiverDataSourceUtil;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ArchiverTaskContext;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IShareFinder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
@@ -88,13 +89,9 @@ public class MultiDatasetArchiver extends AbstractArchiverProcessingPlugin
 
     public static final Long DEFAULT_MAXIMUM_CONTAINER_SIZE_IN_BYTES = 80L * 1024 * 1024 * 1024;
 
-    private IMultiDatasetArchiverDBTransaction transaction;
+    private transient IMultiDatasetArchiverDBTransaction transaction;
 
-    private IMultiDataSetArchiverReadonlyQueryDAO readonlyQuery;
-
-    public static final String UNARCHIVING_SHARE_ID = "unarchiving-share-id";
-
-    private final String unarchivingShareId;
+    private transient IMultiDataSetArchiverReadonlyQueryDAO readonlyQuery;
 
     public MultiDatasetArchiver(Properties properties, File storeRoot)
     {
@@ -102,7 +99,6 @@ public class MultiDatasetArchiver extends AbstractArchiverProcessingPlugin
         this.minimumContainerSize = PropertyUtils.getLong(properties, MINIMUM_CONTAINER_SIZE_IN_BYTES, DEFAULT_MINIMUM_CONTAINER_SIZE_IN_BYTES);
         this.maximumContainerSize = PropertyUtils.getLong(properties, MAXIMUM_CONTAINER_SIZE_IN_BYTES, DEFAULT_MAXIMUM_CONTAINER_SIZE_IN_BYTES);
         this.fileOperationsFactory = new FileOperationsManagerFactory(properties);
-        this.unarchivingShareId = PropertyUtils.getMandatoryProperty(properties, UNARCHIVING_SHARE_ID);
     }
 
     @Override
@@ -329,40 +325,35 @@ public class MultiDatasetArchiver extends AbstractArchiverProcessingPlugin
     }
 
     @Override
-    protected DatasetProcessingStatuses doUnarchive(List<DatasetDescription> parameterDataSets, ArchiverTaskContext context)
+    protected IShareFinder getShareFinder()
     {
-        List<String> dataSetCodes = translateToDataSetCodes(parameterDataSets);
-        long containerId = assertAllDataSetsInTheSameContainer(dataSetCodes);
-        List<PhysicalDataSet> dataSets = translateToPhysicalDataSets(dataSetCodes);
-        assertNoAvailableDatasets(dataSets);
+        return new MultiDataSetArchiverShareFinder();
+    }
 
-        for (PhysicalDataSet physicalDataSet : dataSets)
+    @Override
+    protected DatasetProcessingStatuses doUnarchive(List<DatasetDescription> parameterDataSets, ArchiverTaskContext context)
+    {
+        for (DatasetDescription dataSet : parameterDataSets)
         {
-            String dataSetCode = physicalDataSet.getCode();
-
-            String shareId = getShareIdManager().getShareId(dataSetCode);
-            if (shareId.equals(unarchivingShareId) == false)
-            {
-                getService().updateShareIdAndSize(dataSetCode, unarchivingShareId, physicalDataSet.getSize());
-                getShareIdManager().setShareId(dataSetCode, unarchivingShareId);
-            }
-
+            context.getUnarchivingPreparation().prepareForUnarchiving(dataSet);
         }
 
-        MultiDataSetArchiverContainerDTO container = getReadonlyQuery().getContainerForId(containerId);
+        List<String> dataSetCodes = translateToDataSetCodes(parameterDataSets);
+        long containerId = assertAllDataSetsInTheSameContainer(dataSetCodes);
+        assertNoAvailableDatasets(dataSetCodes);
 
-        ((MultiDataSetFileOperationsManager) getFileOperations()).restoreDataSetsFromContainerInFinalDestination(
-                container.getPath(),
+        MultiDataSetArchiverContainerDTO container = getReadonlyQuery().getContainerForId(containerId);
 
-                unarchivingShareId, parameterDataSets);
+        getFileOperations().restoreDataSetsFromContainerInFinalDestination(container.getPath(), parameterDataSets);
 
         DatasetProcessingStatuses result = new DatasetProcessingStatuses();
         result.addResult(parameterDataSets, Status.OK, Operation.UNARCHIVE);
         return result;
     }
 
-    private void assertNoAvailableDatasets(List<PhysicalDataSet> dataSets)
+    private void assertNoAvailableDatasets(List<String> dataSetCodes)
     {
+        List<PhysicalDataSet> dataSets = translateToPhysicalDataSets(dataSetCodes);
         for (PhysicalDataSet physicalDataSet : dataSets)
         {
             if (physicalDataSet.isAvailable())
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 5cdbc941cf584cdf2173c9ef8d41c6b9ee2fcab8..213155e3822902702859bbd806267acb6df87df1 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
@@ -20,7 +20,6 @@ import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archi
 import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDataSetFileOperationsManager.STAGING_DESTINATION_KEY;
 import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDatasetArchiver.MAXIMUM_CONTAINER_SIZE_IN_BYTES;
 import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDatasetArchiver.MINIMUM_CONTAINER_SIZE_IN_BYTES;
-import static ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDatasetArchiver.UNARCHIVING_SHARE_ID;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -320,7 +319,6 @@ public class MultiDatasetArchiverTest extends AbstractFileSystemTestCase
         properties = new Properties();
         properties.setProperty(STAGING_DESTINATION_KEY, staging.getAbsolutePath());
         properties.setProperty(FINAL_DESTINATION_KEY, archive.getAbsolutePath());
-        properties.setProperty(UNARCHIVING_SHARE_ID, "2");
         directoryProvider = new MockDataSetDirectoryProvider(store, share.getName(), shareIdManager);
         archiverContext = new ArchiverTaskContext(directoryProvider, hierarchicalContentProvider);
         experiment = new ExperimentBuilder().identifier(EXPERIMENT_IDENTIFIER).type("MET").getExperiment();