diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index 3d693582581374d293c9bd8dd928892817407c1c..620ac4a98d0c00223c8b0a87e4daef16c5633b0c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -855,4 +855,16 @@ public interface ICommonClientService extends IClientService
     public void deleteMaterials(DisplayedOrSelectedIdHolderCriteria<Material> criteria,
             String reason) throws UserFailureException;
 
+    /**
+     * Locks the specified datasets.
+     */
+    public void lockDatasets(DisplayedOrSelectedDatasetCriteria criteria)
+            throws UserFailureException;
+
+    /**
+     * Unlocks the specified datasets.
+     */
+    public void unlockDatasets(DisplayedOrSelectedDatasetCriteria criteria)
+            throws UserFailureException;
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index d9b411cdcb5ba50abb84b32a34101311fb01d540..4087c3c00431af3aef105e76fca8a8d5ff25dc34 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -757,5 +757,17 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     public void deleteMaterials(DisplayedOrSelectedIdHolderCriteria<Material> uploadCriteria,
             String value, AsyncCallback<Void> callback);
 
+    /**
+     * @see ICommonClientService#lockDatasets(DisplayedOrSelectedDatasetCriteria)
+     */
+    public void lockDatasets(DisplayedOrSelectedDatasetCriteria criteria,
+            AsyncCallback<Void> callback);
+
+    /**
+     * @see ICommonClientService#unlockDatasets(DisplayedOrSelectedDatasetCriteria)
+     */
+    public void unlockDatasets(DisplayedOrSelectedDatasetCriteria criteria,
+            AsyncCallback<Void> callback);
+
     // --
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java
index 747d105658e52da334291a64af201ac9117f5f24..e6f8ec677d7f91b513633b8d1acc2e9147f9f65e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetComputeMenu.java
@@ -88,6 +88,8 @@ public class DataSetComputeMenu extends TextToolItem
         addMenuItem(submenu, DssTaskActionMenuKind.COMPUTE_MENU_PROCESSING);
         addMenuItem(submenu, DssTaskActionMenuKind.COMPUTE_MENU_ARCHIVIZATION);
         addMenuItem(submenu, DssTaskActionMenuKind.COMPUTE_MENU_UNARCHIVIZATION);
+        addMenuItem(submenu, DssTaskActionMenuKind.COMPUTE_MENU_LOCK);
+        addMenuItem(submenu, DssTaskActionMenuKind.COMPUTE_MENU_UNLOCK);
         setMenu(submenu);
     }
 
@@ -99,7 +101,9 @@ public class DataSetComputeMenu extends TextToolItem
         COMPUTE_MENU_QUERIES(DataStoreServiceKind.QUERIES), COMPUTE_MENU_PROCESSING(
                 DataStoreServiceKind.PROCESSING), COMPUTE_MENU_ARCHIVIZATION(
                 DataStoreServiceKind.ARCHIVIZATION), COMPUTE_MENU_UNARCHIVIZATION(
-                DataStoreServiceKind.UNARCHIVIZATION);
+                DataStoreServiceKind.UNARCHIVIZATION),
+        COMPUTE_MENU_LOCK(DataStoreServiceKind.LOCK), COMPUTE_MENU_UNLOCK(
+                DataStoreServiceKind.UNLOCK);
 
         private final DataStoreServiceKind dssTaskKind;
 
@@ -154,6 +158,8 @@ public class DataSetComputeMenu extends TextToolItem
                     {
                         case ARCHIVIZATION:
                         case UNARCHIVIZATION:
+                        case LOCK:
+                        case UNLOCK:
                             return new PerformArchivizationDialog(viewContext, data, title);
                         default:
                             return new PerformComputationDialog(viewContext, data, title);
@@ -193,6 +199,18 @@ public class DataSetComputeMenu extends TextToolItem
                                     new ArchivizationDisplayCallback(viewContext, dssTaskKind
                                             .getDescription()));
                             break;
+                        case LOCK:
+                            viewContext.getService().lockDatasets(
+                                    criteria,
+                                    new ArchivizationDisplayCallback(viewContext, dssTaskKind
+                                            .getDescription()));
+                            break;
+                        case UNLOCK:
+                            viewContext.getService().unlockDatasets(
+                                    criteria,
+                                    new ArchivizationDisplayCallback(viewContext, dssTaskKind
+                                            .getDescription()));
+                            break;
                     }
                 }
             };
@@ -321,6 +339,10 @@ public class DataSetComputeMenu extends TextToolItem
                     return DataSetArchivizationStatus.ACTIVE;
                 case UNARCHIVIZATION:
                     return DataSetArchivizationStatus.ARCHIVED;
+                case LOCK:
+                    return DataSetArchivizationStatus.ACTIVE;
+                case UNLOCK:
+                    return DataSetArchivizationStatus.LOCKED;
                 default:
                     return null; // not possible
             }
@@ -379,7 +401,7 @@ public class DataSetComputeMenu extends TextToolItem
         // not null only if all selected datasets come from the same datastore
         private final DataStore dataStoreOrNull;
 
-        private ComputationDataSetsRadioProvider radioProvider;
+        private final ComputationDataSetsRadioProvider radioProvider;
 
         private Html selectedDataSetTypesText;
 
@@ -656,7 +678,7 @@ public class DataSetComputeMenu extends TextToolItem
 
         private Radio computeOnAllRadio;
 
-        private ComputationData data;
+        private final ComputationData data;
 
         public ComputationDataSetsRadioProvider(ComputationData data)
         {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 6173748f161beb5baade359441e3234eda1b637b..bd49ac7d2937e5fb0513cb3fe0f007ed1189ac90 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -2408,4 +2408,32 @@ public final class CommonClientService extends AbstractClientService implements
         }
     }
 
+    public void lockDatasets(DisplayedOrSelectedDatasetCriteria criteria)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        try
+        {
+            final String sessionToken = getSessionToken();
+            List<String> datasetCodes = extractDatasetCodes(criteria);
+            commonServer.lockDatasets(sessionToken, datasetCodes);
+        } catch (final UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
+    public void unlockDatasets(DisplayedOrSelectedDatasetCriteria criteria)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        try
+        {
+            final String sessionToken = getSessionToken();
+            List<String> datasetCodes = extractDatasetCodes(criteria);
+            commonServer.unlockDatasets(sessionToken, datasetCodes);
+        } catch (final UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index abc649edb57c2c0c1773c6d723413b0cef9c51f2..1b068d545390822d3b5a80e717c56b4186c967e5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -1847,4 +1847,22 @@ public final class CommonServer extends AbstractCommonServer<ICommonServer> impl
         }
     }
 
+    public void lockDatasets(String sessionToken, List<String> datasetCodes)
+    {
+        Session session = getSession(sessionToken);
+        IExternalDataTable externalDataTable =
+                businessObjectFactory.createExternalDataTable(session);
+        externalDataTable.loadByDataSetCodes(datasetCodes, true);
+        externalDataTable.lockDatasets();
+    }
+
+    public void unlockDatasets(String sessionToken, List<String> datasetCodes)
+    {
+        Session session = getSession(sessionToken);
+        IExternalDataTable externalDataTable =
+                businessObjectFactory.createExternalDataTable(session);
+        externalDataTable.loadByDataSetCodes(datasetCodes, true);
+        externalDataTable.unlockDatasets();
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index dd0a6fbe208b494d8885b061b5e26de0509e0695..381ecea0a6d93abab7d2ba84731267289306c0a1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -830,4 +830,14 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         logTracking(sessionToken, "delete_materials", "IDS(%s) REASON(%s)", materialIds, reason);
     }
 
+    public void lockDatasets(String sessionToken, List<String> datasetCodes)
+    {
+        logTracking(sessionToken, "lockDatasets", "NO_OF_DATASETS(%s)", datasetCodes.size());
+    }
+
+    public void unlockDatasets(String sessionToken, List<String> datasetCodes)
+    {
+        logTracking(sessionToken, "unlockDatasets", "NO_OF_DATASETS(%s)", datasetCodes.size());
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java
index 170c670130469d2a1e3eb52a00ef38988d2adecb..4afa55d2606b4aafa3448def746de9e9bb220b31 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExternalDataTable.java
@@ -616,4 +616,18 @@ public final class ExternalDataTable extends AbstractExternalDataBusinessObject
             }
         }
     }
+
+    public void lockDatasets()
+    {
+        Map<DataStorePE, List<ExternalDataPE>> datasetsByStore = groupDataSetsByDataStores();
+        filterByStatusAndUpdate(datasetsByStore, DataSetArchivizationStatus.ACTIVE,
+                DataSetArchivizationStatus.LOCKED);
+    }
+
+    public void unlockDatasets()
+    {
+        Map<DataStorePE, List<ExternalDataPE>> datasetsByStore = groupDataSetsByDataStores();
+        filterByStatusAndUpdate(datasetsByStore, DataSetArchivizationStatus.LOCKED,
+                DataSetArchivizationStatus.ACTIVE);
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExternalDataTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExternalDataTable.java
index 361ed49c1b7bb0539fbed651225783ea5db31dd4..acb990d01fdaaa71e0e5fe87b06048e883ad4aa7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExternalDataTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExternalDataTable.java
@@ -89,4 +89,14 @@ public interface IExternalDataTable
      */
     public void loadByDataStore(DataStorePE dataStore);
 
+    /**
+     * Locks loaded data sets.
+     */
+    void lockDatasets();
+
+    /**
+     * Unlocks loaded data sets.
+     */
+    void unlockDatasets();
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index c19e3270288cda978e74ba201e62b57251711cea..f487a81eb8773b522641cb5a5f4bf5a1bfab7cc3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -1047,4 +1047,22 @@ public interface ICommonServer extends IServer
     @DatabaseCreateOrDeleteModification(value = ObjectKind.MATERIAL)
     public void deleteMaterials(String sessionToken, List<TechId> materialIds, String reason);
 
+    /**
+     * Locks data sets
+     */
+    @Transactional
+    @RolesAllowed(RoleSet.SPACE_ADMIN)
+    @DatabaseUpdateModification(value = ObjectKind.DATA_SET)
+    public void lockDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodePredicate.class) List<String> datasetCodes);
+
+    /**
+     * Unlocks data sets
+     */
+    @Transactional
+    @RolesAllowed(RoleSet.SPACE_ADMIN)
+    @DatabaseUpdateModification(value = ObjectKind.DATA_SET)
+    public void unlockDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodePredicate.class) List<String> datasetCodes);
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataStoreServiceKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataStoreServiceKind.java
index c827d8e0c55c64b1ec34688ff8329ce3be3a6a91..55bcd84e6673995895b9d1342c7043a5b15ec2ca 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataStoreServiceKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataStoreServiceKind.java
@@ -27,7 +27,7 @@ public enum DataStoreServiceKind implements Serializable, IsSerializable
 {
     // Do not refactor names - they are stored in database.
     PROCESSING("Processing"), QUERIES("Query"), ARCHIVIZATION("Archivization"), UNARCHIVIZATION(
-            "Unarchivization");
+            "Unarchivization"), LOCK("Lock"), UNLOCK("Unlock");
 
     private final String description;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index 09e2e37f46287565df3e0e70b3ffae1701cf2255..eb0c677e3196cf7f2f767d628be2b0a4d58fc6ef 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -327,6 +327,8 @@ var common = {
   COMPUTE_MENU_PROCESSING: "Processing",
   COMPUTE_MENU_ARCHIVIZATION: "Archivization",
   COMPUTE_MENU_UNARCHIVIZATION: "Unarchivization",
+  COMPUTE_MENU_LOCK: "Lock",
+  COMPUTE_MENU_UNLOCK: "Unlock",
   
   menu_modules: "Utilities",