diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java
index af47bf3c78e15f87530721745a5e5f24cceb66a6..8ed29fcec5d3a8fb0d666df864e3a443f6a336e6 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetExecutor.java
@@ -20,6 +20,8 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
@@ -121,9 +123,31 @@ public class UpdateDataSetExecutor extends AbstractUpdateEntityExecutor<DataSetU
         PersonPE person = context.getSession().tryGetPerson();
         Date timeStamp = daoFactory.getTransactionTimestamp();
 
-        for (DataPE entity : batch.getObjects().values())
+        for (Entry<DataSetUpdate, DataPE> entry : batch.getObjects().entrySet())
         {
+            DataSetUpdate update = entry.getKey();;
+            DataPE entity = entry.getValue();
             RelationshipUtils.updateModificationDateAndModifier(entity, person, timeStamp);
+            if (update.shouldBeFrozen())
+            {
+                entity.setFrozen(true);
+            }
+            if (update.shouldBeFrozenForChildren())
+            {
+                entity.setFrozenForChildren(true);
+            }
+            if (update.shouldBeFrozenForParents())
+            {
+                entity.setFrozenForParents(true);
+            }
+            if (update.shouldBeFrozenForComponents())
+            {
+                entity.setFrozenForComponents(true);
+            }
+            if (update.shouldBeFrozenForContainers())
+            {
+                entity.setFrozenForContainers(true);
+            }
         }
     }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java
index 90d8b76ed56081bd823b0fb34bc79142bec352f1..7cedba975367a53f38b69830f1ae490f0ede20f5 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentExecutor.java
@@ -20,6 +20,7 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
@@ -110,9 +111,23 @@ public class UpdateExperimentExecutor extends AbstractUpdateEntityExecutor<Exper
         PersonPE person = context.getSession().tryGetPerson();
         Date timeStamp = daoFactory.getTransactionTimestamp();
 
-        for (ExperimentPE entity : batch.getObjects().values())
+        for (Entry<ExperimentUpdate, ExperimentPE> entry : batch.getObjects().entrySet())
         {
-            RelationshipUtils.updateModificationDateAndModifier(entity, person, timeStamp);
+            ExperimentUpdate update = entry.getKey();
+            ExperimentPE experiment = entry.getValue();
+            RelationshipUtils.updateModificationDateAndModifier(experiment, person, timeStamp);
+            if (update.shouldBeFrozen())
+            {
+                experiment.setFrozen(true);
+            }
+            if (update.shouldBeFrozenForDataSets())
+            {
+                experiment.setFrozenForDataSet(true);
+            }
+            if (update.shouldBeFrozenForSamples())
+            {
+                experiment.setFrozenForSample(true);
+            }
         }
     }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/UpdateProjectExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/UpdateProjectExecutor.java
index e9a4078f4f9e9b49587ffd487ac65565a77e14d1..9d8bf937bc3fcf68ff95bbe46cb2b07fd29d1722 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/UpdateProjectExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/UpdateProjectExecutor.java
@@ -110,6 +110,18 @@ public class UpdateProjectExecutor extends AbstractUpdateEntityExecutor<ProjectU
             {
                 project.setDescription(update.getDescription().getValue());
             }
+            if (update.shouldBeFrozen())
+            {
+                project.setFrozen(true);
+            }
+            if (update.shouldBeFrozenForExperiments())
+            {
+                project.setFrozenForExperiment(true);
+            }
+            if (update.shouldBeFrozenForSamples())
+            {
+                project.setFrozenForSample(true);
+            }
         }
     }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleExecutor.java
index 7a0a071c8847b84e275b21d93b463e4eb4cfb218..86008dc50f06826410fc1e61640503c0a9d51394 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleExecutor.java
@@ -21,6 +21,8 @@ import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
@@ -118,12 +120,34 @@ public class UpdateSampleExecutor extends AbstractUpdateEntityExecutor<SampleUpd
     {
         Collection<SamplePE> experimentOrProjectSamples = new ArrayList<SamplePE>();
 
-        for (SamplePE entity : batch.getObjects().values())
+        for (Entry<SampleUpdate, SamplePE> entry : batch.getObjects().entrySet())
         {
+            SampleUpdate update = entry.getKey();
+            SamplePE entity = entry.getValue();;
             if (entity.getExperiment() != null || entity.getProject() != null)
             {
                 experimentOrProjectSamples.add(entity);
             }
+            if (update.shouldBeFrozen())
+            {
+                entity.setFrozen(true);
+            }
+            if (update.shouldBeFrozenForComponents())
+            {
+                entity.setFrozenForComponent(true);
+            }
+            if (update.shouldBeFrozenForChildren())
+            {
+                entity.setFrozenForChildren(true);
+            }
+            if (update.shouldBeFrozenForParents())
+            {
+                entity.setFrozenForParents(true);
+            }
+            if (update.shouldBeFrozenForDataSets())
+            {
+                entity.setFrozenForDataSet(true);
+            }
         }
 
         updateSampleSpaceExecutor.update(context, batch);
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/UpdateSpaceExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/UpdateSpaceExecutor.java
index b4bdd5c78c5ddd903ac406234f18b41c9ec702ed..1e329b7219dbe278831169bfa9dd4f3d16754107 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/UpdateSpaceExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/UpdateSpaceExecutor.java
@@ -91,6 +91,18 @@ public class UpdateSpaceExecutor extends AbstractUpdateEntityExecutor<SpaceUpdat
             {
                 space.setDescription(update.getDescription().getValue());
             }
+            if (update.shouldBeFrozen())
+            {
+                space.setFrozen(true);
+            }
+            if (update.shouldBeFrozenForProjects())
+            {
+                space.setFrozenForProject(true);
+            }
+            if (update.shouldBeFrozenForSamples())
+            {
+                space.setFrozenForSample(true);
+            }
         }
     }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java
index 062756af097d9146011f41211da14acddd1bf5a5..be8021319e28ad83f5ab75c8f86034e142b85f22 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetBaseRecord.java
@@ -41,4 +41,14 @@ public class DataSetBaseRecord extends ObjectBaseRecord
     public Date registrationDate;
 
     public String dataSetKind;
+
+    public boolean frozen;
+
+    public boolean frozenForChildren;
+
+    public boolean frozenForParents;
+
+    public boolean frozenForComponents;
+
+    public boolean frozenForContainers;
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java
index 7c97fc33f2d1699554c2932dc3a1984b4c6fa1d2..b080e28226c94e7b1d7e959110b8a95c0d9261d1 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java
@@ -36,7 +36,12 @@ import net.lemnik.eodsql.Select;
 public interface DataSetQuery extends ObjectQuery
 {
 
-    @Select(sql = "select d.id, d.code, d.is_derived as isDerived, d.data_producer_code as dataProducer, d.production_timestamp as dataProductionDate, d.access_timestamp as accessDate, d.modification_timestamp as modificationDate, d.registration_timestamp as registrationDate, d.data_set_kind as dataSetKind "
+    @Select(sql = "select d.id, d.code, d.is_derived as isDerived, d.data_producer_code as dataProducer, "
+            + "d.production_timestamp as dataProductionDate, d.access_timestamp as accessDate, "
+            + "d.modification_timestamp as modificationDate, d.registration_timestamp as registrationDate, "
+            + "d.data_set_kind as dataSetKind, d.frozen as frozen, d.frozen_for_children as frozenForChildren, "
+            + "d.frozen_for_parents as frozenForParents, d.frozen_for_comps as frozenForComponents, "
+            + "d.frozen_for_conts as frozenForContainers "
             + "from data d where d.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
     public List<DataSetBaseRecord> getDataSets(LongSet dataSetIds);
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java
index 681f2b785ef169ae7e33f2175ba4e6587360f6ad..74831da5fc3bdd96eb3ee71d7038c2fb212e4b3a 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetTranslator.java
@@ -221,6 +221,11 @@ public class DataSetTranslator extends AbstractCachingTranslator<Long, DataSet,
         result.setRegistrationDate(baseRecord.registrationDate);
         result.setPostRegistered(relations.get(IDataSetPostRegisteredTranslator.class, dataSetId));
         result.setKind(DataSetKind.valueOf(baseRecord.dataSetKind));
+        result.setFrozen(baseRecord.frozen);
+        result.setFrozenForChildren(baseRecord.frozenForChildren);
+        result.setFrozenForParents(baseRecord.frozenForParents);
+        result.setFrozenForComponents(baseRecord.frozenForComponents);
+        result.setFrozenForContainers(baseRecord.frozenForContainers);
 
         if (fetchOptions.hasType())
         {
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentBaseRecord.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentBaseRecord.java
index 73697e86227565f4e450b51011dec58d4bc2f99d..241951fabf9557ca6cf9be750f658ab177c9fc9a 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentBaseRecord.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentBaseRecord.java
@@ -34,6 +34,12 @@ public class ExperimentBaseRecord extends ObjectBaseRecord
 
     public String spaceCode;
 
+    public boolean frozen;
+
+    public boolean frozenForDataSets;
+
+    public boolean frozenForSamples;
+
     public Date registrationDate;
 
     public Date modificationDate;
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentQuery.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentQuery.java
index ed8598f5cdb57ef57543e7c1e08cb23b9a0544ec..f263c49ea4f6d4382d117858d177aa0ff50731f2 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentQuery.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentQuery.java
@@ -36,7 +36,9 @@ import ch.systemsx.cisd.common.db.mapper.LongSetMapper;
 public interface ExperimentQuery extends ObjectQuery
 {
 
-    @Select(sql = "select e.id, e.code, e.perm_id as permId, p.code as projectCode, sp.code as spaceCode, e.registration_timestamp as registrationDate, e.modification_timestamp as modificationDate "
+    @Select(sql = "select e.id, e.code, e.perm_id as permId, p.code as projectCode, sp.code as spaceCode, "
+            + "e.registration_timestamp as registrationDate, e.modification_timestamp as modificationDate, "
+            + "e.frozen as frozen, e.frozen_for_data as frozenForDataSets, e.frozen_for_samp as frozenForSamples "
             + "from experiments e join projects p on e.proj_id = p.id "
             + "join spaces sp on p.space_id = sp.id "
             + "where e.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentTranslator.java
index fda8c6a711ef3906eff53babab9a1cca46741044..c5052f6054181fa24b5e84cd19e9cd8ce5c95b0d 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/experiment/ExperimentTranslator.java
@@ -175,6 +175,9 @@ public class ExperimentTranslator extends AbstractCachingTranslator<Long, Experi
         result.setCode(baseRecord.code);
         result.setPermId(new ExperimentPermId(baseRecord.permId));
         result.setIdentifier(new ExperimentIdentifier(baseRecord.spaceCode, baseRecord.projectCode, baseRecord.code));
+        result.setFrozen(baseRecord.frozen);
+        result.setFrozenForDataSets(baseRecord.frozenForDataSets);
+        result.setFrozenForSamples(baseRecord.frozenForSamples);
         result.setRegistrationDate(baseRecord.registrationDate);
         result.setModificationDate(baseRecord.modificationDate);
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectBaseRecord.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectBaseRecord.java
index 853186ed5af7ecafa4ebd53b40b9d23261f803bc..d5204d6df87b663307d65334da352e66c9b9bdc3 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectBaseRecord.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectBaseRecord.java
@@ -34,6 +34,12 @@ public class ProjectBaseRecord extends ObjectBaseRecord
 
     public String description;
 
+    public boolean frozen;
+
+    public boolean frozenForExperiments;
+
+    public boolean frozenForSamples;
+
     public Date registrationDate;
 
     public Date modificationDate;
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectQuery.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectQuery.java
index 61cd6aba848d0f0239b9bb34a6ebd2e23e295417..18481a5957e088d2e958e71348d159df2fc9688f 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectQuery.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectQuery.java
@@ -37,7 +37,9 @@ public interface ProjectQuery extends ObjectQuery
             + "where p.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
     public List<ProjectAuthorizationRecord> getAuthorizations(LongSet longSet);
 
-    @Select(sql = "select p.id, p.code, p.perm_id as permId, sp.code as spaceCode, p.description, p.registration_timestamp as registrationDate, p.modification_timestamp as modificationDate "
+    @Select(sql = "select p.id, p.code, p.perm_id as permId, sp.code as spaceCode, p.description, "
+            + "p.registration_timestamp as registrationDate, p.modification_timestamp as modificationDate, "
+            + "p.frozen as frozen, p.frozen_for_exp as frozenForExperiments, p.frozen_for_samp as frozenForSamples "
             + "from projects p left outer join spaces sp on p.space_id = sp.id "
             + "where p.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
     public List<ProjectBaseRecord> getProjects(LongSet projectIds);
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectTranslator.java
index 4d2468ad84047972dcce73c38a0d3e847ddddbba..9e99bd5ceb56943ac972f3a62cc1fbed29b7fcf5 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/project/ProjectTranslator.java
@@ -146,6 +146,9 @@ public class ProjectTranslator extends AbstractCachingTranslator<Long, Project,
         result.setPermId(new ProjectPermId(baseRecord.permId));
         result.setIdentifier(new ProjectIdentifier(baseRecord.spaceCode, baseRecord.code));
         result.setDescription(baseRecord.description);
+        result.setFrozen(baseRecord.frozen);
+        result.setFrozenForExperiments(baseRecord.frozenForExperiments);
+        result.setFrozenForSamples(baseRecord.frozenForSamples);
         result.setRegistrationDate(baseRecord.registrationDate);
         result.setModificationDate(baseRecord.modificationDate);
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleBaseRecord.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleBaseRecord.java
index 7af80650649ee9b572d326e0f493c219914f79ff..6fd387f73db29838affac0340c45f8d50cdc60d0 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleBaseRecord.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleBaseRecord.java
@@ -36,6 +36,16 @@ public class SampleBaseRecord extends ObjectBaseRecord
 
     public String permId;
 
+    public boolean frozen;
+
+    public boolean frozenForComponents;
+
+    public boolean frozenForChildren;
+
+    public boolean frozenForParents;
+
+    public boolean frozenForDataSets;
+
     public Date registrationDate;
 
     public Date modificationDate;
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java
index e331c0eb5cd1722eeb8a5bf39a95c540e0d72ebd..a25d3c0db823b932fe44febd57d6437dc5556a28 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java
@@ -37,7 +37,9 @@ public interface SampleQuery extends ObjectQuery
 
     @Select(sql = "select s.id, s.code, s.perm_id as permId, sp.code as spaceCode, p.code as projectCode, "
             + "sc.code as containerCode, s.registration_timestamp as registrationDate, "
-            + "s.modification_timestamp as modificationDate "
+            + "s.modification_timestamp as modificationDate, s.frozen as frozen, s.frozen_for_comp as frozenForComponents, "
+            + "s.frozen_for_children as frozenForChildren, s.frozen_for_parents as frozenForParents, "
+            + "s.frozen_for_data as frozenForDatasets "
             + "from samples s left join spaces sp on s.space_id = sp.id "
             + "left join projects p on s.proj_id = p.id "
             + "left join samples sc on s.samp_id_part_of = sc.id "
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleTranslator.java
index 1cee6d3163a45867a640ef250c3710403140d66f..7ef6e113bf640734a8a654f154c49e82da88ba89 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleTranslator.java
@@ -210,6 +210,11 @@ public class SampleTranslator extends AbstractCachingTranslator<Long, Sample, Sa
         result.setCode(baseRecord.code);
         result.setIdentifier(new SampleIdentifier(baseRecord.spaceCode, baseRecord.projectCode,
                 baseRecord.containerCode, baseRecord.code));
+        result.setFrozen(baseRecord.frozen);
+        result.setFrozenForComponents(baseRecord.frozenForComponents);
+        result.setFrozenForChildren(baseRecord.frozenForChildren);
+        result.setFrozenForParents(baseRecord.frozenForParents);
+        result.setFrozenForDataSets(baseRecord.frozenForDataSets);
         result.setModificationDate(baseRecord.modificationDate);
         result.setRegistrationDate(baseRecord.registrationDate);
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceBaseRecord.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceBaseRecord.java
index f0f2ef496c015fea11b374c9594f5e4bc74eaf87..d4e2781d4ab7fbb831255b22b12dee1ff369e33b 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceBaseRecord.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceBaseRecord.java
@@ -30,6 +30,12 @@ public class SpaceBaseRecord extends ObjectBaseRecord
 
     public String description;
 
+    public boolean frozen;
+
+    public boolean frozenForProjects;
+
+    public boolean frozenForSamples;
+
     public Date registrationDate;
 
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceQuery.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceQuery.java
index 79347bbff28cc9001b583ac267b72fc4b1550853..385df7850ece95f23760de323465ae2b7804b00b 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceQuery.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceQuery.java
@@ -35,7 +35,9 @@ public interface SpaceQuery extends ObjectQuery
     @Select(sql = "select s.id, s.code from spaces s where s.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
     public List<SpaceAuthorizationRecord> getAuthorizations(LongSet spaceIds);
 
-    @Select(sql = "select s.id, s.code, s.description, s.registration_timestamp as registrationDate from spaces s where s.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
+    @Select(sql = "select s.id, s.code, s.description, s.registration_timestamp as registrationDate, frozen, "
+            + "frozen_for_proj as frozenForProjects, frozen_for_samp as frozenForSamples "
+            + "from spaces s where s.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
     public List<SpaceBaseRecord> getSpaces(LongSet spaceIds);
 
     @Select(sql = "select s.space_id as objectId, s.id as relatedId from samples s where s.space_id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceTranslator.java
index d4d3b959125bb7a09b60d9c736fd493162d52f15..47edac28fcd37bf805d0befc73db247a570904b6 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/space/SpaceTranslator.java
@@ -102,6 +102,9 @@ public class SpaceTranslator extends AbstractCachingTranslator<Long, Space, Spac
         result.setCode(baseRecord.code);
         result.setPermId(new SpacePermId(baseRecord.code));
         result.setDescription(baseRecord.description);
+        result.setFrozen(baseRecord.frozen);
+        result.setFrozenForProjects(baseRecord.frozenForProjects);
+        result.setFrozenForSamples(baseRecord.frozenForSamples);
         // TODO: add modification date to spaces table
         result.setModificationDate(baseRecord.registrationDate);
         result.setRegistrationDate(baseRecord.registrationDate);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
index 8c9fb277e506b7cbc45d088156731e3b0ddc6e42..e40fc725a482e2fe4b1b6a30a4c51bcef50609df 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/EntityTypePropertyTypeBO.java
@@ -262,10 +262,12 @@ public class EntityTypePropertyTypeBO extends AbstractBusinessObject implements
         if (assignmentUpdates.isDynamic() != assignment.isDynamic())
         {
             throw new UserFailureException(String.format(
-                    "Changing assignment from '%s' to '%s' is not allowed. "
+                    "Changing assignment from '%s' to '%s' for %s.%s is not allowed. "
                             + "Please create a new assignment.",
                     describeDynamic(assignment.isDynamic()),
-                    describeDynamic(assignmentUpdates.isDynamic())));
+                    describeDynamic(assignmentUpdates.isDynamic()),
+                    assignmentUpdates.getEntityTypeCode(),
+                    assignmentUpdates.getPropertyTypeCode()));
         }
         boolean scriptChanged = false;
         if ((assignment.isDynamic() || assignment.isManaged())
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
index 8026515372d4ace2ee343c23e2469941fa84f9a0..817efc5d9babfd33a4ae4c4eacc2f848f883daee 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateDataSetTest.java
@@ -772,6 +772,174 @@ public class UpdateDataSetTest extends AbstractSampleTest
                 "update-data-sets  DATA_SET_UPDATES('[DataSetUpdate[dataSetId=20081105092159111-1], DataSetUpdate[dataSetId=20110509092359990-10]]')");
     }
 
+    @Test
+    public void testFreeze()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        DataSetPermId dsId1 = new DataSetPermId("20081105092159111-1");
+        DataSetUpdate update1 = new DataSetUpdate();
+        update1.setDataSetId(dsId1);
+        update1.freeze();
+        DataSetPermId dsId2 = new DataSetPermId("20081105092159222-2");
+        DataSetUpdate update2 = new DataSetUpdate();
+        update2.setDataSetId(dsId2);
+        update2.freezeForChildren();
+        DataSetPermId dsId3 = new DataSetPermId("20081105092159333-3");
+        DataSetUpdate update3 = new DataSetUpdate();
+        update3.setDataSetId(dsId3);
+        update3.freezeForParents();
+        DataSetPermId dsId4 = new DataSetPermId("20081105092259000-8");
+        DataSetUpdate update4 = new DataSetUpdate();
+        update4.setDataSetId(dsId4);
+        update4.freezeForComponents();
+        DataSetPermId dsId5 = new DataSetPermId("20081105092259000-20");
+        DataSetUpdate update5 = new DataSetUpdate();
+        update5.setDataSetId(dsId5);
+        update5.freezeForContainers();
+
+        // When
+        v3api.updateDataSets(sessionToken, Arrays.asList(update1, update2, update3, update4, update5));
+
+        // Then
+        Map<IDataSetId, DataSet> dataSets =
+                v3api.getDataSets(sessionToken, Arrays.asList(dsId1, dsId2, dsId3, dsId4, dsId5), new DataSetFetchOptions());
+        DataSet ds1 = dataSets.get(dsId1);
+        assertEquals(ds1.isFrozen(), true);
+        assertEquals(ds1.isFrozenForChildren(), false);
+        assertEquals(ds1.isFrozenForParents(), false);
+        assertEquals(ds1.isFrozenForComponents(), false);
+        assertEquals(ds1.isFrozenForContainers(), false);
+        DataSet ds2 = dataSets.get(dsId2);
+        assertEquals(ds2.isFrozen(), true);
+        assertEquals(ds2.isFrozenForChildren(), true);
+        assertEquals(ds2.isFrozenForParents(), false);
+        assertEquals(ds2.isFrozenForComponents(), false);
+        assertEquals(ds2.isFrozenForContainers(), false);
+        DataSet ds3 = dataSets.get(dsId3);
+        assertEquals(ds3.isFrozen(), true);
+        assertEquals(ds3.isFrozenForChildren(), false);
+        assertEquals(ds3.isFrozenForParents(), true);
+        assertEquals(ds3.isFrozenForComponents(), false);
+        assertEquals(ds3.isFrozenForContainers(), false);
+        DataSet ds4 = dataSets.get(dsId4);
+        assertEquals(ds4.isFrozen(), true);
+        assertEquals(ds4.isFrozenForChildren(), false);
+        assertEquals(ds4.isFrozenForParents(), false);
+        assertEquals(ds4.isFrozenForComponents(), true);
+        assertEquals(ds4.isFrozenForContainers(), false);
+        DataSet ds5 = dataSets.get(dsId5);
+        assertEquals(ds5.isFrozen(), true);
+        assertEquals(ds5.isFrozenForChildren(), false);
+        assertEquals(ds5.isFrozenForParents(), false);
+        assertEquals(ds5.isFrozenForComponents(), false);
+        assertEquals(ds5.isFrozenForContainers(), true);
+    }
+
+    @Test
+    public void testFreezing()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        DataSetPermId dsId = new DataSetPermId("20081105092159111-1");
+        DataSetUpdate update = new DataSetUpdate();
+        update.setDataSetId(dsId);
+        update.freeze();
+        v3api.updateDataSets(sessionToken, Arrays.asList(update));
+        DataSetUpdate dataSetUpdate = new DataSetUpdate();
+        dataSetUpdate.setDataSetId(dsId);
+        dataSetUpdate.setProperty("COMMENT", "test comment");
+
+        // When
+        assertUserFailureException(Void -> v3api.updateDataSets(sessionToken, Arrays.asList(dataSetUpdate)),
+                // Then
+                "ERROR: Operation UPDATE PROPERTY is not allowed because data set 20081105092159111-1 is frozen.");
+    }
+
+    @Test
+    public void testFreezingForChildren()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        DataSetPermId dsId = new DataSetPermId("20081105092159111-1");
+        DataSetUpdate update = new DataSetUpdate();
+        update.setDataSetId(dsId);
+        update.freezeForChildren();
+        v3api.updateDataSets(sessionToken, Arrays.asList(update));
+        DataSetUpdate dataSetUpdate = new DataSetUpdate();
+        dataSetUpdate.setDataSetId(dsId);
+        dataSetUpdate.getChildIds().add(new DataSetPermId("20081105092259000-20"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateDataSets(sessionToken, Arrays.asList(dataSetUpdate)),
+                // Then
+                "ERROR: Operation INSERT PARENT_CHILD is not allowed because data set 20081105092159111-1 "
+                        + "or 20081105092259000-20 is frozen.");
+    }
+
+    @Test
+    public void testFreezingForParents()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        DataSetPermId dsId = new DataSetPermId("20081105092159111-1");
+        DataSetUpdate update = new DataSetUpdate();
+        update.setDataSetId(dsId);
+        update.freezeForParents();
+        v3api.updateDataSets(sessionToken, Arrays.asList(update));
+        DataSetUpdate dataSetUpdate = new DataSetUpdate();
+        dataSetUpdate.setDataSetId(dsId);
+        dataSetUpdate.getParentIds().add(new DataSetPermId("20081105092259000-20"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateDataSets(sessionToken, Arrays.asList(dataSetUpdate)),
+                // Then
+                "ERROR: Operation INSERT PARENT_CHILD is not allowed because data set 20081105092259000-20 "
+                        + "or 20081105092159111-1 is frozen.");
+    }
+
+    @Test
+    public void testFreezingForComponents()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        DataSetPermId dsId = new DataSetPermId("CONTAINER_1");
+        DataSetUpdate update = new DataSetUpdate();
+        update.setDataSetId(dsId);
+        update.freezeForComponents();
+        v3api.updateDataSets(sessionToken, Arrays.asList(update));
+        DataSetUpdate dataSetUpdate = new DataSetUpdate();
+        dataSetUpdate.setDataSetId(dsId);
+        dataSetUpdate.getComponentIds().add(new DataSetPermId("20081105092259000-20"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateDataSets(sessionToken, Arrays.asList(dataSetUpdate)),
+                // Then
+                "ERROR: Operation INSERT CONTAINER_COMPONENT is not allowed because data set CONTAINER_1 "
+                        + "or 20081105092259000-20 is frozen.");
+    }
+
+    @Test
+    public void testFreezingForContainers()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        DataSetPermId dsId = new DataSetPermId("20081105092259000-20");
+        DataSetUpdate update = new DataSetUpdate();
+        update.setDataSetId(dsId);
+        update.freezeForContainers();
+        v3api.updateDataSets(sessionToken, Arrays.asList(update));
+        DataSetUpdate dataSetUpdate = new DataSetUpdate();
+        dataSetUpdate.setDataSetId(dsId);
+        dataSetUpdate.getContainerIds().add(new DataSetPermId("CONTAINER_1"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateDataSets(sessionToken, Arrays.asList(dataSetUpdate)),
+                // Then
+                "ERROR: Operation INSERT CONTAINER_COMPONENT is not allowed because data set CONTAINER_1 "
+                        + "or 20081105092259000-20 is frozen.");
+    }
+
     private Collection<String> dataSetCodes(Collection<? extends DataSet> list)
     {
         LinkedList<String> result = new LinkedList<String>();
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
index 46f2a1159b0cf9d259f378d2d7ec6a88e3a2f0f8..4fd97b410d2ab43e5c3beea5acc8879fda2b68aa 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateExperimentTest.java
@@ -30,6 +30,10 @@ import org.testng.annotations.Test;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.Attachment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.create.AttachmentCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.id.AttachmentFileName;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSetKind;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create.DataSetCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.datastore.id.DataStorePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.EntityKind;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.create.ExperimentCreation;
@@ -59,6 +63,7 @@ import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUse
  */
 public class UpdateExperimentTest extends AbstractExperimentTest
 {
+    private static final String PREFIX = "UET-";
 
     @Test
     public void testUpdateWithIndexCheck()
@@ -755,6 +760,132 @@ public class UpdateExperimentTest extends AbstractExperimentTest
         }
     }
 
+    @Test
+    public void testFreezeForSamples()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentIdentifier expId1 = new ExperimentIdentifier("/CISD/NEMO/EXP10");
+        ExperimentIdentifier expId2 = new ExperimentIdentifier("/CISD/NEMO/EXP11");
+        ExperimentUpdate update1 = new ExperimentUpdate();
+        update1.setExperimentId(expId1);
+        update1.freeze();
+        ExperimentUpdate update2 = new ExperimentUpdate();
+        update2.setExperimentId(expId2);
+        update2.freezeForSamples();
+
+        // When
+        v3api.updateExperiments(sessionToken, Arrays.asList(update1, update2));
+
+        // Then
+        Map<IExperimentId, Experiment> experiments = v3api.getExperiments(sessionToken, Arrays.asList(expId1, expId2), new ExperimentFetchOptions());
+        Experiment experiment1 = experiments.get(expId1);
+        assertEquals(experiment1.getIdentifier().getIdentifier(), expId1.getIdentifier());
+        assertEquals(experiment1.isFrozen(), true);
+        assertEquals(experiment1.isFrozenForDataSets(), false);
+        assertEquals(experiment1.isFrozenForSamples(), false);
+        Experiment experiment2 = experiments.get(expId2);
+        assertEquals(experiment2.getIdentifier().getIdentifier(), expId2.getIdentifier());
+        assertEquals(experiment2.isFrozen(), true);
+        assertEquals(experiment2.isFrozenForDataSets(), false);
+        assertEquals(experiment2.isFrozenForSamples(), true);
+    }
+
+    @Test
+    public void testFreezeForDataSets()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentIdentifier expId1 = new ExperimentIdentifier("/CISD/NEMO/EXP10");
+        ExperimentIdentifier expId2 = new ExperimentIdentifier("/CISD/NEMO/EXP11");
+        ExperimentUpdate update1 = new ExperimentUpdate();
+        update1.setExperimentId(expId1);
+        update1.freeze();
+        ExperimentUpdate update2 = new ExperimentUpdate();
+        update2.setExperimentId(expId2);
+        update2.freezeForDataSets();
+
+        // When
+        v3api.updateExperiments(sessionToken, Arrays.asList(update1, update2));
+
+        // Then
+        Map<IExperimentId, Experiment> experiments = v3api.getExperiments(sessionToken, Arrays.asList(expId1, expId2), new ExperimentFetchOptions());
+        Experiment experiment1 = experiments.get(expId1);
+        assertEquals(experiment1.getIdentifier().getIdentifier(), expId1.getIdentifier());
+        assertEquals(experiment1.isFrozen(), true);
+        assertEquals(experiment1.isFrozenForDataSets(), false);
+        assertEquals(experiment1.isFrozenForSamples(), false);
+        Experiment experiment2 = experiments.get(expId2);
+        assertEquals(experiment2.getIdentifier().getIdentifier(), expId2.getIdentifier());
+        assertEquals(experiment2.isFrozen(), true);
+        assertEquals(experiment2.isFrozenForDataSets(), true);
+        assertEquals(experiment2.isFrozenForSamples(), false);
+    }
+
+    @Test
+    public void testFreezing()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentIdentifier expId = new ExperimentIdentifier("/CISD/NEMO/EXP10");
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(expId);
+        update.freeze();
+        v3api.updateExperiments(sessionToken, Arrays.asList(update));
+        ExperimentUpdate update2 = new ExperimentUpdate();
+        update2.setExperimentId(expId);
+        update2.setProperty("DESCRIPTION", "new description");
+
+        // When
+        assertUserFailureException(Void -> v3api.updateExperiments(sessionToken, Arrays.asList(update2)),
+                // Then
+                "ERROR: Operation UPDATE PROPERTY is not allowed because experiment EXP10 is frozen.");
+    }
+
+    @Test
+    public void testFreezingForSample()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentIdentifier expId = new ExperimentIdentifier("/CISD/NEMO/EXP10");
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(expId);
+        update.freezeForSamples();
+        v3api.updateExperiments(sessionToken, Arrays.asList(update));
+        SampleCreation sampleCreation = new SampleCreation();
+        sampleCreation.setExperimentId(expId);
+        sampleCreation.setTypeId(new EntityTypePermId("NORMAL", EntityKind.SAMPLE));
+        sampleCreation.setCode(PREFIX + "S1");
+
+        // When
+        assertUserFailureException(Void -> v3api.createSamples(sessionToken, Arrays.asList(sampleCreation)),
+                // Then
+                "ERROR: Operation SET EXPERIMENT is not allowed because experiment EXP10 is frozen for sample UET-S1.");
+    }
+
+    @Test
+    public void testFreezingForDataSets()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentIdentifier expId = new ExperimentIdentifier("/CISD/NEMO/EXP10");
+        ExperimentUpdate update = new ExperimentUpdate();
+        update.setExperimentId(expId);
+        update.freezeForDataSets();
+        v3api.updateExperiments(sessionToken, Arrays.asList(update));
+        DataSetCreation dataSetCreation = new DataSetCreation();
+        dataSetCreation.setCode(PREFIX + "D1");
+        dataSetCreation.setTypeId(new EntityTypePermId("DELETION_TEST_CONTAINER", EntityKind.DATA_SET));
+        dataSetCreation.setDataStoreId(new DataStorePermId("STANDARD"));
+        dataSetCreation.setDataSetKind(DataSetKind.CONTAINER);
+        dataSetCreation.setExperimentId(expId);
+
+        // When
+        assertUserFailureException(Void -> v3api.createDataSets(sessionToken, Arrays.asList(dataSetCreation)),
+                // Then
+                "ERROR: Operation SET EXPERIMENT is not allowed because experiment EXP10 is frozen for data set UET-D1.");
+    }
+
     @Test
     public void testLogging()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateProjectTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateProjectTest.java
index 08aecc05696ef8db1faea6fe4f13f538a9d31e8b..5a6784fe325004ce67410ef935dbbf811bcff328 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateProjectTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateProjectTest.java
@@ -30,7 +30,10 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.create.AttachmentCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.EntityKind;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.create.ExperimentCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.Project;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.create.ProjectCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.fetchoptions.ProjectFetchOptions;
@@ -50,6 +53,7 @@ import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUse
  */
 public class UpdateProjectTest extends AbstractTest
 {
+    private static final String PREFIX = "UPT-";
 
     @Test
     public void testUpdateWithProjectNull()
@@ -368,4 +372,107 @@ public class UpdateProjectTest extends AbstractTest
                 "update-projects  PROJECT_UPDATES('[ProjectUpdate[projectId=/TEST-SPACE/TEST-PROJECT], ProjectUpdate[projectId=20120814110011738-101]]')");
     }
 
+    @Test
+    public void testFreezeForExperiments()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        final IProjectId projectId1 = new ProjectIdentifier("/CISD/NEMO");
+        ProjectUpdate update1 = new ProjectUpdate();
+        update1.setProjectId(projectId1);
+        update1.freeze();
+        final IProjectId projectId2 = new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT");
+        ProjectUpdate update2 = new ProjectUpdate();
+        update2.setProjectId(projectId2);
+        update2.freezeForExperiments();
+
+        // When
+        v3api.updateProjects(sessionToken, Arrays.asList(update1, update2));
+
+        // Then
+        Map<IProjectId, Project> projects = v3api.getProjects(sessionToken, Arrays.asList(projectId1, projectId2), new ProjectFetchOptions());
+        Project project1 = projects.get(projectId1);
+        assertEquals(project1.getIdentifier().getIdentifier(), projectId1.toString());
+        assertEquals(project1.isFrozen(), true);
+        assertEquals(project1.isFrozenForExperiments(), false);
+        assertEquals(project1.isFrozenForSamples(), false);
+        Project project2 = projects.get(projectId2);
+        assertEquals(project2.getIdentifier().getIdentifier(), projectId2.toString());
+        assertEquals(project2.isFrozen(), true);
+        assertEquals(project2.isFrozenForExperiments(), true);
+        assertEquals(project2.isFrozenForSamples(), false);
+    }
+
+    @Test
+    public void testFreezeForSamples()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        final IProjectId projectId1 = new ProjectIdentifier("/CISD/NEMO");
+        ProjectUpdate update1 = new ProjectUpdate();
+        update1.setProjectId(projectId1);
+        update1.freeze();
+        final IProjectId projectId2 = new ProjectIdentifier("/TEST-SPACE/TEST-PROJECT");
+        ProjectUpdate update2 = new ProjectUpdate();
+        update2.setProjectId(projectId2);
+        update2.freezeForSamples();
+
+        // When
+        v3api.updateProjects(sessionToken, Arrays.asList(update1, update2));
+
+        // Then
+        Map<IProjectId, Project> projects = v3api.getProjects(sessionToken, Arrays.asList(projectId1, projectId2), new ProjectFetchOptions());
+        Project project1 = projects.get(projectId1);
+        assertEquals(project1.getIdentifier().getIdentifier(), projectId1.toString());
+        assertEquals(project1.isFrozen(), true);
+        assertEquals(project1.isFrozenForExperiments(), false);
+        assertEquals(project1.isFrozenForSamples(), false);
+        Project project2 = projects.get(projectId2);
+        assertEquals(project2.getIdentifier().getIdentifier(), projectId2.toString());
+        assertEquals(project2.isFrozen(), true);
+        assertEquals(project2.isFrozenForExperiments(), false);
+        assertEquals(project2.isFrozenForSamples(), true);
+    }
+
+    @Test
+    public void testFreezing()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        final IProjectId projectId = new ProjectIdentifier("/CISD/NEMO");
+        ProjectUpdate update = new ProjectUpdate();
+        update.setProjectId(projectId);
+        update.freeze();
+        v3api.updateProjects(sessionToken, Arrays.asList(update));
+        ProjectUpdate update2 = new ProjectUpdate();
+        update2.setProjectId(projectId);
+        update2.setDescription("new description");
+
+        // When
+        assertUserFailureException(Void -> v3api.updateProjects(sessionToken, Arrays.asList(update2)),
+                // Then
+                "ERROR: Operation UPDATE is not allowed because project NEMO is frozen.");
+    }
+
+    @Test
+    public void testFreezingForExperiments()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        final IProjectId projectId = new ProjectIdentifier("/CISD/NEMO");
+        ProjectUpdate update = new ProjectUpdate();
+        update.setProjectId(projectId);
+        update.freezeForExperiments();
+        v3api.updateProjects(sessionToken, Arrays.asList(update));
+        ExperimentCreation experimentCreation = new ExperimentCreation();
+        experimentCreation.setProjectId(projectId);
+        experimentCreation.setTypeId(new EntityTypePermId("DELETION_TEST", EntityKind.EXPERIMENT));
+        experimentCreation.setCode(PREFIX + "E1");
+
+        // When
+        assertUserFailureException(Void -> v3api.createExperiments(sessionToken, Arrays.asList(experimentCreation)),
+                // Then
+                "ERROR: Operation SET PROJECT is not allowed because project NEMO is frozen for experiment UPT-E1.");
+    }
+
 }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java
index 98bb2fc3607c4359622e424cbffa0896d2e3347f..d32d42480ac579eca49508ba889131bd01ec319a 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSampleTest.java
@@ -34,6 +34,10 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.create.AttachmentCrea
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.id.AttachmentFileName;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.CreationId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSet;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSetKind;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create.DataSetCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.datastore.id.DataStorePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.EntityKind;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentPermId;
@@ -55,7 +59,6 @@ import ch.ethz.sis.openbis.systemtest.asapi.v3.index.ReindexingState;
 import ch.systemsx.cisd.common.action.IDelegatedAction;
 import ch.systemsx.cisd.common.test.AssertionUtil;
 import ch.systemsx.cisd.openbis.systemtest.authorization.ProjectAuthorizationUser;
-
 import junit.framework.Assert;
 
 /**
@@ -63,6 +66,8 @@ import junit.framework.Assert;
  */
 public class UpdateSampleTest extends AbstractSampleTest
 {
+    private static final String PREFIX = "UST-";
+
     @Test
     public void testUpdateSharedSampleWithHomelessPowerUser()
     {
@@ -1514,4 +1519,175 @@ public class UpdateSampleTest extends AbstractSampleTest
                 "update-samples  SAMPLE_UPDATES('[SampleUpdate[sampleId=/CISD/CP-TEST-1], SampleUpdate[sampleId=201206191219327-1055]]')");
     }
 
+    @Test
+    public void testFreeze()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        SampleIdentifier sampleId1 = new SampleIdentifier("/CISD/MP002-1:B11");
+        SampleUpdate update1 = new SampleUpdate();
+        update1.setSampleId(sampleId1);
+        update1.freeze();
+        SampleIdentifier sampleId2 = new SampleIdentifier("/CISD/MP002-1:B12");
+        SampleUpdate update2 = new SampleUpdate();
+        update2.setSampleId(sampleId2);
+        update2.freezeForComponents();
+        SampleIdentifier sampleId3 = new SampleIdentifier("/CISD/MP002-1:B13");
+        SampleUpdate update3 = new SampleUpdate();
+        update3.setSampleId(sampleId3);
+        update3.freezeForChildren();
+        SampleIdentifier sampleId4 = new SampleIdentifier("/CISD/MP002-1:B14");
+        SampleUpdate update4 = new SampleUpdate();
+        update4.setSampleId(sampleId4);
+        update4.freezeForParents();
+        SampleIdentifier sampleId5 = new SampleIdentifier("/CISD/MP002-1:B15");
+        SampleUpdate update5 = new SampleUpdate();
+        update5.setSampleId(sampleId5);
+        update5.freezeForDataSets();
+
+        // When
+        v3api.updateSamples(sessionToken, Arrays.asList(update1, update2, update3, update4, update5));
+
+        // Then
+        Map<ISampleId, Sample> samples = v3api.getSamples(sessionToken,
+                Arrays.asList(sampleId1, sampleId2, sampleId3, sampleId4, sampleId5), new SampleFetchOptions());
+        Sample sample1 = samples.get(sampleId1);
+        assertEquals(sample1.getIdentifier().getIdentifier(), sampleId1.getIdentifier());
+        assertEquals(sample1.isFrozen(), true);
+        assertEquals(sample1.isFrozenForComponents(), false);
+        assertEquals(sample1.isFrozenForChildren(), false);
+        assertEquals(sample1.isFrozenForParents(), false);
+        assertEquals(sample1.isFrozenForDataSets(), false);
+        Sample sample2 = samples.get(sampleId2);
+        assertEquals(sample2.getIdentifier().getIdentifier(), sampleId2.getIdentifier());
+        assertEquals(sample2.isFrozen(), true);
+        assertEquals(sample2.isFrozenForComponents(), true);
+        assertEquals(sample2.isFrozenForChildren(), false);
+        assertEquals(sample2.isFrozenForParents(), false);
+        assertEquals(sample2.isFrozenForDataSets(), false);
+        Sample sample3 = samples.get(sampleId3);
+        assertEquals(sample3.getIdentifier().getIdentifier(), sampleId3.getIdentifier());
+        assertEquals(sample3.isFrozen(), true);
+        assertEquals(sample3.isFrozenForComponents(), false);
+        assertEquals(sample3.isFrozenForChildren(), true);
+        assertEquals(sample3.isFrozenForParents(), false);
+        assertEquals(sample3.isFrozenForDataSets(), false);
+        Sample sample4 = samples.get(sampleId4);
+        assertEquals(sample4.getIdentifier().getIdentifier(), sampleId4.getIdentifier());
+        assertEquals(sample4.isFrozen(), true);
+        assertEquals(sample4.isFrozenForComponents(), false);
+        assertEquals(sample4.isFrozenForChildren(), false);
+        assertEquals(sample4.isFrozenForParents(), true);
+        assertEquals(sample4.isFrozenForDataSets(), false);
+        Sample sample5 = samples.get(sampleId5);
+        assertEquals(sample5.getIdentifier().getIdentifier(), sampleId5.getIdentifier());
+        assertEquals(sample5.isFrozen(), true);
+        assertEquals(sample5.isFrozenForComponents(), false);
+        assertEquals(sample5.isFrozenForChildren(), false);
+        assertEquals(sample5.isFrozenForParents(), false);
+        assertEquals(sample5.isFrozenForDataSets(), true);
+    }
+
+    @Test
+    public void testFreezing()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        SampleIdentifier sampleId = new SampleIdentifier("/CISD/C1");
+        SampleUpdate update = new SampleUpdate();
+        update.setSampleId(sampleId);
+        update.freeze();
+        v3api.updateSamples(sessionToken, Arrays.asList(update));
+        SampleUpdate update2 = new SampleUpdate();
+        update2.setSampleId(sampleId);
+        update2.setProperty("DESCRIPTION", "a test");
+
+        // When
+        assertUserFailureException(Void -> v3api.updateSamples(sessionToken, Arrays.asList(update2)),
+                // Then
+                "ERROR: Operation INSERT PROPERTY is not allowed because sample C1 is frozen.");
+    }
+
+    @Test
+    public void testFreezingForComponents()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        SampleIdentifier sampleId = new SampleIdentifier("/CISD/C1");
+        SampleUpdate update = new SampleUpdate();
+        update.setSampleId(sampleId);
+        update.freezeForComponents();
+        v3api.updateSamples(sessionToken, Arrays.asList(update));
+        SampleUpdate update2 = new SampleUpdate();
+        update2.setSampleId(sampleId);
+        update2.getComponentIds().remove(new SampleIdentifier("/CISD/C1:C01"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateSamples(sessionToken, Arrays.asList(update2)),
+                // Then
+                "ERROR: Operation REMOVE CONTAINER is not allowed because sample C1 is frozen for sample C01.");
+    }
+
+    @Test
+    public void testFreezingForChildren()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        SampleIdentifier sampleId = new SampleIdentifier("/CISD/C1");
+        SampleUpdate update = new SampleUpdate();
+        update.setSampleId(sampleId);
+        update.freezeForChildren();
+        v3api.updateSamples(sessionToken, Arrays.asList(update));
+        SampleUpdate update2 = new SampleUpdate();
+        update2.setSampleId(sampleId);
+        update2.getChildIds().add(new SampleIdentifier("/CISD/C2"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateSamples(sessionToken, Arrays.asList(update2)),
+                // Then
+                "ERROR: Operation INSERT is not allowed because sample C1 or C2 is frozen.");
+    }
+
+    @Test
+    public void testFreezingForParents()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        SampleIdentifier sampleId = new SampleIdentifier("/CISD/C1");
+        SampleUpdate update = new SampleUpdate();
+        update.setSampleId(sampleId);
+        update.freezeForParents();
+        v3api.updateSamples(sessionToken, Arrays.asList(update));
+        SampleUpdate update2 = new SampleUpdate();
+        update2.setSampleId(sampleId);
+        update2.getParentIds().add(new SampleIdentifier("/CISD/C2"));
+
+        // When
+        assertUserFailureException(Void -> v3api.updateSamples(sessionToken, Arrays.asList(update2)),
+                // Then
+                "ERROR: Operation INSERT is not allowed because sample C2 or C1 is frozen.");
+    }
+
+    @Test
+    public void testFreezingForDataSets()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        SampleIdentifier sampleId = new SampleIdentifier("/CISD/C1");
+        SampleUpdate update = new SampleUpdate();
+        update.setSampleId(sampleId);
+        update.freezeForDataSets();
+        v3api.updateSamples(sessionToken, Arrays.asList(update));
+        DataSetCreation dataSetCreation = new DataSetCreation();
+        dataSetCreation.setCode(PREFIX + "D1");
+        dataSetCreation.setTypeId(new EntityTypePermId("DELETION_TEST_CONTAINER", EntityKind.DATA_SET));
+        dataSetCreation.setDataStoreId(new DataStorePermId("STANDARD"));
+        dataSetCreation.setDataSetKind(DataSetKind.CONTAINER);
+        dataSetCreation.setSampleId(sampleId);
+
+        // When
+        assertUserFailureException(Void -> v3api.createDataSets(sessionToken, Arrays.asList(dataSetCreation)),
+                // Then
+                "ERROR: Operation SET SAMPLE is not allowed because sample C1 is frozen for data set UST-D1.");
+    }
 }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSpaceTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSpaceTest.java
index b412e04469234e303e113bcccee2be64da68958a..5c6d6b52514258b47a1bf630b7237066509e24cb 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSpaceTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/UpdateSpaceTest.java
@@ -23,6 +23,10 @@ import java.util.Map;
 
 import org.testng.annotations.Test;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.EntityKind;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.create.ProjectCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.SampleCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.Space;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.fetchoptions.SpaceFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.ISpaceId;
@@ -35,6 +39,7 @@ import ch.systemsx.cisd.common.action.IDelegatedAction;
  */
 public class UpdateSpaceTest extends AbstractTest
 {
+    private static final String PREFIX = "UST-";
 
     @Test
     public void testUpdateWithSpaceUnauthorized()
@@ -134,6 +139,146 @@ public class UpdateSpaceTest extends AbstractTest
         assertEquals(space2.getDescription(), update2.getDescription().getValue());
     }
 
+    @Test
+    public void testFreezeForProjects()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        final String spaceCode1 = "CISD";
+        final String spaceCode2 = "TEST-SPACE";
+        final ISpaceId spaceId1 = new SpacePermId(spaceCode1);
+        final ISpaceId spaceId2 = new SpacePermId(spaceCode2);
+        Map<ISpaceId, Space> map = v3api.getSpaces(sessionToken, Arrays.asList(spaceId1, spaceId2), new SpaceFetchOptions());
+        Space space1 = map.get(spaceId1);
+        Space space2 = map.get(spaceId2);
+        assertEquals(space1.getCode(), spaceCode1);
+        assertEquals(space2.getCode(), spaceCode2);
+
+        final SpaceUpdate update1 = new SpaceUpdate();
+        update1.setSpaceId(spaceId1);
+        update1.freeze();
+        final SpaceUpdate update2 = new SpaceUpdate();
+        update2.setSpaceId(spaceId2);
+        update2.freezeForProjects();
+
+        // When
+        v3api.updateSpaces(sessionToken, Arrays.asList(update1, update2));
+
+        // Then
+        map = v3api.getSpaces(sessionToken, Arrays.asList(spaceId1, spaceId2), new SpaceFetchOptions());
+        space1 = map.get(spaceId1);
+        space2 = map.get(spaceId2);
+        assertEquals(space1.getCode(), spaceCode1);
+        assertEquals(space1.isFrozen(), true);
+        assertEquals(space1.isFrozenForProjects(), false);
+        assertEquals(space1.isFrozenForSamples(), false);
+        assertEquals(space2.getCode(), spaceCode2);
+        assertEquals(space2.isFrozen(), true);
+        assertEquals(space2.isFrozenForProjects(), true);
+        assertEquals(space2.isFrozenForSamples(), false);
+    }
+
+    @Test
+    public void testFreezeForSamples()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        final String spaceCode1 = "CISD";
+        final String spaceCode2 = "TEST-SPACE";
+        final ISpaceId spaceId1 = new SpacePermId(spaceCode1);
+        final ISpaceId spaceId2 = new SpacePermId(spaceCode2);
+        Map<ISpaceId, Space> map = v3api.getSpaces(sessionToken, Arrays.asList(spaceId1, spaceId2), new SpaceFetchOptions());
+        Space space1 = map.get(spaceId1);
+        Space space2 = map.get(spaceId2);
+        assertEquals(space1.getCode(), spaceCode1);
+        assertEquals(space2.getCode(), spaceCode2);
+
+        final SpaceUpdate update1 = new SpaceUpdate();
+        update1.setSpaceId(spaceId1);
+        update1.freeze();
+        final SpaceUpdate update2 = new SpaceUpdate();
+        update2.setSpaceId(spaceId2);
+        update2.freezeForSamples();
+
+        // When
+        v3api.updateSpaces(sessionToken, Arrays.asList(update1, update2));
+
+        // Then
+        map = v3api.getSpaces(sessionToken, Arrays.asList(spaceId1, spaceId2), new SpaceFetchOptions());
+        space1 = map.get(spaceId1);
+        space2 = map.get(spaceId2);
+        assertEquals(space1.getCode(), spaceCode1);
+        assertEquals(space1.isFrozen(), true);
+        assertEquals(space1.isFrozenForProjects(), false);
+        assertEquals(space1.isFrozenForSamples(), false);
+        assertEquals(space2.getCode(), spaceCode2);
+        assertEquals(space2.isFrozen(), true);
+        assertEquals(space2.isFrozenForProjects(), false);
+        assertEquals(space2.isFrozenForSamples(), true);
+    }
+
+    @Test
+    public void testFreezing()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        final String spaceCode1 = "CISD";
+        final ISpaceId spaceId1 = new SpacePermId(spaceCode1);
+        final SpaceUpdate update1 = new SpaceUpdate();
+        update1.setSpaceId(spaceId1);
+        update1.freeze();
+        v3api.updateSpaces(sessionToken, Arrays.asList(update1));
+        SpaceUpdate update2 = new SpaceUpdate();
+        update2.setSpaceId(spaceId1);
+        update2.setDescription("new description");
+
+        // When
+        assertUserFailureException(Void -> v3api.updateSpaces(sessionToken, Arrays.asList(update2)),
+                // Then
+                "ERROR: Operation UPDATE is not allowed because space CISD is frozen.");
+    }
+
+    @Test
+    public void testFreezingForProjects()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        SpacePermId spaceId = new SpacePermId("CISD");
+        SpaceUpdate spaceUpdate = new SpaceUpdate();
+        spaceUpdate.setSpaceId(spaceId);
+        spaceUpdate.freezeForProjects();
+        v3api.updateSpaces(sessionToken, Arrays.asList(spaceUpdate));
+        ProjectCreation projectCreation = new ProjectCreation();
+        projectCreation.setCode(PREFIX + "P1");
+        projectCreation.setSpaceId(spaceId);
+
+        // When
+        assertUserFailureException(Void -> v3api.createProjects(sessionToken, Arrays.asList(projectCreation)),
+                "ERROR: Operation SET SPACE is not allowed because space CISD is frozen for project " 
+        + projectCreation.getCode() + ".");
+    }
+
+    @Test
+    public void testFreezingForSamples()
+    {
+        // Given
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        SpacePermId spaceId = new SpacePermId("CISD");
+        SpaceUpdate spaceUpdate = new SpaceUpdate();
+        spaceUpdate.setSpaceId(spaceId);
+        spaceUpdate.freezeForSamples();
+        v3api.updateSpaces(sessionToken, Arrays.asList(spaceUpdate));
+        SampleCreation sampleCreation = new SampleCreation();
+        sampleCreation.setSpaceId(spaceId);
+        sampleCreation.setTypeId(new EntityTypePermId("NORMAL", EntityKind.SAMPLE));
+        sampleCreation.setCode(PREFIX + "S1");
+        
+        // When
+        assertUserFailureException(Void -> v3api.createSamples(sessionToken, Arrays.asList(sampleCreation)),
+                // Then
+                "ERROR: Operation SET SPACE is not allowed because space CISD is frozen for sample UST-S1.");
+    }
+    
     @Test
     public void testLogging()
     {
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java
index bd03cba89d659e1884fd55252f8965665121e4e8..31932395ed6174478ffb2d0dff8abdfbf54fa893 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/DataSet.java
@@ -55,7 +55,9 @@ import java.util.Set;
  * Class automatically generated with DtoGenerator
  */
 @JsonObject("as.dto.dataset.DataSet")
-public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IExperimentHolder, IMaterialPropertiesHolder, IModificationDateHolder, IModifierHolder, IParentChildrenHolder<DataSet>, IPermIdHolder, IPropertiesHolder, IRegistrationDateHolder, IRegistratorHolder, ISampleHolder, ITagsHolder
+public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IExperimentHolder, IMaterialPropertiesHolder, IModificationDateHolder,
+        IModifierHolder, IParentChildrenHolder<DataSet>, IPermIdHolder, IPropertiesHolder, IRegistrationDateHolder, IRegistratorHolder, ISampleHolder,
+        ITagsHolder
 {
     private static final long serialVersionUID = 1L;
 
@@ -68,6 +70,21 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
     @JsonProperty
     private String code;
 
+    @JsonProperty
+    private boolean frozen;
+
+    @JsonProperty
+    private boolean frozenForChildren;
+
+    @JsonProperty
+    private boolean frozenForParents;
+
+    @JsonProperty
+    private boolean frozenForComponents;
+
+    @JsonProperty
+    private boolean frozenForContainers;
+
     @JsonProperty
     private DataSetType type;
 
@@ -181,6 +198,56 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         this.code = code;
     }
 
+    public boolean isFrozen()
+    {
+        return frozen;
+    }
+
+    public void setFrozen(boolean frozen)
+    {
+        this.frozen = frozen;
+    }
+
+    public boolean isFrozenForChildren()
+    {
+        return frozenForChildren;
+    }
+
+    public void setFrozenForChildren(boolean frozenForChildren)
+    {
+        this.frozenForChildren = frozenForChildren;
+    }
+
+    public boolean isFrozenForParents()
+    {
+        return frozenForParents;
+    }
+
+    public void setFrozenForParents(boolean frozenForParents)
+    {
+        this.frozenForParents = frozenForParents;
+    }
+
+    public boolean isFrozenForComponents()
+    {
+        return frozenForComponents;
+    }
+
+    public void setFrozenForComponents(boolean frozenForComponents)
+    {
+        this.frozenForComponents = frozenForComponents;
+    }
+
+    public boolean isFrozenForContainers()
+    {
+        return frozenForContainers;
+    }
+
+    public void setFrozenForContainers(boolean frozenForContainers)
+    {
+        this.frozenForContainers = frozenForContainers;
+    }
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     @Override
@@ -189,8 +256,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasType())
         {
             return type;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Data Set type has not been fetched.");
         }
@@ -204,24 +270,23 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
 
     @JsonIgnore
     public DataSetKind getKind()
-	{
-		return kind;
-	}
+    {
+        return kind;
+    }
 
-	public void setKind(DataSetKind kind)
-	{
-		this.kind = kind;
-	}
+    public void setKind(DataSetKind kind)
+    {
+        this.kind = kind;
+    }
 
-	// Method automatically generated with DtoGenerator
+    // Method automatically generated with DtoGenerator
     @JsonIgnore
     public DataStore getDataStore()
     {
         if (getFetchOptions() != null && getFetchOptions().hasDataStore())
         {
             return dataStore;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Data store has not been fetched.");
         }
@@ -266,8 +331,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasPhysicalData())
         {
             return physicalData;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Physical data has not been fetched.");
         }
@@ -286,8 +350,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasLinkedData())
         {
             return linkedData;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Linked data has not been fetched.");
         }
@@ -307,8 +370,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasExperiment())
         {
             return experiment;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Experiment has not been fetched.");
         }
@@ -328,8 +390,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasSample())
         {
             return sample;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Sample has not been fetched.");
         }
@@ -349,8 +410,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasProperties())
         {
             return properties;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Properties have not been fetched.");
         }
@@ -371,8 +431,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasMaterialProperties())
         {
             return materialProperties;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Material Properties have not been fetched.");
         }
@@ -393,8 +452,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasParents())
         {
             return parents;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Parents have not been fetched.");
         }
@@ -414,8 +472,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasChildren())
         {
             return children;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Children have not been fetched.");
         }
@@ -434,8 +491,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasContainers())
         {
             return containers;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Container data sets have not been fetched.");
         }
@@ -454,8 +510,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasComponents())
         {
             return components;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Component data sets have not been fetched.");
         }
@@ -475,8 +530,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasTags())
         {
             return tags;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Tags have not been fetched.");
         }
@@ -495,8 +549,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasHistory())
         {
             return history;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("History have not been fetched.");
         }
@@ -530,8 +583,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasModifier())
         {
             return modifier;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Modifier has not been fetched.");
         }
@@ -565,8 +617,7 @@ public class DataSet implements Serializable, ICodeHolder, IEntityTypeHolder, IE
         if (getFetchOptions() != null && getFetchOptions().hasRegistrator())
         {
             return registrator;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Registrator has not been fetched.");
         }
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java
index 83f24d4b01d392ae5340fd7afc9f7ec8633e23a8..eb15859c6137404a1789772bced09929ba4ec8e5 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/DataSetUpdate.java
@@ -47,6 +47,21 @@ public class DataSetUpdate implements IUpdate, IObjectUpdate<IDataSetId>, IPrope
     @JsonProperty
     private IDataSetId dataSetId;
 
+    @JsonProperty
+    private boolean freeze;
+
+    @JsonProperty
+    private boolean freezeForChildren;
+
+    @JsonProperty
+    private boolean freezeForParents;
+
+    @JsonProperty
+    private boolean freezeForComponents;
+
+    @JsonProperty
+    private boolean freezeForContainers;
+
     @JsonProperty
     private FieldUpdateValue<IExperimentId> experimentId = new FieldUpdateValue<IExperimentId>();
 
@@ -95,6 +110,65 @@ public class DataSetUpdate implements IUpdate, IObjectUpdate<IDataSetId>, IPrope
         this.dataSetId = dataSetId;
     }
 
+    @JsonIgnore
+    public boolean shouldBeFrozen()
+    {
+        return freeze;
+    }
+
+    public void freeze()
+    {
+        this.freeze = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForChildren()
+    {
+        return freezeForChildren;
+    }
+
+    public void freezeForChildren()
+    {
+        this.freeze = true;
+        this.freezeForChildren = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForParents()
+    {
+        return freezeForParents;
+    }
+
+    public void freezeForParents()
+    {
+        this.freeze = true;
+        this.freezeForParents = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForComponents()
+    {
+        return freezeForComponents;
+    }
+
+    public void freezeForComponents()
+    {
+        this.freeze = true;
+        this.freezeForComponents = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForContainers()
+    {
+        return freezeForContainers;
+    }
+
+    public void freezeForContainers()
+    {
+        this.freeze = true;
+        this.freezeForContainers = true;
+    }
+
     @JsonIgnore
     public FieldUpdateValue<IExperimentId> getExperimentId()
     {
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java
index a387d4219e3c77aa4689e0cf18e6cfb7884a12bb..67051d73648120ac76d4a70c2824b513cf85a467 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java
@@ -57,7 +57,9 @@ import java.util.Set;
  * Class automatically generated with DtoGenerator
  */
 @JsonObject("as.dto.experiment.Experiment")
-public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder, IDataSetsHolder, IEntityTypeHolder, IIdentifierHolder, IMaterialPropertiesHolder, IModificationDateHolder, IModifierHolder, IPermIdHolder, IProjectHolder, IPropertiesHolder, IRegistrationDateHolder, IRegistratorHolder, ISamplesHolder, ITagsHolder
+public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder, IDataSetsHolder, IEntityTypeHolder, IIdentifierHolder,
+        IMaterialPropertiesHolder, IModificationDateHolder, IModifierHolder, IPermIdHolder, IProjectHolder, IPropertiesHolder,
+        IRegistrationDateHolder, IRegistratorHolder, ISamplesHolder, ITagsHolder
 {
     private static final long serialVersionUID = 1L;
 
@@ -73,6 +75,15 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
     @JsonProperty
     private String code;
 
+    @JsonProperty
+    private boolean frozen;
+
+    @JsonProperty
+    private boolean frozenForDataSets;
+
+    @JsonProperty
+    private boolean frozenForSamples;
+
     @JsonProperty
     private Date registrationDate;
 
@@ -167,6 +178,36 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         this.code = code;
     }
 
+    public boolean isFrozen()
+    {
+        return frozen;
+    }
+
+    public void setFrozen(boolean frozen)
+    {
+        this.frozen = frozen;
+    }
+
+    public boolean isFrozenForDataSets()
+    {
+        return frozenForDataSets;
+    }
+
+    public void setFrozenForDataSets(boolean frozenForDataSets)
+    {
+        this.frozenForDataSets = frozenForDataSets;
+    }
+
+    public boolean isFrozenForSamples()
+    {
+        return frozenForSamples;
+    }
+
+    public void setFrozenForSamples(boolean frozenForSamples)
+    {
+        this.frozenForSamples = frozenForSamples;
+    }
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     @Override
@@ -203,8 +244,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasType())
         {
             return type;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Experiment type has not been fetched.");
         }
@@ -224,8 +264,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasProject())
         {
             return project;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Project has not been fetched.");
         }
@@ -245,8 +284,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasDataSets())
         {
             return dataSets;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Data sets have not been fetched.");
         }
@@ -266,8 +304,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasSamples())
         {
             return samples;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Samples have not been fetched.");
         }
@@ -286,8 +323,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasHistory())
         {
             return history;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("History have not been fetched.");
         }
@@ -307,8 +343,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasProperties())
         {
             return properties;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Properties have not been fetched.");
         }
@@ -329,8 +364,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasMaterialProperties())
         {
             return materialProperties;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Material Properties have not been fetched.");
         }
@@ -351,8 +385,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasTags())
         {
             return tags;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Tags have not been fetched.");
         }
@@ -372,8 +405,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasRegistrator())
         {
             return registrator;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Registrator has not been fetched.");
         }
@@ -393,8 +425,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasModifier())
         {
             return modifier;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Modifier has not been fetched.");
         }
@@ -414,8 +445,7 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         if (getFetchOptions() != null && getFetchOptions().hasAttachments())
         {
             return attachments;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Attachments have not been fetched.");
         }
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java
index 556a025c89c05a0bef779cdba3a86e580d81f016..c5dbf86ac364260d0c3d07f50fd81096f0aa1c9b 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java
@@ -48,6 +48,15 @@ public class ExperimentUpdate implements IUpdate, IObjectUpdate<IExperimentId>,
     @JsonProperty
     private IExperimentId experimentId;
 
+    @JsonProperty
+    private boolean freeze;
+
+    @JsonProperty
+    private boolean freezeForDataSets;
+
+    @JsonProperty
+    private boolean freezeForSamples;
+
     @JsonProperty
     private Map<String, String> properties = new HashMap<String, String>();
 
@@ -79,6 +88,41 @@ public class ExperimentUpdate implements IUpdate, IObjectUpdate<IExperimentId>,
         this.experimentId = experimentId;
     }
 
+    @JsonIgnore
+    public boolean shouldBeFrozen()
+    {
+        return freeze;
+    }
+
+    public void freeze()
+    {
+        this.freeze = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForDataSets()
+    {
+        return freezeForDataSets;
+    }
+
+    public void freezeForDataSets()
+    {
+        this.freeze = true;
+        this.freezeForDataSets = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForSamples()
+    {
+        return freezeForSamples;
+    }
+
+    public void freezeForSamples()
+    {
+        this.freeze = true;
+        this.freezeForSamples = true;
+    }
+
     @Override
     @JsonIgnore
     public void setProperty(String propertyName, String propertyValue)
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/Project.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/Project.java
index 07908cfe782d39532c9ab6b46bb815e133c0bffe..ea83dc41ee2b56b5cdec1d008feff7dee4fe014d 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/Project.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/Project.java
@@ -47,7 +47,8 @@ import java.util.List;
  * Class automatically generated with DtoGenerator
  */
 @JsonObject("as.dto.project.Project")
-public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, IDescriptionHolder, IExperimentsHolder, IIdentifierHolder, IModificationDateHolder, IModifierHolder, IPermIdHolder, IRegistrationDateHolder, IRegistratorHolder, ISpaceHolder
+public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, IDescriptionHolder, IExperimentsHolder, IIdentifierHolder,
+        IModificationDateHolder, IModifierHolder, IPermIdHolder, IRegistrationDateHolder, IRegistratorHolder, ISpaceHolder
 {
     private static final long serialVersionUID = 1L;
 
@@ -66,6 +67,15 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
     @JsonProperty
     private String description;
 
+    @JsonProperty
+    private boolean frozen;
+
+    @JsonProperty
+    private boolean frozenForExperiments;
+
+    @JsonProperty
+    private boolean frozenForSamples;
+
     @JsonProperty
     private Date registrationDate;
 
@@ -165,6 +175,36 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         this.description = description;
     }
 
+    public boolean isFrozen()
+    {
+        return frozen;
+    }
+
+    public void setFrozen(boolean frozen)
+    {
+        this.frozen = frozen;
+    }
+
+    public boolean isFrozenForExperiments()
+    {
+        return frozenForExperiments;
+    }
+
+    public void setFrozenForExperiments(boolean frozenForExperiments)
+    {
+        this.frozenForExperiments = frozenForExperiments;
+    }
+
+    public boolean isFrozenForSamples()
+    {
+        return frozenForSamples;
+    }
+
+    public void setFrozenForSamples(boolean frozenForSamples)
+    {
+        this.frozenForSamples = frozenForSamples;
+    }
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     @Override
@@ -201,8 +241,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasExperiments())
         {
             return experiments;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Experiments have not been fetched.");
         }
@@ -221,8 +260,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasSamples())
         {
             return samples;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Samples have not been fetched.");
         }
@@ -241,8 +279,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasHistory())
         {
             return history;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("History have not been fetched.");
         }
@@ -262,8 +299,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasSpace())
         {
             return space;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Space has not been fetched.");
         }
@@ -283,8 +319,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasRegistrator())
         {
             return registrator;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Registrator has not been fetched.");
         }
@@ -304,8 +339,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasModifier())
         {
             return modifier;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Modifier has not been fetched.");
         }
@@ -324,8 +358,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasLeader())
         {
             return leader;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Leader has not been fetched.");
         }
@@ -345,8 +378,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasAttachments())
         {
             return attachments;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Attachments have not been fetched.");
         }
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/update/ProjectUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/update/ProjectUpdate.java
index 64c9183dd38aeb46453c4b33556a1f99f1fdf293..5a941a533cf796f76f1851663eed4f62a9badea5 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/update/ProjectUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/update/ProjectUpdate.java
@@ -42,6 +42,15 @@ public class ProjectUpdate implements IUpdate, IObjectUpdate<IProjectId>
 
     @JsonProperty
     private IProjectId projectId;
+    @JsonProperty
+    private boolean freeze;
+
+    @JsonProperty
+    private boolean freezeForExperiments;
+
+    @JsonProperty
+    private boolean freezeForSamples;
+
 
     @JsonProperty
     private FieldUpdateValue<ISpaceId> spaceId = new FieldUpdateValue<ISpaceId>();
@@ -95,6 +104,41 @@ public class ProjectUpdate implements IUpdate, IObjectUpdate<IProjectId>
         return description;
     }
 
+    @JsonIgnore
+    public boolean shouldBeFrozen()
+    {
+        return freeze;
+    }
+
+    public void freeze()
+    {
+        this.freeze = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForExperiments()
+    {
+        return freezeForExperiments;
+    }
+
+    public void freezeForExperiments()
+    {
+        this.freeze = true;
+        this.freezeForExperiments = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForSamples()
+    {
+        return freezeForSamples;
+    }
+
+    public void freezeForSamples()
+    {
+        this.freeze = true;
+        this.freezeForSamples = true;
+    }
+
     @JsonIgnore
     public AttachmentListUpdateValue getAttachments()
     {
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java
index 134a4500a4f011bd85a31e61ace6fcff34db5e68..f4fed624d8ab62fe562e023adedc58d971d1b9c2 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java
@@ -61,7 +61,9 @@ import java.util.Set;
  * Class automatically generated with DtoGenerator
  */
 @JsonObject("as.dto.sample.Sample")
-public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, IDataSetsHolder, IEntityTypeHolder, IExperimentHolder, IIdentifierHolder, IMaterialPropertiesHolder, IModificationDateHolder, IModifierHolder, IParentChildrenHolder<Sample>, IPermIdHolder, IProjectHolder, IPropertiesHolder, IRegistrationDateHolder, IRegistratorHolder, ISpaceHolder, ITagsHolder
+public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, IDataSetsHolder, IEntityTypeHolder, IExperimentHolder,
+        IIdentifierHolder, IMaterialPropertiesHolder, IModificationDateHolder, IModifierHolder, IParentChildrenHolder<Sample>, IPermIdHolder,
+        IProjectHolder, IPropertiesHolder, IRegistrationDateHolder, IRegistratorHolder, ISpaceHolder, ITagsHolder
 {
     private static final long serialVersionUID = 1L;
 
@@ -77,6 +79,21 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
     @JsonProperty
     private String code;
 
+    @JsonProperty
+    private boolean frozen;
+
+    @JsonProperty
+    private boolean frozenForComponents;
+
+    @JsonProperty
+    private boolean frozenForChildren;
+
+    @JsonProperty
+    private boolean frozenForParents;
+
+    @JsonProperty
+    private boolean frozenForDataSets;
+
     @JsonProperty
     private Date registrationDate;
 
@@ -186,6 +203,56 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         this.code = code;
     }
 
+    public boolean isFrozen()
+    {
+        return frozen;
+    }
+
+    public void setFrozen(boolean frozen)
+    {
+        this.frozen = frozen;
+    }
+
+    public boolean isFrozenForComponents()
+    {
+        return frozenForComponents;
+    }
+
+    public void setFrozenForComponents(boolean frozenForComponents)
+    {
+        this.frozenForComponents = frozenForComponents;
+    }
+
+    public boolean isFrozenForChildren()
+    {
+        return frozenForChildren;
+    }
+
+    public void setFrozenForChildren(boolean frozenForChildren)
+    {
+        this.frozenForChildren = frozenForChildren;
+    }
+
+    public boolean isFrozenForParents()
+    {
+        return frozenForParents;
+    }
+
+    public void setFrozenForParents(boolean frozenForParents)
+    {
+        this.frozenForParents = frozenForParents;
+    }
+
+    public boolean isFrozenForDataSets()
+    {
+        return frozenForDataSets;
+    }
+
+    public void setFrozenForDataSets(boolean frozenForDataSets)
+    {
+        this.frozenForDataSets = frozenForDataSets;
+    }
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     @Override
@@ -222,8 +289,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasType())
         {
             return type;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Sample type has not been fetched.");
         }
@@ -243,8 +309,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasProject())
         {
             return project;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Project has not been fetched.");
         }
@@ -264,8 +329,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasSpace())
         {
             return space;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Space has not been fetched.");
         }
@@ -285,8 +349,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasExperiment())
         {
             return experiment;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Experiment has not been fetched.");
         }
@@ -306,8 +369,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasProperties())
         {
             return properties;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Properties have not been fetched.");
         }
@@ -328,8 +390,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasMaterialProperties())
         {
             return materialProperties;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Material Properties have not been fetched.");
         }
@@ -350,8 +411,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasParents())
         {
             return parents;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Parents have not been fetched.");
         }
@@ -371,8 +431,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasChildren())
         {
             return children;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Children have not been fetched.");
         }
@@ -391,8 +450,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasContainer())
         {
             return container;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Container sample has not been fetched.");
         }
@@ -411,8 +469,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasComponents())
         {
             return components;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Component samples have not been fetched.");
         }
@@ -432,8 +489,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasDataSets())
         {
             return dataSets;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Data sets have not been fetched.");
         }
@@ -452,8 +508,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasHistory())
         {
             return history;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("History have not been fetched.");
         }
@@ -473,8 +528,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasTags())
         {
             return tags;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Tags have not been fetched.");
         }
@@ -494,8 +548,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasRegistrator())
         {
             return registrator;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Registrator has not been fetched.");
         }
@@ -515,8 +568,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasModifier())
         {
             return modifier;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Modifier has not been fetched.");
         }
@@ -536,8 +588,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasAttachments())
         {
             return attachments;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Attachments have not been fetched.");
         }
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java
index 82ae187c07275461a174d8cee2d91d5b5bf00abd..e9890d3447ba0e2738b45454b50acf13023bc008 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java
@@ -49,6 +49,21 @@ public class SampleUpdate implements IUpdate, IPropertiesHolder, IObjectUpdate<I
     @JsonProperty
     private ISampleId sampleId;
 
+    @JsonProperty
+    private boolean freeze;
+
+    @JsonProperty
+    private boolean freezeForComponents;
+
+    @JsonProperty
+    private boolean freezeForChildren;
+
+    @JsonProperty
+    private boolean freezeForParents;
+
+    @JsonProperty
+    private boolean freezeForDataSets;
+
     @JsonProperty
     private FieldUpdateValue<IExperimentId> experimentId = new FieldUpdateValue<IExperimentId>();
 
@@ -97,6 +112,65 @@ public class SampleUpdate implements IUpdate, IPropertiesHolder, IObjectUpdate<I
         this.sampleId = sampleId;
     }
 
+    @JsonIgnore
+    public boolean shouldBeFrozen()
+    {
+        return freeze;
+    }
+
+    public void freeze()
+    {
+        this.freeze = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForComponents()
+    {
+        return freezeForComponents;
+    }
+
+    public void freezeForComponents()
+    {
+        this.freeze = true;
+        this.freezeForComponents = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForChildren()
+    {
+        return freezeForChildren;
+    }
+
+    public void freezeForChildren()
+    {
+        this.freeze = true;
+        this.freezeForChildren = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForParents()
+    {
+        return freezeForParents;
+    }
+
+    public void freezeForParents()
+    {
+        this.freeze = true;
+        this.freezeForParents = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForDataSets()
+    {
+        return freezeForDataSets;
+    }
+
+    public void freezeForDataSets()
+    {
+        this.freeze = true;
+        this.freezeForDataSets = true;
+    }
+
     @JsonIgnore
     public FieldUpdateValue<IExperimentId> getExperimentId()
     {
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/Space.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/Space.java
index 99a054519b29f3a09a3cac45aaaefaea79ab1028..fb8bbb3800b4090845212cffc8f58a3d1728e572 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/Space.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/Space.java
@@ -40,7 +40,8 @@ import java.util.List;
  * Class automatically generated with DtoGenerator
  */
 @JsonObject("as.dto.space.Space")
-public class Space implements Serializable, ICodeHolder, IDescriptionHolder, IModificationDateHolder, IPermIdHolder, IProjectsHolder, IRegistrationDateHolder, IRegistratorHolder, ISamplesHolder
+public class Space implements Serializable, ICodeHolder, IDescriptionHolder, IModificationDateHolder, IPermIdHolder, IProjectsHolder,
+        IRegistrationDateHolder, IRegistratorHolder, ISamplesHolder
 {
     private static final long serialVersionUID = 1L;
 
@@ -56,6 +57,15 @@ public class Space implements Serializable, ICodeHolder, IDescriptionHolder, IMo
     @JsonProperty
     private String description;
 
+    @JsonProperty
+    private boolean frozen;
+
+    @JsonProperty
+    private boolean frozenForProjects;
+
+    @JsonProperty
+    private boolean frozenForSamples;
+
     @JsonProperty
     private Date registrationDate;
 
@@ -126,6 +136,36 @@ public class Space implements Serializable, ICodeHolder, IDescriptionHolder, IMo
         this.description = description;
     }
 
+    public boolean isFrozen()
+    {
+        return frozen;
+    }
+
+    public void setFrozen(boolean frozen)
+    {
+        this.frozen = frozen;
+    }
+
+    public boolean isFrozenForProjects()
+    {
+        return frozenForProjects;
+    }
+
+    public void setFrozenForProjects(boolean frozenForProjects)
+    {
+        this.frozenForProjects = frozenForProjects;
+    }
+
+    public boolean isFrozenForSamples()
+    {
+        return frozenForSamples;
+    }
+
+    public void setFrozenForSamples(boolean frozenForSamples)
+    {
+        this.frozenForSamples = frozenForSamples;
+    }
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     @Override
@@ -162,8 +202,7 @@ public class Space implements Serializable, ICodeHolder, IDescriptionHolder, IMo
         if (getFetchOptions() != null && getFetchOptions().hasRegistrator())
         {
             return registrator;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Registrator has not been fetched.");
         }
@@ -183,8 +222,7 @@ public class Space implements Serializable, ICodeHolder, IDescriptionHolder, IMo
         if (getFetchOptions() != null && getFetchOptions().hasSamples())
         {
             return samples;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Samples have not been fetched.");
         }
@@ -204,8 +242,7 @@ public class Space implements Serializable, ICodeHolder, IDescriptionHolder, IMo
         if (getFetchOptions() != null && getFetchOptions().hasProjects())
         {
             return projects;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Projects have not been fetched.");
         }
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/update/SpaceUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/update/SpaceUpdate.java
index 3b7e38e01a489e464c1cb150e4bc914bb10b84a9..b12ef307d4b22c2da7155be5fcc25488368018a0 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/update/SpaceUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/update/SpaceUpdate.java
@@ -41,6 +41,15 @@ public class SpaceUpdate implements IUpdate, IObjectUpdate<ISpaceId>
     @JsonProperty
     private FieldUpdateValue<String> description = new FieldUpdateValue<String>();
 
+    @JsonProperty
+    private boolean freeze;
+
+    @JsonProperty
+    private boolean freezeForProjects;
+
+    @JsonProperty
+    private boolean freezeForSamples;
+
     @Override
     @JsonIgnore
     public ISpaceId getObjectId()
@@ -72,6 +81,41 @@ public class SpaceUpdate implements IUpdate, IObjectUpdate<ISpaceId>
         return description;
     }
 
+    @JsonIgnore
+    public boolean shouldBeFrozen()
+    {
+        return freeze;
+    }
+
+    public void freeze()
+    {
+        this.freeze = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForProjects()
+    {
+        return freezeForProjects;
+    }
+
+    public void freezeForProjects()
+    {
+        this.freeze = true;
+        this.freezeForProjects = true;
+    }
+
+    @JsonIgnore
+    public boolean shouldBeFrozenForSamples()
+    {
+        return freezeForSamples;
+    }
+
+    public void freezeForSamples()
+    {
+        this.freeze = true;
+        this.freezeForSamples = true;
+    }
+
     @Override
     public String toString()
     {
diff --git a/openbis_api/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/dictionary.txt b/openbis_api/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/dictionary.txt
index 7fd792f5b5086483b2b17fafbb4dfd58005a4f35..40f6ce7afc930559aa7a781fff95e431dc1d546b 100644
--- a/openbis_api/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/dictionary.txt
+++ b/openbis_api/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/dictionary.txt
@@ -2238,3 +2238,39 @@ set Plugin
 with Plugin
 with Plugin Using
 
+freeze
+freeze For Children
+freeze For Components
+freeze For Containers
+freeze For DataSets
+freeze For Experiments
+freeze For Parents
+freeze For Projects
+freeze For Samples
+is Frozen
+is Frozen For Children
+is Frozen For Components
+is Frozen For Containers
+is Frozen For DataSets
+is Frozen For Experiments
+is Frozen For Parents
+is Frozen For Projects
+is Frozen For Samples
+set Frozen
+set Frozen For Children
+set Frozen For Components
+set Frozen For Containers
+set Frozen For DataSets
+set Frozen For Experiments
+set Frozen For Parents
+set Frozen For Projects
+set Frozen For Samples
+should Be Frozen
+should Be Frozen For Children
+should Be Frozen For Components
+should Be Frozen For Containers
+should Be Frozen For DataSets
+should Be Frozen For Experiments
+should Be Frozen For Parents
+should Be Frozen For Projects
+should Be Frozen For Samples