From fcd76b34070bcce99c0e01f3d2b64ea3d1f154f9 Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Thu, 19 May 2016 18:33:59 +0000
Subject: [PATCH] SSDM-3543 : V3 AS API - improve context information in
 exceptions - make IIdentityHolder available in all progress classes + report
 progress in verify executors

SVN: 36554
---
 .../openbis-v3-api-test/html/test/common.js   |  5 +
 .../html/test/test-update.js                  |  6 +-
 .../server/asapi/v3/context/Progress.java     | 26 +++--
 .../asapi/v3/context/ProgressDetails.java     | 52 ++++++++++
 .../ProgressDetailsToStringBuilder.java}      |  6 +-
 .../ProgressDetailsToStringStyle.java}        | 10 +-
 .../asapi/v3/context/ProgressFormatter.java   |  2 +-
 .../dataset/CreateDataSetExecutor.java        |  4 +-
 .../dataset/UpdateDataSetExecutor.java        |  4 +-
 .../UpdateDataSetPropertyExecutor.java        |  5 +-
 ...ifyDataSetSampleAndExperimentExecutor.java | 23 ++++-
 .../entity/AbstractCreateEntityExecutor.java  | 15 +--
 ...ctSetEntityExperimentRelationExecutor.java |  4 +-
 ...stractSetEntitySampleRelationExecutor.java |  4 +-
 ...stractSetEntityToManyRelationExecutor.java | 10 +-
 ...bstractSetEntityToOneRelationExecutor.java | 12 ++-
 .../entity/AbstractUpdateEntityExecutor.java  | 14 +--
 ...actUpdateEntityToManyRelationExecutor.java |  9 +-
 ...ractUpdateEntityToOneRelationExecutor.java | 10 +-
 .../experiment/CreateExperimentExecutor.java  |  4 +-
 .../experiment/UpdateExperimentExecutor.java  |  6 +-
 .../UpdateExperimentPropertyExecutor.java     |  5 +-
 .../material/CreateMaterialExecutor.java      |  4 +-
 .../material/UpdateMaterialExecutor.java      |  4 +-
 .../UpdateMaterialPropertyExecutor.java       |  5 +-
 .../project/CreateProjectExecutor.java        |  4 +-
 .../project/UpdateProjectExecutor.java        |  4 +-
 ...IAbstractUpdateEntityPropertyExecutor.java |  4 +-
 .../UpdateEntityPropertyExecutor.java         | 35 ++++---
 .../VerifyEntityPropertyExecutor.java         |  4 +-
 .../executor/sample/CreateSampleExecutor.java |  4 +-
 .../sample/SetSampleContainerExecutor.java    |  6 +-
 .../executor/sample/UpdateSampleExecutor.java |  6 +-
 .../sample/UpdateSamplePropertyExecutor.java  |  5 +-
 .../sample/VerifySampleContainerExecutor.java | 39 +++++---
 .../VerifySampleExperimentExecutor.java       |  4 +-
 .../sample/VerifySampleParentsExecutor.java   | 23 ++++-
 .../sample/VerifySampleProjectExecutor.java   |  4 +-
 .../executor/space/CreateSpaceExecutor.java   |  4 +-
 .../v3/executor/tag/CreateTagExecutor.java    |  4 +-
 .../entity/progress/CheckAccessProgress.java  | 35 ++++++-
 .../entity/progress/CheckDataProgress.java    | 34 ++++++-
 ...ntityProgress.java => CreateProgress.java} | 19 +++-
 .../entity/progress/EntityProgress.java       | 95 +++++++++++++++++++
 ...Progress.java => SetRelationProgress.java} | 20 +++-
 .../UpdateEntityPropertyProgress.java         | 59 ------------
 .../progress/UpdatePropertyProgress.java      | 48 ++++++++++
 ...gress.java => UpdateRelationProgress.java} | 20 +++-
 ...ntityProgress.java => VerifyProgress.java} |  8 +-
 .../generic/shared/basic/IIdentityHolder.java | 25 +++++
 .../openbis/generic/shared/dto/DataPE.java    |  5 +-
 .../generic/shared/dto/ExperimentPE.java      |  3 +-
 ...EntityInformationWithPropertiesHolder.java |  4 +-
 .../generic/shared/dto/MaterialPE.java        |  5 +-
 .../generic/shared/dto/MetaprojectPE.java     | 15 ++-
 .../openbis/generic/shared/dto/ProjectPE.java |  3 +-
 .../openbis/generic/shared/dto/SamplePE.java  |  3 +-
 .../openbis/generic/shared/dto/SpacePE.java   | 23 ++++-
 .../api/v3/as/dto/common/create/ICreation.js  |  7 ++
 .../api/v3/as/dto/common/update/IUpdate.js    |  7 ++
 .../ProgressDetailsToStringBuilderTest.java}  |  6 +-
 .../progress => context}/TestClass.java       |  2 +-
 .../UpdateEntityPropertyExecutorTest.java     |  9 +-
 .../systemtest/asapi/v3/CreateSampleTest.java |  2 +-
 .../attachment/create/AttachmentCreation.java |  5 +-
 .../asapi/v3/dto/common/create/ICreation.java | 30 ++++++
 .../asapi/v3/dto/common/update/IUpdate.java   | 30 ++++++
 .../dto/dataset/create/DataSetCreation.java   |  4 +-
 .../dataset/create/LinkedDataCreation.java    |  5 +-
 .../dataset/create/PhysicalDataCreation.java  |  5 +-
 .../v3/dto/dataset/update/DataSetUpdate.java  |  4 +-
 .../dto/dataset/update/LinkedDataUpdate.java  |  5 +-
 .../dataset/update/PhysicalDataUpdate.java    |  5 +-
 .../experiment/create/ExperimentCreation.java |  4 +-
 .../experiment/update/ExperimentUpdate.java   |  4 +-
 .../dto/material/create/MaterialCreation.java |  4 +-
 .../dto/material/update/MaterialUpdate.java   |  4 +-
 .../dto/project/create/ProjectCreation.java   |  4 +-
 .../v3/dto/project/update/ProjectUpdate.java  |  4 +-
 .../v3/dto/sample/create/SampleCreation.java  |  4 +-
 .../v3/dto/sample/update/SampleUpdate.java    |  4 +-
 .../v3/dto/space/create/SpaceCreation.java    |  5 +-
 .../v3/dto/space/update/SpaceUpdate.java      |  5 +-
 .../asapi/v3/dto/tag/create/TagCreation.java  |  4 +-
 .../asapi/v3/dto/tag/update/TagUpdate.java    |  4 +-
 .../create/VocabularyTermCreation.java        |  5 +-
 .../update/VocabularyTermUpdate.java          |  5 +-
 .../generic/sharedapi/v3/dictionary.txt       |  4 +-
 88 files changed, 712 insertions(+), 301 deletions(-)
 create mode 100644 openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetails.java
 rename openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/{helper/entity/progress/EntityProgressToStringBuilder.java => context/ProgressDetailsToStringBuilder.java} (83%)
 rename openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/{helper/entity/progress/EntityProgressToStringStyle.java => context/ProgressDetailsToStringStyle.java} (93%)
 rename openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/{CreateEntityProgress.java => CreateProgress.java} (61%)
 create mode 100644 openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgress.java
 rename openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/{SetEntityRelationProgress.java => SetRelationProgress.java} (57%)
 delete mode 100644 openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdateEntityPropertyProgress.java
 create mode 100644 openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdatePropertyProgress.java
 rename openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/{UpdateEntityRelationProgress.java => UpdateRelationProgress.java} (57%)
 rename openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/{VerifyEntityProgress.java => VerifyProgress.java} (72%)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IIdentityHolder.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/create/ICreation.js
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/update/IUpdate.js
 rename openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/{helper/entity/progress/EntityProgressToStringBuilderTest.java => context/ProgressDetailsToStringBuilderTest.java} (96%)
 rename openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/{helper/entity/progress => context}/TestClass.java (94%)
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/create/ICreation.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/update/IUpdate.java

diff --git a/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/common.js b/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/common.js
index 229e4cb244a..9d7e9ef86af 100644
--- a/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/common.js
+++ b/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/common.js
@@ -482,6 +482,11 @@ define([ 'jquery', 'openbis', 'underscore', 'test/dtos' ], function($, openbis,
 			this.assertEqual(actual, false, msg);
 		};
 
+		this.assertContains = function(actual, expected, msg) {
+			actual = actual ? actual : "";
+			this.assertTrue(actual.indexOf(expected) >= 0, msg);
+		};
+
 		this.assertEqual = function(actual, expected, msg) {
 			this.assert.equal(actual, expected, msg);
 		};
diff --git a/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-update.js b/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-update.js
index db0eb5a600e..3cf0b9a2288 100644
--- a/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-update.js
+++ b/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-update.js
@@ -152,8 +152,7 @@ define([ 'jquery', 'underscore', 'openbis', 'test/common' ], function($, _, open
 					}
 
 					var fCheckError = function(error, permId) {
-						c.assertEqual(error, "Space id cannot be null (Context: [updating relation project-space (1/1) [ProjectUpdate[projectId=ProjectPermId[permId=" + permId.getPermId() + "]]]])",
-								"Error");
+						c.assertContains(error, "Space id cannot be null", "Error");
 					}
 
 					testUpdate(c, fCreate, fUpdate, c.findProject, null, fCheckError);
@@ -263,8 +262,7 @@ define([ 'jquery', 'underscore', 'openbis', 'test/common' ], function($, _, open
 			}
 
 			var fCheckError = function(error, permId) {
-				c.assertEqual(error, "Project id cannot be null (Context: [updating relation experiment-project (1/1) [ExperimentUpdate[experimentId=ExperimentPermId[permId=" + permId.getPermId()
-						+ "], properties={}]]])", "Error");
+				c.assertContains(error, "Project id cannot be null", "Error");
 			}
 
 			testUpdate(c, fCreate, fUpdate, c.findExperiment, null, fCheckError);
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/Progress.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/Progress.java
index 56f8df3493d..df714a4d8bc 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/Progress.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/Progress.java
@@ -16,8 +16,6 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.context;
 
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.EntityProgressToStringBuilder;
-
 /**
  * @author pkupczyk
  */
@@ -30,8 +28,6 @@ public class Progress implements IProgress
 
     private boolean detailsCreated = false;
 
-    private Object detailsObject;
-
     private String details;
 
     private Integer numItemsProcessed;
@@ -43,10 +39,9 @@ public class Progress implements IProgress
         this.label = label;
     }
 
-    public Progress(String label, Object detailsObject, int numItemsProcessed, int totalItemsToProcess)
+    public Progress(String label, int numItemsProcessed, int totalItemsToProcess)
     {
         this.label = label;
-        this.detailsObject = detailsObject;
         this.numItemsProcessed = numItemsProcessed;
         this.totalItemsToProcess = totalItemsToProcess;
     }
@@ -62,21 +57,22 @@ public class Progress implements IProgress
     {
         if (false == detailsCreated)
         {
-            details = createDetails(detailsObject);
+            details = createDetails();
             detailsCreated = true;
         }
         return details;
     }
 
-    protected String createDetails(Object object)
+    protected String createDetails()
     {
-        if (object != null)
-        {
-            return EntityProgressToStringBuilder.toString(object);
-        } else
-        {
-            return null;
-        }
+        ProgressDetails detailsObject = new ProgressDetails();
+        updateDetails(detailsObject);
+        return detailsObject.toString();
+    }
+
+    protected void updateDetails(ProgressDetails detailsObject)
+    {
+
     }
 
     @Override
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetails.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetails.java
new file mode 100644
index 00000000000..0c79d4c4012
--- /dev/null
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetails.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2016 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.server.asapi.v3.context;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author pkupczyk
+ */
+public class ProgressDetails
+{
+
+    private Map<String, Object> map = new LinkedHashMap<String, Object>();
+
+    public void set(String name, Object value)
+    {
+        if (value != null)
+        {
+            map.put(name, ProgressDetailsToStringBuilder.toString(value));
+        }
+    }
+
+    public void set(String name, ProgressDetails details)
+    {
+        if (details != null)
+        {
+            map.put(name, ProgressDetailsToStringBuilder.toString(details.map));
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        return ProgressDetailsToStringBuilder.toString(map);
+    }
+
+}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgressToStringBuilder.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetailsToStringBuilder.java
similarity index 83%
rename from openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgressToStringBuilder.java
rename to openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetailsToStringBuilder.java
index 72147d7b51c..a91d417fb9e 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgressToStringBuilder.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetailsToStringBuilder.java
@@ -14,12 +14,12 @@
  * limitations under the License.
  */
 
-package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
+package ch.ethz.sis.openbis.generic.server.asapi.v3.context;
 
 /**
  * @author pkupczyk
  */
-public class EntityProgressToStringBuilder
+public class ProgressDetailsToStringBuilder
 {
 
     public static String toString(Object object)
@@ -31,7 +31,7 @@ public class EntityProgressToStringBuilder
 
         StringBuffer buffer = new StringBuffer();
 
-        new EntityProgressToStringStyle().append(buffer, null, object, true);
+        new ProgressDetailsToStringStyle().append(buffer, null, object, true);
 
         String str = buffer.toString();
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgressToStringStyle.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetailsToStringStyle.java
similarity index 93%
rename from openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgressToStringStyle.java
rename to openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetailsToStringStyle.java
index 3dd3f9d677f..a27d6901478 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgressToStringStyle.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetailsToStringStyle.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
+package ch.ethz.sis.openbis.generic.server.asapi.v3.context;
 
 import java.util.Collection;
 import java.util.Map;
@@ -28,14 +28,14 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue;
 /**
  * @author pkupczyk
  */
-public final class EntityProgressToStringStyle extends ToStringStyle
+public final class ProgressDetailsToStringStyle extends ToStringStyle
 {
 
-    public static final ToStringStyle ENTITY_PROGRESS_STYLE = new EntityProgressToStringStyle();
+    public static final ToStringStyle PROGRESS_STYLE = new ProgressDetailsToStringStyle();
 
     private static final long serialVersionUID = 1L;
 
-    EntityProgressToStringStyle()
+    ProgressDetailsToStringStyle()
     {
         super();
         this.setContentStart("[");
@@ -52,7 +52,7 @@ public final class EntityProgressToStringStyle extends ToStringStyle
 
     private Object readResolve()
     {
-        return ENTITY_PROGRESS_STYLE;
+        return PROGRESS_STYLE;
     }
 
     @Override
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressFormatter.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressFormatter.java
index b2f45e9309e..83253a95fc9 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressFormatter.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressFormatter.java
@@ -36,7 +36,7 @@ public class ProgressFormatter
 
         if (progress.getDetails() != null)
         {
-            result.append(" [" + progress.getDetails() + "]");
+            result.append(" " + progress.getDetails());
         }
 
         return result.toString();
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java
index 54778a89e0b..fd69ab0c5a7 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/CreateDataSetExecutor.java
@@ -46,7 +46,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.Collectio
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CheckDataProgress;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateEntityProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.DataSetPEByExperimentOrSampleIdentifierValidator;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataAccessExceptionTranslator;
@@ -159,7 +159,7 @@ public class CreateDataSetExecutor extends AbstractCreateEntityExecutor<DataSetC
                 @Override
                 public IProgress createProgress(DataSetCreation object, int objectIndex, int totalObjectCount)
                 {
-                    return new CreateEntityProgress(object, objectIndex, totalObjectCount);
+                    return new CreateProgress(object, objectIndex, totalObjectCount);
                 }
             };
 
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 de83166bc55..4971b5c52bb 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
@@ -35,7 +35,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.tag.IUpdateTagForEnt
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateEntityRelationProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateRelationProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.DataSetPEByExperimentOrSampleIdentifierValidator;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataAccessExceptionTranslator;
@@ -147,7 +147,7 @@ public class UpdateDataSetExecutor extends AbstractUpdateEntityExecutor<DataSetU
                 @Override
                 public IProgress createProgress(DataSetUpdate key, DataPE value, int objectIndex, int totalObjectCount)
                 {
-                    return new UpdateEntityRelationProgress(key, "dataset-tag", objectIndex, totalObjectCount);
+                    return new UpdateRelationProgress(key, value, "dataset-tag", objectIndex, totalObjectCount);
                 }
             };
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetPropertyExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetPropertyExecutor.java
index ff7e804d9a1..b5e6a0e088e 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetPropertyExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/UpdateDataSetPropertyExecutor.java
@@ -26,7 +26,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.Capability;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
-import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 
 /**
  * @author pkupczyk
@@ -41,7 +41,8 @@ public class UpdateDataSetPropertyExecutor implements IUpdateDataSetPropertyExec
     @Override
     @RolesAllowed({ RoleWithHierarchy.SPACE_POWER_USER, RoleWithHierarchy.SPACE_ETL_SERVER })
     @Capability("UPDATE_DATASET_PROPERTY")
-    public void update(IOperationContext context, MapBatch<? extends IPropertiesHolder, ? extends IEntityPropertiesHolder> holderToEntityMap)
+    public void update(IOperationContext context,
+            MapBatch<? extends IPropertiesHolder, ? extends IEntityInformationWithPropertiesHolder> holderToEntityMap)
     {
         executor.update(context, holderToEntityMap);
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/VerifyDataSetSampleAndExperimentExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/VerifyDataSetSampleAndExperimentExecutor.java
index 05d8626ac4f..d9951c5749e 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/VerifyDataSetSampleAndExperimentExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/dataset/VerifyDataSetSampleAndExperimentExecutor.java
@@ -23,8 +23,11 @@ import javax.annotation.Resource;
 
 import org.springframework.stereotype.Component;
 
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.VerifyProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.util.DataSetTypeWithoutExperimentChecker;
@@ -51,12 +54,22 @@ public class VerifyDataSetSampleAndExperimentExecutor implements IVerifyDataSetS
     }
 
     @Override
-    public void verify(IOperationContext context, CollectionBatch<DataPE> batch)
+    public void verify(final IOperationContext context, CollectionBatch<DataPE> batch)
     {
-        for (DataPE dataSet : batch.getObjects())
-        {
-            verify(context, dataSet);
-        }
+        new CollectionBatchProcessor<DataPE>(context, batch)
+            {
+                @Override
+                public void process(DataPE dataSet)
+                {
+                    verify(context, dataSet);
+                }
+
+                @Override
+                public IProgress createProgress(DataPE object, int objectIndex, int totalObjectCount)
+                {
+                    return new VerifyProgress(object, objectIndex, totalObjectCount);
+                }
+            };
     }
 
     private void verify(IOperationContext context, DataPE dataSet)
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractCreateEntityExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractCreateEntityExecutor.java
index 52b5c990afb..9baa1621770 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractCreateEntityExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractCreateEntityExecutor.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.IObjectId;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
@@ -40,13 +41,13 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchP
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CheckAccessProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CheckDataProgress;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 
 /**
  * @author pkupczyk
  */
-public abstract class AbstractCreateEntityExecutor<CREATION, PE extends IIdHolder, PERM_ID extends IObjectId> implements
-        ICreateEntityExecutor<CREATION, PERM_ID>
+public abstract class AbstractCreateEntityExecutor<CREATION extends ICreation, PE extends IIdentityHolder, PERM_ID extends IObjectId>
+        implements ICreateEntityExecutor<CREATION, PERM_ID>
 {
 
     @Autowired
@@ -106,15 +107,15 @@ public abstract class AbstractCreateEntityExecutor<CREATION, PE extends IIdHolde
         new MapBatchProcessor<CREATION, PE>(context, batch)
             {
                 @Override
-                public void process(CREATION key, PE value)
+                public void process(CREATION creation, PE entity)
                 {
-                    checkAccess(context, value);
+                    checkAccess(context, entity);
                 }
 
                 @Override
-                public IProgress createProgress(CREATION key, PE value, int objectIndex, int totalObjectCount)
+                public IProgress createProgress(CREATION creation, PE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new CheckAccessProgress(key, objectIndex, totalObjectCount);
+                    return new CheckAccessProgress(entity, creation, objectIndex, totalObjectCount);
                 }
             };
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityExperimentRelationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityExperimentRelationExecutor.java
index 88617f0a645..7596de25d82 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityExperimentRelationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityExperimentRelationExecutor.java
@@ -21,17 +21,19 @@ import java.util.Map;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId;
 import ch.ethz.sis.openbis.generic.asapi.v3.exceptions.UnauthorizedObjectAccessException;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.experiment.IMapExperimentByIdExecutor;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ExperimentByIdentiferValidator;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 
 /**
  * @author pkupczyk
  */
-public abstract class AbstractSetEntityExperimentRelationExecutor<ENTITY_CREATION, ENTITY_PE> extends
+public abstract class AbstractSetEntityExperimentRelationExecutor<ENTITY_CREATION extends ICreation, ENTITY_PE extends IIdentityHolder> extends
         AbstractSetEntityToOneRelationExecutor<ENTITY_CREATION, ENTITY_PE, IExperimentId, ExperimentPE>
 {
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntitySampleRelationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntitySampleRelationExecutor.java
index ff3cad9d094..e69cfbcb3c5 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntitySampleRelationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntitySampleRelationExecutor.java
@@ -21,17 +21,19 @@ import java.util.Map;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.ISampleId;
 import ch.ethz.sis.openbis.generic.asapi.v3.exceptions.UnauthorizedObjectAccessException;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.sample.IMapSampleByIdExecutor;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SampleByIdentiferValidator;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 
 /**
  * @author pkupczyk
  */
-public abstract class AbstractSetEntitySampleRelationExecutor<ENTITY_CREATION, ENTITY_PE> extends
+public abstract class AbstractSetEntitySampleRelationExecutor<ENTITY_CREATION extends ICreation, ENTITY_PE extends IIdentityHolder> extends
         AbstractSetEntityToOneRelationExecutor<ENTITY_CREATION, ENTITY_PE, ISampleId, SamplePE>
 {
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToManyRelationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToManyRelationExecutor.java
index d4485e7c330..d5c549daff1 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToManyRelationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToManyRelationExecutor.java
@@ -23,19 +23,21 @@ import java.util.Map;
 
 import javax.annotation.Resource;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.IObjectId;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.SetEntityRelationProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.SetRelationProgress;
 import ch.systemsx.cisd.openbis.generic.server.ComponentNames;
 import ch.systemsx.cisd.openbis.generic.server.business.IRelationshipService;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 
 /**
  * @author pkupczyk
  */
-public abstract class AbstractSetEntityToManyRelationExecutor<ENTITY_CREATION, ENTITY_PE, RELATED_ID extends IObjectId, RELATED_PE>
+public abstract class AbstractSetEntityToManyRelationExecutor<ENTITY_CREATION extends ICreation, ENTITY_PE extends IIdentityHolder, RELATED_ID extends IObjectId, RELATED_PE>
 {
 
     @Resource(name = ComponentNames.RELATIONSHIP_SERVICE)
@@ -70,9 +72,9 @@ public abstract class AbstractSetEntityToManyRelationExecutor<ENTITY_CREATION, E
                 }
 
                 @Override
-                public IProgress createProgress(ENTITY_CREATION key, ENTITY_PE value, int objectIndex, int totalObjectCount)
+                public IProgress createProgress(ENTITY_CREATION creation, ENTITY_PE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new SetEntityRelationProgress(key, getRelationName(), objectIndex, totalObjectCount);
+                    return new SetRelationProgress(entity, creation, getRelationName(), objectIndex, totalObjectCount);
                 }
             };
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToOneRelationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToOneRelationExecutor.java
index 51e67eeeaca..f3712d42606 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToOneRelationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToOneRelationExecutor.java
@@ -22,20 +22,22 @@ import java.util.Map;
 
 import org.springframework.stereotype.Component;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.IObjectId;
 import ch.ethz.sis.openbis.generic.asapi.v3.exceptions.ObjectNotFoundException;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.SetEntityRelationProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.SetRelationProgress;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 
 /**
  * @author pkupczyk
  */
 @Component
-public abstract class AbstractSetEntityToOneRelationExecutor<ENTITY_CREATION, ENTITY_PE, RELATED_ID, RELATED_PE> implements
-        ISetEntityRelationsExecutor<ENTITY_CREATION, ENTITY_PE>
+public abstract class AbstractSetEntityToOneRelationExecutor<ENTITY_CREATION extends ICreation, ENTITY_PE extends IIdentityHolder, RELATED_ID, RELATED_PE>
+        implements ISetEntityRelationsExecutor<ENTITY_CREATION, ENTITY_PE>
 {
 
     @Override
@@ -81,9 +83,9 @@ public abstract class AbstractSetEntityToOneRelationExecutor<ENTITY_CREATION, EN
                 }
 
                 @Override
-                public IProgress createProgress(ENTITY_CREATION key, ENTITY_PE value, int objectIndex, int totalObjectCount)
+                public IProgress createProgress(ENTITY_CREATION creation, ENTITY_PE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new SetEntityRelationProgress(key, getRelationName(), objectIndex, totalObjectCount);
+                    return new SetRelationProgress(entity, creation, getRelationName(), objectIndex, totalObjectCount);
                 }
 
             };
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityExecutor.java
index a0a08fdaa8d..2e458809c86 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityExecutor.java
@@ -30,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DataAccessException;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.IObjectId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.exceptions.ObjectNotFoundException;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
@@ -41,12 +42,13 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchP
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CheckAccessProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CheckDataProgress;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 
 /**
  * @author pkupczyk
  */
-public abstract class AbstractUpdateEntityExecutor<UPDATE, PE extends IIdHolder, ID extends IObjectId> implements IUpdateEntityExecutor<UPDATE>
+public abstract class AbstractUpdateEntityExecutor<UPDATE extends IUpdate, PE extends IIdentityHolder, ID extends IObjectId>
+        implements IUpdateEntityExecutor<UPDATE>
 {
 
     @Autowired
@@ -101,15 +103,15 @@ public abstract class AbstractUpdateEntityExecutor<UPDATE, PE extends IIdHolder,
         new MapBatchProcessor<UPDATE, PE>(context, batch)
             {
                 @Override
-                public void process(UPDATE key, PE value)
+                public void process(UPDATE update, PE entity)
                 {
-                    checkAccess(context, getId(key), value);
+                    checkAccess(context, getId(update), entity);
                 }
 
                 @Override
-                public IProgress createProgress(UPDATE key, PE value, int objectIndex, int totalObjectCount)
+                public IProgress createProgress(UPDATE update, PE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new CheckAccessProgress(key, objectIndex, totalObjectCount);
+                    return new CheckAccessProgress(entity, update, objectIndex, totalObjectCount);
                 }
             };
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToManyRelationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToManyRelationExecutor.java
index 7ba75e03112..a790f425894 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToManyRelationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToManyRelationExecutor.java
@@ -25,6 +25,7 @@ import java.util.Set;
 import javax.annotation.Resource;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.IObjectId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IdListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateAction;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateActionAdd;
@@ -35,14 +36,16 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateEntityRelationProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateRelationProgress;
 import ch.systemsx.cisd.openbis.generic.server.ComponentNames;
 import ch.systemsx.cisd.openbis.generic.server.business.IRelationshipService;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 
 /**
  * @author pkupczyk
  */
-public abstract class AbstractUpdateEntityToManyRelationExecutor<ENTITY_UPDATE, ENTITY_PE, RELATED_ID, RELATED_PE> implements
+public abstract class AbstractUpdateEntityToManyRelationExecutor<ENTITY_UPDATE extends IUpdate, ENTITY_PE extends IIdentityHolder, RELATED_ID, RELATED_PE>
+        implements
         IUpdateEntityRelationsWithCacheExecutor<ENTITY_UPDATE, ENTITY_PE, RELATED_ID, RELATED_PE>
 {
 
@@ -107,7 +110,7 @@ public abstract class AbstractUpdateEntityToManyRelationExecutor<ENTITY_UPDATE,
                 @Override
                 public IProgress createProgress(ENTITY_UPDATE key, ENTITY_PE value, int objectIndex, int totalObjectCount)
                 {
-                    return new UpdateEntityRelationProgress(key, getRelationName(), objectIndex, totalObjectCount);
+                    return new UpdateRelationProgress(key, value, getRelationName(), objectIndex, totalObjectCount);
                 }
             };
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToOneRelationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToOneRelationExecutor.java
index f2eca35e915..49a3a1f8859 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToOneRelationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToOneRelationExecutor.java
@@ -27,20 +27,22 @@ import org.springframework.beans.factory.annotation.Autowired;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.IObjectId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.exceptions.ObjectNotFoundException;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateEntityRelationProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateRelationProgress;
 import ch.systemsx.cisd.openbis.generic.server.business.IRelationshipService;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 
 /**
  * @author pkupczyk
  */
-public abstract class AbstractUpdateEntityToOneRelationExecutor<ENTITY_UPDATE, ENTITY_PE, RELATED_ID, RELATED_PE> implements
-        IUpdateEntityRelationsExecutor<ENTITY_UPDATE, ENTITY_PE>,
+public abstract class AbstractUpdateEntityToOneRelationExecutor<ENTITY_UPDATE extends IUpdate, ENTITY_PE extends IIdentityHolder, RELATED_ID, RELATED_PE>
+        implements IUpdateEntityRelationsExecutor<ENTITY_UPDATE, ENTITY_PE>,
         IUpdateEntityRelationsWithCacheExecutor<ENTITY_UPDATE, ENTITY_PE, RELATED_ID, RELATED_PE>
 {
 
@@ -129,7 +131,7 @@ public abstract class AbstractUpdateEntityToOneRelationExecutor<ENTITY_UPDATE, E
                 @Override
                 public IProgress createProgress(ENTITY_UPDATE key, ENTITY_PE value, int objectIndex, int totalObjectCount)
                 {
-                    return new UpdateEntityRelationProgress(key, getRelationName(), objectIndex, totalObjectCount);
+                    return new UpdateRelationProgress(key, value, getRelationName(), objectIndex, totalObjectCount);
                 }
             };
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/CreateExperimentExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/CreateExperimentExecutor.java
index 058a50027a7..d91737df15e 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/CreateExperimentExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/CreateExperimentExecutor.java
@@ -43,7 +43,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.tag.IAddTagToEntityE
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateEntityProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ExperimentByIdentiferValidator;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataAccessExceptionTranslator;
@@ -109,7 +109,7 @@ public class CreateExperimentExecutor extends AbstractCreateEntityExecutor<Exper
                 @Override
                 public IProgress createProgress(ExperimentCreation object, int objectIndex, int totalObjectCount)
                 {
-                    return new CreateEntityProgress(object, objectIndex, totalObjectCount);
+                    return new CreateProgress(object, objectIndex, totalObjectCount);
                 }
             };
 
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 40d5f0c2e2b..86cd249ec28 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
@@ -35,7 +35,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.tag.IUpdateTagForEnt
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateEntityRelationProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateRelationProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ExperimentByIdentiferValidator;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataAccessExceptionTranslator;
@@ -137,7 +137,7 @@ public class UpdateExperimentExecutor extends AbstractUpdateEntityExecutor<Exper
                 @Override
                 public IProgress createProgress(ExperimentUpdate update, ExperimentPE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new UpdateEntityRelationProgress(update, "experiment-tag", objectIndex, totalObjectCount);
+                    return new UpdateRelationProgress(update, entity, "experiment-tag", objectIndex, totalObjectCount);
                 }
             };
     }
@@ -158,7 +158,7 @@ public class UpdateExperimentExecutor extends AbstractUpdateEntityExecutor<Exper
                 @Override
                 public IProgress createProgress(ExperimentUpdate update, ExperimentPE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new UpdateEntityRelationProgress(update, "experiment-attachment", objectIndex, totalObjectCount);
+                    return new UpdateRelationProgress(update, entity, "experiment-attachment", objectIndex, totalObjectCount);
                 }
             };
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentPropertyExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentPropertyExecutor.java
index e8cb7c3d60e..eaf26991523 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentPropertyExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/experiment/UpdateExperimentPropertyExecutor.java
@@ -26,7 +26,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.Capability;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
-import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 
 /**
  * @author pkupczyk
@@ -41,7 +41,8 @@ public class UpdateExperimentPropertyExecutor implements IUpdateExperimentProper
     @Override
     @RolesAllowed({ RoleWithHierarchy.SPACE_USER, RoleWithHierarchy.SPACE_ETL_SERVER })
     @Capability("UPDATE_EXPERIMENT_PROPERTY")
-    public void update(IOperationContext context, MapBatch<? extends IPropertiesHolder, ? extends IEntityPropertiesHolder> holderToEntityMap)
+    public void update(IOperationContext context,
+            MapBatch<? extends IPropertiesHolder, ? extends IEntityInformationWithPropertiesHolder> holderToEntityMap)
     {
         executor.update(context, holderToEntityMap);
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/CreateMaterialExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/CreateMaterialExecutor.java
index 0e448fa12e1..3b641f03d10 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/CreateMaterialExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/CreateMaterialExecutor.java
@@ -40,7 +40,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.tag.IAddTagToEntityE
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateEntityProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.ComponentNames;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataAccessExceptionTranslator;
@@ -96,7 +96,7 @@ public class CreateMaterialExecutor extends AbstractCreateEntityExecutor<Materia
                 @Override
                 public IProgress createProgress(MaterialCreation object, int objectIndex, int totalObjectCount)
                 {
-                    return new CreateEntityProgress(object, objectIndex, totalObjectCount);
+                    return new CreateProgress(object, objectIndex, totalObjectCount);
                 }
             };
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/UpdateMaterialExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/UpdateMaterialExecutor.java
index 186d1a87834..26c687e8985 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/UpdateMaterialExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/UpdateMaterialExecutor.java
@@ -34,7 +34,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.tag.IUpdateTagForEnt
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateEntityRelationProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateRelationProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SampleByIdentiferValidator;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataAccessExceptionTranslator;
@@ -117,7 +117,7 @@ public class UpdateMaterialExecutor extends AbstractUpdateEntityExecutor<Materia
                 @Override
                 public IProgress createProgress(MaterialUpdate update, MaterialPE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new UpdateEntityRelationProgress(update, "material-tag", objectIndex, totalObjectCount);
+                    return new UpdateRelationProgress(update, entity, "material-tag", objectIndex, totalObjectCount);
                 }
             };
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/UpdateMaterialPropertyExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/UpdateMaterialPropertyExecutor.java
index 96d8de4fa5e..595ed8247ae 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/UpdateMaterialPropertyExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/material/UpdateMaterialPropertyExecutor.java
@@ -26,7 +26,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.Capability;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
-import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 
 /**
  * @author pkupczyk
@@ -41,7 +41,8 @@ public class UpdateMaterialPropertyExecutor implements IUpdateMaterialPropertyEx
     @Override
     @RolesAllowed({ RoleWithHierarchy.INSTANCE_ADMIN, RoleWithHierarchy.INSTANCE_ETL_SERVER })
     @Capability("UPDATE_MATERIAL_PROPERTY")
-    public void update(IOperationContext context, MapBatch<? extends IPropertiesHolder, ? extends IEntityPropertiesHolder> holderToEntityMap)
+    public void update(IOperationContext context,
+            MapBatch<? extends IPropertiesHolder, ? extends IEntityInformationWithPropertiesHolder> holderToEntityMap)
     {
         executor.update(context, holderToEntityMap);
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/CreateProjectExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/CreateProjectExecutor.java
index 881258ad96a..791c6274b60 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/CreateProjectExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/CreateProjectExecutor.java
@@ -40,7 +40,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.AbstractCreat
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateEntityProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ProjectByIdentiferValidator;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataAccessExceptionTranslator;
@@ -96,7 +96,7 @@ public class CreateProjectExecutor extends AbstractCreateEntityExecutor<ProjectC
                 @Override
                 public IProgress createProgress(ProjectCreation object, int objectIndex, int totalObjectCount)
                 {
-                    return new CreateEntityProgress(object, objectIndex, totalObjectCount);
+                    return new CreateProgress(object, objectIndex, totalObjectCount);
                 }
             };
 
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 189c3c06816..d32896c747f 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
@@ -34,7 +34,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.AbstractUpdat
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateEntityRelationProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateRelationProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ProjectByIdentiferValidator;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataAccessExceptionTranslator;
@@ -131,7 +131,7 @@ public class UpdateProjectExecutor extends AbstractUpdateEntityExecutor<ProjectU
                 @Override
                 public IProgress createProgress(ProjectUpdate update, ProjectPE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new UpdateEntityRelationProgress(update, "project-attachment", objectIndex, totalObjectCount);
+                    return new UpdateRelationProgress(update, entity, "project-attachment", objectIndex, totalObjectCount);
                 }
             };
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/IAbstractUpdateEntityPropertyExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/IAbstractUpdateEntityPropertyExecutor.java
index 9c63de6e68a..72d318abbc2 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/IAbstractUpdateEntityPropertyExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/IAbstractUpdateEntityPropertyExecutor.java
@@ -19,7 +19,7 @@ package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.property;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
-import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 
 /**
  * @author pkupczyk
@@ -27,6 +27,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
 public interface IAbstractUpdateEntityPropertyExecutor
 {
 
-    public void update(IOperationContext context, MapBatch<? extends IPropertiesHolder, ? extends IEntityPropertiesHolder> holderToEntityMap);
+    public void update(IOperationContext context, MapBatch<? extends IPropertiesHolder, ? extends IEntityInformationWithPropertiesHolder> holderToEntityMap);
 
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdateEntityPropertyExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdateEntityPropertyExecutor.java
index c94a040c00c..7f31d48a7dc 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdateEntityPropertyExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdateEntityPropertyExecutor.java
@@ -31,12 +31,13 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateEntityPropertyProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdatePropertyProgress;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.EntityPropertiesConverter;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
@@ -69,9 +70,10 @@ public class UpdateEntityPropertyExecutor implements IUpdateEntityPropertyExecut
 
     @Override
     public void update(final IOperationContext context,
-            final MapBatch<? extends IPropertiesHolder, ? extends IEntityPropertiesHolder> holderToEntityMap)
+            final MapBatch<? extends IPropertiesHolder, ? extends IEntityInformationWithPropertiesHolder> holderToEntityMap)
     {
-        final MapBatch<IEntityPropertiesHolder, Map<String, String>> entityToPropertiesMap = getEntityToPropertiesMap(holderToEntityMap);
+        final MapBatch<IEntityInformationWithPropertiesHolder, Map<String, String>> entityToPropertiesMap =
+                getEntityToPropertiesMap(holderToEntityMap);
 
         if (entityToPropertiesMap == null || entityToPropertiesMap.isEmpty())
         {
@@ -80,10 +82,10 @@ public class UpdateEntityPropertyExecutor implements IUpdateEntityPropertyExecut
 
         final Map<EntityKind, EntityPropertiesConverter> converters = new HashMap<EntityKind, EntityPropertiesConverter>();
 
-        new MapBatchProcessor<IEntityPropertiesHolder, Map<String, String>>(context, entityToPropertiesMap)
+        new MapBatchProcessor<IEntityInformationWithPropertiesHolder, Map<String, String>>(context, entityToPropertiesMap)
             {
                 @Override
-                public void process(IEntityPropertiesHolder propertiesHolder, Map<String, String> properties)
+                public void process(IEntityInformationWithPropertiesHolder propertiesHolder, Map<String, String> properties)
                 {
                     EntityKind entityKind = propertiesHolder.getEntityType().getEntityKind();
 
@@ -98,28 +100,30 @@ public class UpdateEntityPropertyExecutor implements IUpdateEntityPropertyExecut
                 }
 
                 @Override
-                public IProgress createProgress(IEntityPropertiesHolder propertiesHolder, Map<String, String> properties, int objectIndex,
-                        int totalObjectCount)
+                public IProgress createProgress(IEntityInformationWithPropertiesHolder propertiesHolder, Map<String, String> properties,
+                        int objectIndex, int totalObjectCount)
                 {
-                    return new UpdateEntityPropertyProgress(propertiesHolder, properties, objectIndex, totalObjectCount);
+                    return new UpdatePropertyProgress(propertiesHolder, properties, objectIndex, totalObjectCount);
                 }
             };
     }
 
-    private MapBatch<IEntityPropertiesHolder, Map<String, String>> getEntityToPropertiesMap(
-            final MapBatch<? extends IPropertiesHolder, ? extends IEntityPropertiesHolder> holderToEntityMap)
+    private MapBatch<IEntityInformationWithPropertiesHolder, Map<String, String>> getEntityToPropertiesMap(
+            final MapBatch<? extends IPropertiesHolder, ? extends IEntityInformationWithPropertiesHolder> holderToEntityMap)
     {
         if (holderToEntityMap == null || holderToEntityMap.isEmpty())
         {
             return null;
         }
 
-        Map<IEntityPropertiesHolder, Map<String, String>> entityToPropertiesMap = new HashMap<IEntityPropertiesHolder, Map<String, String>>();
+        Map<IEntityInformationWithPropertiesHolder, Map<String, String>> entityToPropertiesMap =
+                new HashMap<IEntityInformationWithPropertiesHolder, Map<String, String>>();
 
-        for (Map.Entry<? extends IPropertiesHolder, ? extends IEntityPropertiesHolder> entry : holderToEntityMap.getObjects().entrySet())
+        for (Map.Entry<? extends IPropertiesHolder, ? extends IEntityInformationWithPropertiesHolder> entry : holderToEntityMap.getObjects()
+                .entrySet())
         {
             IPropertiesHolder holder = entry.getKey();
-            IEntityPropertiesHolder entity = entry.getValue();
+            IEntityInformationWithPropertiesHolder entity = entry.getValue();
 
             if (holder.getProperties() != null && false == holder.getProperties().isEmpty())
             {
@@ -132,8 +136,9 @@ public class UpdateEntityPropertyExecutor implements IUpdateEntityPropertyExecut
             return null;
         }
 
-        return new MapBatch<IEntityPropertiesHolder, Map<String, String>>(holderToEntityMap.getBatchIndex(), holderToEntityMap.getFromObjectIndex(),
-                holderToEntityMap.getToObjectIndex(), entityToPropertiesMap, holderToEntityMap.getTotalObjectCount());
+        return new MapBatch<IEntityInformationWithPropertiesHolder, Map<String, String>>(holderToEntityMap.getBatchIndex(),
+                holderToEntityMap.getFromObjectIndex(), holderToEntityMap.getToObjectIndex(), entityToPropertiesMap,
+                holderToEntityMap.getTotalObjectCount());
     }
 
     private void update(IOperationContext context, IEntityPropertiesHolder propertiesHolder, Map<String, String> properties,
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/VerifyEntityPropertyExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/VerifyEntityPropertyExecutor.java
index 1263e5aa4e4..ddf1f2e4029 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/VerifyEntityPropertyExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/VerifyEntityPropertyExecutor.java
@@ -27,7 +27,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.VerifyEntityProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.VerifyProgress;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.EntityPropertiesConverter;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
@@ -78,7 +78,7 @@ public class VerifyEntityPropertyExecutor implements IVerifyEntityPropertyExecut
                 @Override
                 public IProgress createProgress(IEntityInformationWithPropertiesHolder object, int objectIndex, int totalObjectCount)
                 {
-                    return new VerifyEntityProgress(objectIndex, totalObjectCount);
+                    return new VerifyProgress(object, objectIndex, totalObjectCount);
                 }
             };
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/CreateSampleExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/CreateSampleExecutor.java
index 650d9c283c7..a7613a39d19 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/CreateSampleExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/CreateSampleExecutor.java
@@ -52,7 +52,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.Collectio
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CheckDataProgress;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateEntityProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.properties.PropertyUtils;
 import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer;
@@ -150,7 +150,7 @@ public class CreateSampleExecutor extends AbstractCreateEntityExecutor<SampleCre
                 @Override
                 public IProgress createProgress(SampleCreation object, int objectIndex, int totalObjectCount)
                 {
-                    return new CreateEntityProgress(object, objectIndex, totalObjectCount);
+                    return new CreateProgress(object, objectIndex, totalObjectCount);
                 }
             };
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/SetSampleContainerExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/SetSampleContainerExecutor.java
index 48043d0d16c..8197f343667 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/SetSampleContainerExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/SetSampleContainerExecutor.java
@@ -28,7 +28,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.SetEntityRelationProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.SetRelationProgress;
 import ch.systemsx.cisd.openbis.generic.server.ComponentNames;
 import ch.systemsx.cisd.openbis.generic.server.business.IRelationshipService;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -60,9 +60,9 @@ public class SetSampleContainerExecutor implements ISetSampleContainerExecutor
                 }
 
                 @Override
-                public IProgress createProgress(SampleCreation key, SamplePE value, int objectIndex, int totalObjectCount)
+                public IProgress createProgress(SampleCreation creation, SamplePE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new SetEntityRelationProgress(key, "sample-container", objectIndex, totalObjectCount);
+                    return new SetRelationProgress(entity, creation, "sample-container", objectIndex, totalObjectCount);
                 }
             };
     }
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 9c147d85d9e..cf4cc99753a 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
@@ -35,7 +35,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.tag.IUpdateTagForEnt
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateEntityRelationProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.UpdateRelationProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SampleByIdentiferValidator;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataAccessExceptionTranslator;
@@ -147,7 +147,7 @@ public class UpdateSampleExecutor extends AbstractUpdateEntityExecutor<SampleUpd
                 @Override
                 public IProgress createProgress(SampleUpdate update, SamplePE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new UpdateEntityRelationProgress(update, "sample-tag", objectIndex, totalObjectCount);
+                    return new UpdateRelationProgress(update, entity, "sample-tag", objectIndex, totalObjectCount);
                 }
             };
     }
@@ -168,7 +168,7 @@ public class UpdateSampleExecutor extends AbstractUpdateEntityExecutor<SampleUpd
                 @Override
                 public IProgress createProgress(SampleUpdate update, SamplePE entity, int objectIndex, int totalObjectCount)
                 {
-                    return new UpdateEntityRelationProgress(update, "sample-attachment", objectIndex, totalObjectCount);
+                    return new UpdateRelationProgress(update, entity, "sample-attachment", objectIndex, totalObjectCount);
                 }
             };
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSamplePropertyExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSamplePropertyExecutor.java
index 4fd8e3deaea..4cc14a711d7 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSamplePropertyExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSamplePropertyExecutor.java
@@ -26,7 +26,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.Capability;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
-import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 
 /**
  * @author pkupczyk
@@ -41,7 +41,8 @@ public class UpdateSamplePropertyExecutor implements IUpdateSamplePropertyExecut
     @Override
     @RolesAllowed({ RoleWithHierarchy.SPACE_USER, RoleWithHierarchy.SPACE_ETL_SERVER })
     @Capability("UPDATE_SAMPLE_PROPERTY")
-    public void update(IOperationContext context, MapBatch<? extends IPropertiesHolder, ? extends IEntityPropertiesHolder> holderToEntityMap)
+    public void update(IOperationContext context,
+            MapBatch<? extends IPropertiesHolder, ? extends IEntityInformationWithPropertiesHolder> holderToEntityMap)
     {
         executor.update(context, holderToEntityMap);
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleContainerExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleContainerExecutor.java
index fc61273af9c..4bbff53601f 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleContainerExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleContainerExecutor.java
@@ -18,8 +18,11 @@ package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.sample;
 
 import org.springframework.stereotype.Component;
 
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.VerifyProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.SampleGenericBusinessRules;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -34,23 +37,33 @@ public class VerifySampleContainerExecutor implements IVerifySampleContainerExec
     @Override
     public void verify(IOperationContext context, CollectionBatch<SamplePE> batch)
     {
-        for (SamplePE sample : batch.getObjects())
-        {
-            SamplePE containerCandidate = sample.getContainer();
-
-            while (containerCandidate != null)
+        new CollectionBatchProcessor<SamplePE>(context, batch)
             {
-                if (sample.equals(containerCandidate))
+                @Override
+                public void process(SamplePE sample)
                 {
-                    throw UserFailureException.fromTemplate("'%s' cannot be it's own container.",
-                            sample.getIdentifier());
+                    SamplePE containerCandidate = sample.getContainer();
+
+                    while (containerCandidate != null)
+                    {
+                        if (sample.equals(containerCandidate))
+                        {
+                            throw UserFailureException.fromTemplate("'%s' cannot be it's own container.",
+                                    sample.getIdentifier());
+                        }
+                        containerCandidate = containerCandidate.getContainer();
+                    }
+
+                    SampleGenericBusinessRules.assertValidContainer(sample);
+                    SampleGenericBusinessRules.assertValidComponents(sample);
                 }
-                containerCandidate = containerCandidate.getContainer();
-            }
 
-            SampleGenericBusinessRules.assertValidContainer(sample);
-            SampleGenericBusinessRules.assertValidComponents(sample);
-        }
+                @Override
+                public IProgress createProgress(SamplePE object, int objectIndex, int totalObjectCount)
+                {
+                    return new VerifyProgress(object, objectIndex, totalObjectCount);
+                }
+            };
     }
 
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleExperimentExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleExperimentExecutor.java
index 4a78806e68e..98b7e1f5ca1 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleExperimentExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleExperimentExecutor.java
@@ -25,7 +25,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.VerifyEntityProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.VerifyProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO;
@@ -105,7 +105,7 @@ public class VerifySampleExperimentExecutor implements IVerifySampleExperimentEx
                 @Override
                 public IProgress createProgress(SamplePE object, int objectIndex, int totalObjectCount)
                 {
-                    return new VerifyEntityProgress(objectIndex, totalObjectCount);
+                    return new VerifyProgress(object, objectIndex, totalObjectCount);
                 }
             };
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleParentsExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleParentsExecutor.java
index 7cfaeb38289..a5ee40ae03d 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleParentsExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleParentsExecutor.java
@@ -22,11 +22,14 @@ import java.util.Set;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.AbstractVerifyEntityCyclesExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.relationship.IGetRelationshipIdExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.relationship.IGetRelationshipIdExecutor.RelationshipType;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.VerifyProgress;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.SampleGenericBusinessRules;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -46,11 +49,21 @@ public class VerifySampleParentsExecutor extends AbstractVerifyEntityCyclesExecu
     {
         super.verify(context, batch);
 
-        for (SamplePE sample : batch.getObjects())
-        {
-            SampleGenericBusinessRules.assertValidParents(sample);
-            SampleGenericBusinessRules.assertValidChildren(sample);
-        }
+        new CollectionBatchProcessor<SamplePE>(context, batch)
+            {
+                @Override
+                public void process(SamplePE sample)
+                {
+                    SampleGenericBusinessRules.assertValidParents(sample);
+                    SampleGenericBusinessRules.assertValidChildren(sample);
+                }
+
+                @Override
+                public IProgress createProgress(SamplePE object, int objectIndex, int totalObjectCount)
+                {
+                    return new VerifyProgress(object, objectIndex, totalObjectCount);
+                }
+            };
     }
 
     @Override
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleProjectExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleProjectExecutor.java
index 5b7063d1aa3..1dc4e1470d7 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleProjectExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleProjectExecutor.java
@@ -22,7 +22,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.context.IProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.VerifyEntityProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.VerifyProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -58,7 +58,7 @@ public class VerifySampleProjectExecutor implements IVerifySampleProjectExecutor
                 @Override
                 public IProgress createProgress(SamplePE object, int objectIndex, int totalObjectCount)
                 {
-                    return new VerifyEntityProgress(objectIndex, totalObjectCount);
+                    return new VerifyProgress(object, objectIndex, totalObjectCount);
                 }
             };
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/CreateSpaceExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/CreateSpaceExecutor.java
index 4e908e62a63..4ea80234301 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/CreateSpaceExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/CreateSpaceExecutor.java
@@ -35,7 +35,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.AbstractCreat
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateEntityProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateProgress;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.ComponentNames;
 import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationServiceUtils;
@@ -86,7 +86,7 @@ public class CreateSpaceExecutor extends AbstractCreateEntityExecutor<SpaceCreat
                 @Override
                 public IProgress createProgress(SpaceCreation object, int objectIndex, int totalObjectCount)
                 {
-                    return new CreateEntityProgress(object, objectIndex, totalObjectCount);
+                    return new CreateProgress(object, objectIndex, totalObjectCount);
                 }
             };
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/CreateTagExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/CreateTagExecutor.java
index 686070470c4..4dbb6a349ae 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/CreateTagExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/CreateTagExecutor.java
@@ -33,7 +33,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.AbstractCreat
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatch;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.CollectionBatchProcessor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.common.batch.MapBatch;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateEntityProgress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress.CreateProgress;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.tag.TagAuthorization;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.DataAccessExceptionTranslator;
@@ -83,7 +83,7 @@ public class CreateTagExecutor extends AbstractCreateEntityExecutor<TagCreation,
                 @Override
                 public IProgress createProgress(TagCreation object, int objectIndex, int totalObjectCount)
                 {
-                    return new CreateEntityProgress(object, objectIndex, totalObjectCount);
+                    return new CreateProgress(object, objectIndex, totalObjectCount);
                 }
             };
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CheckAccessProgress.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CheckAccessProgress.java
index cd298ca1265..7a01ae881f9 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CheckAccessProgress.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CheckAccessProgress.java
@@ -16,19 +16,46 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
 
-import ch.ethz.sis.openbis.generic.server.asapi.v3.context.Progress;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.ProgressDetails;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 
 /**
  * @author pkupczyk
  */
-public class CheckAccessProgress extends Progress
+public class CheckAccessProgress extends EntityProgress
 {
 
     private static final long serialVersionUID = 1L;
 
-    public CheckAccessProgress(Object object, int numItemsProcessed, int totalItemsToProcess)
+    private ICreation creation;
+
+    private IUpdate update;
+
+    public CheckAccessProgress(IIdentityHolder entity, ICreation creation, int numItemsProcessed, int totalItemsToProcess)
+    {
+        this(entity, numItemsProcessed, totalItemsToProcess);
+        this.creation = creation;
+    }
+
+    public CheckAccessProgress(IIdentityHolder entity, IUpdate update, int numItemsProcessed, int totalItemsToProcess)
+    {
+        this(entity, numItemsProcessed, totalItemsToProcess);
+        this.update = update;
+    }
+
+    private CheckAccessProgress(IIdentityHolder entity, int numItemsProcessed, int totalItemsToProcess)
+    {
+        super("checking access", entity, numItemsProcessed, totalItemsToProcess);
+    }
+
+    @Override
+    protected void updateDetails(ProgressDetails details)
     {
-        super("checking access", object, numItemsProcessed, totalItemsToProcess);
+        super.updateDetails(details);
+        details.set("creation", creation);
+        details.set("update", update);
     }
 
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CheckDataProgress.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CheckDataProgress.java
index 5fbb20f2203..ec1f40d5a54 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CheckDataProgress.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CheckDataProgress.java
@@ -16,19 +16,45 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
 
-import ch.ethz.sis.openbis.generic.server.asapi.v3.context.Progress;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.ProgressDetails;
 
 /**
  * @author pkupczyk
  */
-public class CheckDataProgress extends Progress
+public class CheckDataProgress extends EntityProgress
 {
 
     private static final long serialVersionUID = 1L;
 
-    public CheckDataProgress(Object object, int numItemsProcessed, int totalItemsToProcess)
+    private ICreation creation;
+
+    private IUpdate update;
+
+    public CheckDataProgress(ICreation creation, int numItemsProcessed, int totalItemsToProcess)
+    {
+        this(numItemsProcessed, totalItemsToProcess);
+        this.creation = creation;
+    }
+
+    public CheckDataProgress(IUpdate update, int numItemsProcessed, int totalItemsToProcess)
+    {
+        this(numItemsProcessed, totalItemsToProcess);
+        this.update = update;
+    }
+
+    private CheckDataProgress(int numItemsProcessed, int totalItemsToProcess)
+    {
+        super("checking data", null, numItemsProcessed, totalItemsToProcess);
+    }
+
+    @Override
+    protected void updateDetails(ProgressDetails details)
     {
-        super("checking data", object, numItemsProcessed, totalItemsToProcess);
+        super.updateDetails(details);
+        details.set("creation", creation);
+        details.set("update", update);
     }
 
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CreateEntityProgress.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CreateProgress.java
similarity index 61%
rename from openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CreateEntityProgress.java
rename to openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CreateProgress.java
index c1727963df7..5fa04560d49 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CreateEntityProgress.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/CreateProgress.java
@@ -16,19 +16,30 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
 
-import ch.ethz.sis.openbis.generic.server.asapi.v3.context.Progress;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.ProgressDetails;
 
 /**
  * @author pkupczyk
  */
-public class CreateEntityProgress extends Progress
+public class CreateProgress extends EntityProgress
 {
 
     private static final long serialVersionUID = 1L;
 
-    public CreateEntityProgress(Object object, int numItemsProcessed, int totalItemsToProcess)
+    private ICreation creation;
+
+    public CreateProgress(ICreation creation, int numItemsProcessed, int totalItemsToProcess)
+    {
+        super("creating", null, numItemsProcessed, totalItemsToProcess);
+        this.creation = creation;
+    }
+
+    @Override
+    protected void updateDetails(ProgressDetails details)
     {
-        super("creating", object, numItemsProcessed, totalItemsToProcess);
+        super.updateDetails(details);
+        details.set("creation", creation);
     }
 
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgress.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgress.java
new file mode 100644
index 00000000000..f977fedea34
--- /dev/null
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgress.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2016 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
+
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.Progress;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.ProgressDetails;
+import ch.systemsx.cisd.common.action.IDelegatedAction;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
+
+/**
+ * @author pkupczyk
+ */
+public abstract class EntityProgress extends Progress
+{
+
+    private static final long serialVersionUID = 1L;
+
+    private IIdentityHolder entity;
+
+    public EntityProgress(String label, IIdentityHolder entity, int numItemsProcessed, int totalItemsToProcess)
+    {
+        super(label, numItemsProcessed, totalItemsToProcess);
+        this.entity = entity;
+    }
+
+    @Override
+    protected void updateDetails(ProgressDetails details)
+    {
+        if (entity != null)
+        {
+            final ProgressDetails entityDetails = new ProgressDetails();
+            entityDetails.set("class", entity.getClass().getSimpleName());
+
+            // the entity might be in an inconsistent/incomplete state therefore we allow failures when retrieving the data
+
+            setWithFailureAllowed(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        entityDetails.set("id", entity.getId());
+                    }
+                });
+
+            setWithFailureAllowed(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        entityDetails.set("permId", entity.getPermId());
+                    }
+                });
+
+            setWithFailureAllowed(new IDelegatedAction()
+                {
+                    @Override
+                    public void execute()
+                    {
+                        entityDetails.set("identifier", entity.getIdentifier());
+                    }
+                });
+
+            details.set("entity", entityDetails);
+        }
+    }
+
+    private void setWithFailureAllowed(IDelegatedAction setAction)
+    {
+        try
+        {
+            setAction.execute();
+        } catch (Exception e)
+        {
+
+        } catch (AssertionError e)
+        {
+
+        }
+    }
+
+}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/SetEntityRelationProgress.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/SetRelationProgress.java
similarity index 57%
rename from openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/SetEntityRelationProgress.java
rename to openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/SetRelationProgress.java
index 71476dedd89..c4eec6ba810 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/SetEntityRelationProgress.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/SetRelationProgress.java
@@ -16,19 +16,31 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
 
-import ch.ethz.sis.openbis.generic.server.asapi.v3.context.Progress;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.ProgressDetails;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 
 /**
  * @author pkupczyk
  */
-public class SetEntityRelationProgress extends Progress
+public class SetRelationProgress extends EntityProgress
 {
 
     private static final long serialVersionUID = 1L;
 
-    public SetEntityRelationProgress(Object object, String relationName, int numItemsProcessed, int totalItemsToProcess)
+    private ICreation creation;
+
+    public SetRelationProgress(IIdentityHolder entity, ICreation creation, String relationName, int numItemsProcessed, int totalItemsToProcess)
+    {
+        super("setting relation " + relationName, entity, numItemsProcessed, totalItemsToProcess);
+        this.creation = creation;
+    }
+
+    @Override
+    protected void updateDetails(ProgressDetails details)
     {
-        super("setting relation " + relationName, object, numItemsProcessed, totalItemsToProcess);
+        super.updateDetails(details);
+        details.set("creation", creation);
     }
 
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdateEntityPropertyProgress.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdateEntityPropertyProgress.java
deleted file mode 100644
index 7ab7844af47..00000000000
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdateEntityPropertyProgress.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2016 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import ch.ethz.sis.openbis.generic.server.asapi.v3.context.Progress;
-import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
-
-/**
- * @author pkupczyk
- */
-public class UpdateEntityPropertyProgress extends Progress
-{
-
-    private static final long serialVersionUID = 1L;
-
-    private IEntityPropertiesHolder propertiesHolder;
-
-    private Map<String, String> properties;
-
-    public UpdateEntityPropertyProgress(IEntityPropertiesHolder propertiesHolder, Map<String, String> properties, int numItemsProcessed,
-            int totalItemsToProcess)
-    {
-        super("updating properties", null, numItemsProcessed, totalItemsToProcess);
-        this.propertiesHolder = propertiesHolder;
-        this.properties = properties;
-    }
-
-    @Override
-    protected String createDetails(Object object)
-    {
-        Map<String, Object> details = new HashMap<String, Object>();
-        details.put("entityKind", propertiesHolder.getEntityType().getEntityKind());
-        if (propertiesHolder.getId() != null)
-        {
-            details.put("entityId", propertiesHolder.getId());
-        }
-        details.put("entityCode", propertiesHolder.getCode());
-        details.put("properties", properties);
-        return super.createDetails(details);
-    }
-
-}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdatePropertyProgress.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdatePropertyProgress.java
new file mode 100644
index 00000000000..902075a5b06
--- /dev/null
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdatePropertyProgress.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2016 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
+
+import java.util.Map;
+
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.ProgressDetails;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
+
+/**
+ * @author pkupczyk
+ */
+public class UpdatePropertyProgress extends EntityProgress
+{
+
+    private static final long serialVersionUID = 1L;
+
+    private Map<String, String> properties;
+
+    public UpdatePropertyProgress(IIdentityHolder entity, Map<String, String> properties, int numItemsProcessed,
+            int totalItemsToProcess)
+    {
+        super("updating properties", entity, numItemsProcessed, totalItemsToProcess);
+        this.properties = properties;
+    }
+
+    @Override
+    protected void updateDetails(ProgressDetails details)
+    {
+        super.updateDetails(details);
+        details.set("properties", properties);
+    }
+
+}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdateEntityRelationProgress.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdateRelationProgress.java
similarity index 57%
rename from openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdateEntityRelationProgress.java
rename to openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdateRelationProgress.java
index 7ca5e0c8da1..188398421a0 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdateEntityRelationProgress.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/UpdateRelationProgress.java
@@ -16,19 +16,31 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
 
-import ch.ethz.sis.openbis.generic.server.asapi.v3.context.Progress;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.context.ProgressDetails;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 
 /**
  * @author pkupczyk
  */
-public class UpdateEntityRelationProgress extends Progress
+public class UpdateRelationProgress extends EntityProgress
 {
 
     private static final long serialVersionUID = 1L;
 
-    public UpdateEntityRelationProgress(Object object, String relationName, int numItemsProcessed, int totalItemsToProcess)
+    private IUpdate update;
+
+    public UpdateRelationProgress(IUpdate update, IIdentityHolder entity, String relationName, int numItemsProcessed, int totalItemsToProcess)
+    {
+        super("updating relation " + relationName, entity, numItemsProcessed, totalItemsToProcess);
+        this.update = update;
+    }
+
+    @Override
+    protected void updateDetails(ProgressDetails details)
     {
-        super("updating relation " + relationName, object, numItemsProcessed, totalItemsToProcess);
+        super.updateDetails(details);
+        details.set("update", update);
     }
 
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/VerifyEntityProgress.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/VerifyProgress.java
similarity index 72%
rename from openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/VerifyEntityProgress.java
rename to openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/VerifyProgress.java
index 7d3d32fed11..f80024eb283 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/VerifyEntityProgress.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/VerifyProgress.java
@@ -16,19 +16,19 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
 
-import ch.ethz.sis.openbis.generic.server.asapi.v3.context.Progress;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 
 /**
  * @author pkupczyk
  */
-public class VerifyEntityProgress extends Progress
+public class VerifyProgress extends EntityProgress
 {
 
     private static final long serialVersionUID = 1L;
 
-    public VerifyEntityProgress(int numItemsProcessed, int totalItemsToProcess)
+    public VerifyProgress(IIdentityHolder entity, int numItemsProcessed, int totalItemsToProcess)
     {
-        super("verifying entity", null, numItemsProcessed, totalItemsToProcess);
+        super("verifying", entity, numItemsProcessed, totalItemsToProcess);
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IIdentityHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IIdentityHolder.java
new file mode 100644
index 00000000000..947f349b2d8
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IIdentityHolder.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2016 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.shared.basic;
+
+/**
+ * @author pkupczyk
+ */
+public interface IIdentityHolder extends IIdHolder, IPermIdHolder, IIdentifierHolder
+{
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
index 98a264e9161..ef3023c24bc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java
@@ -70,6 +70,7 @@ import ch.systemsx.cisd.common.collection.UnmodifiableSetDecorator;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.NullBridge;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
@@ -84,13 +85,13 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
  * @author Bernd Rinn
  */
 @Entity
-@Table(name = TableNames.DATA_VIEW, uniqueConstraints = @UniqueConstraint(columnNames = ColumnNames.CODE_COLUMN))
+@Table(name = TableNames.DATA_VIEW, uniqueConstraints = @UniqueConstraint(columnNames = ColumnNames.CODE_COLUMN) )
 @Inheritance(strategy = InheritanceType.JOINED)
 @Indexed(index = "DataPE")
 @ClassBridge(impl = DataGlobalSearchBridge.class)
 public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements
         IEntityInformationWithPropertiesHolder, IMatchingEntity, IIdentifierHolder, IDeletablePE,
-        IEntityWithMetaprojects, IModifierAndModificationDateBean
+        IEntityWithMetaprojects, IModifierAndModificationDateBean, IIdentityHolder
 {
     private static final long serialVersionUID = IServer.VERSION;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
index f6ea04f2985..2708e8fa6bd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
@@ -70,6 +70,7 @@ import ch.systemsx.cisd.common.collection.UnmodifiableListDecorator;
 import ch.systemsx.cisd.common.collection.UnmodifiableSetDecorator;
 import ch.systemsx.cisd.common.reflection.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentHolderKind;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
@@ -91,7 +92,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 @ClassBridge(impl = ExperimentGlobalSearchBridge.class)
 public class ExperimentPE extends AttachmentHolderPE implements
         IEntityInformationWithPropertiesHolder, IIdAndCodeHolder, Comparable<ExperimentPE>,
-        IModifierAndModificationDateBean, IMatchingEntity, IDeletablePE, IEntityWithMetaprojects,
+        IModifierAndModificationDateBean, IMatchingEntity, IDeletablePE, IEntityWithMetaprojects, IIdentityHolder,
         Serializable
 {
     private static final long serialVersionUID = IServer.VERSION;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/IEntityInformationWithPropertiesHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/IEntityInformationWithPropertiesHolder.java
index 74cdba9ea52..081c020ec66 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/IEntityInformationWithPropertiesHolder.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/IEntityInformationWithPropertiesHolder.java
@@ -16,10 +16,12 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.dto;
 
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
+
 /**
  * @author Piotr Buczek
  */
 public interface IEntityInformationWithPropertiesHolder extends IEntityInformationHolderDTO,
-        IEntityPropertiesHolder
+        IEntityPropertiesHolder, IIdentityHolder
 {
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java
index 0b25fd44f29..d870f2df5cd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java
@@ -63,6 +63,7 @@ import org.hibernate.validator.constraints.Length;
 import ch.systemsx.cisd.common.collection.UnmodifiableSetDecorator;
 import ch.systemsx.cisd.common.reflection.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.util.EqualsHashUtils;
@@ -75,12 +76,12 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
  */
 @Entity
 @Table(name = TableNames.MATERIALS_TABLE, uniqueConstraints = @UniqueConstraint(columnNames = { ColumnNames.CODE_COLUMN,
-        ColumnNames.MATERIAL_TYPE_COLUMN }))
+        ColumnNames.MATERIAL_TYPE_COLUMN }) )
 @Indexed(index = "MaterialPE")
 @ClassBridge(impl = MaterialGlobalSearchBridge.class)
 public class MaterialPE implements IIdAndCodeHolder, Comparable<MaterialPE>,
         IEntityInformationWithPropertiesHolder, Serializable, IMatchingEntity,
-        IEntityWithMetaprojects
+        IEntityWithMetaprojects, IIdentityHolder
 {
     private static final long serialVersionUID = IServer.VERSION;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MetaprojectPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MetaprojectPE.java
index ffb9ecead71..de15a40c833 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MetaprojectPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MetaprojectPE.java
@@ -53,6 +53,7 @@ import org.hibernate.search.annotations.Store;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.search.IgnoreCaseAnalyzer;
@@ -62,11 +63,11 @@ import ch.systemsx.cisd.openbis.generic.shared.util.EqualsHashUtils;
  * @author Pawel Glyzewski
  */
 @Entity
-@Table(name = TableNames.METAPROJECTS_TABLE, uniqueConstraints = @UniqueConstraint(columnNames = { ColumnNames.NAME_COLUMN, ColumnNames.OWNER }))
-public class MetaprojectPE implements Serializable, IIdHolder, ICodeHolder
+@Table(name = TableNames.METAPROJECTS_TABLE, uniqueConstraints = @UniqueConstraint(columnNames = { ColumnNames.NAME_COLUMN, ColumnNames.OWNER }) )
+public class MetaprojectPE implements Serializable, IIdHolder, ICodeHolder, IIdentityHolder
 {
     private static final long serialVersionUID = IServer.VERSION;
-
+    
     private transient Long id;
 
     private String name;
@@ -115,6 +116,7 @@ public class MetaprojectPE implements Serializable, IIdHolder, ICodeHolder
         return getName();
     }
 
+    @Override
     @Transient
     @Field(index = Index.YES, name = SearchFieldConstants.IDENTIFIER, store = Store.YES)
     @Analyzer(impl = IgnoreCaseAnalyzer.class)
@@ -123,6 +125,13 @@ public class MetaprojectPE implements Serializable, IIdHolder, ICodeHolder
         return new MetaprojectIdentifier(getOwner() != null ? getOwner().getUserId() : null,
                 getName()).format();
     }
+    
+    @Override
+    @Transient
+    public String getPermId()
+    {
+        return null;
+    }
 
     @Column(name = ColumnNames.DESCRIPTION_COLUMN)
     public String getDescription()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProjectPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProjectPE.java
index c96a20ce122..601e9e31b26 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProjectPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProjectPE.java
@@ -61,6 +61,7 @@ import ch.systemsx.cisd.common.collection.UnmodifiableListDecorator;
 import ch.systemsx.cisd.common.reflection.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentHolderKind;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
@@ -77,7 +78,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.EqualsHashUtils;
         @UniqueConstraint(columnNames = { ColumnNames.CODE_COLUMN, ColumnNames.SPACE_COLUMN }) })
 @Friend(toClasses = ExperimentPE.class)
 public final class ProjectPE extends AttachmentHolderPE implements Comparable<ProjectPE>,
-        IIdAndCodeHolder, IModifierAndModificationDateBean, Serializable
+        IIdAndCodeHolder, IModifierAndModificationDateBean, IIdentityHolder, Serializable
 {
     public static final ProjectPE[] EMPTY_ARRAY = new ProjectPE[0];
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
index d0a0dd9c38d..f5852f45764 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
@@ -71,6 +71,7 @@ import ch.systemsx.cisd.common.collection.UnmodifiableSetDecorator;
 import ch.systemsx.cisd.common.reflection.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentHolderKind;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.NullBridge;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
@@ -92,7 +93,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 @ClassBridge(impl = SampleGlobalSearchBridge.class)
 public class SamplePE extends AttachmentHolderPE implements IIdAndCodeHolder, Comparable<SamplePE>,
         IEntityInformationWithPropertiesHolder, IMatchingEntity, IDeletablePE,
-        IEntityWithMetaprojects, IModifierAndModificationDateBean, Serializable
+        IEntityWithMetaprojects, IModifierAndModificationDateBean, IIdentityHolder, Serializable
 {
     private static final long serialVersionUID = IServer.VERSION;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SpacePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SpacePE.java
index 67a79d7ec88..5a58620cda3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SpacePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SpacePE.java
@@ -47,7 +47,9 @@ import org.hibernate.validator.constraints.Length;
 import ch.systemsx.cisd.common.reflection.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentityHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 
 /**
  * A <i>Persistence Entity</i> which represents a group.
@@ -55,10 +57,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstant
  * @author Christian Ribeaud
  */
 @Entity
-@Table(name = TableNames.SPACES_TABLE, uniqueConstraints =
-{ @UniqueConstraint(columnNames =
-{ ColumnNames.CODE_COLUMN }) })
-public final class SpacePE extends HibernateAbstractRegistrationHolder implements IIdAndCodeHolder,
+@Table(name = TableNames.SPACES_TABLE, uniqueConstraints = { @UniqueConstraint(columnNames = { ColumnNames.CODE_COLUMN }) })
+public final class SpacePE extends HibernateAbstractRegistrationHolder implements IIdAndCodeHolder, IIdentityHolder,
         Comparable<SpacePE>, Serializable
 {
     private static final long serialVersionUID = IServer.VERSION;
@@ -98,6 +98,20 @@ public final class SpacePE extends HibernateAbstractRegistrationHolder implement
         this.id = id;
     }
 
+    @Override
+    @Transient
+    public String getPermId()
+    {
+        return code;
+    }
+
+    @Override
+    @Transient
+    public String getIdentifier()
+    {
+        return new SpaceIdentifier(code).toString();
+    }
+
     @Transient
     public final Boolean isHome()
     {
@@ -229,4 +243,5 @@ public final class SpacePE extends HibernateAbstractRegistrationHolder implement
     {
         this.samples = samples;
     }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/create/ICreation.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/create/ICreation.js
new file mode 100644
index 00000000000..e2de35ec67d
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/create/ICreation.js
@@ -0,0 +1,7 @@
+define([ "stjs", "util/Exceptions" ], function(stjs, exceptions) {
+	var ICreation = function() {
+	};
+	stjs.extend(ICreation, null, [], function(constructor, prototype) {
+	}, {});
+	return ICreation;
+})
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/update/IUpdate.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/update/IUpdate.js
new file mode 100644
index 00000000000..82f7c9296cf
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/update/IUpdate.js
@@ -0,0 +1,7 @@
+define([ "stjs", "util/Exceptions" ], function(stjs, exceptions) {
+	var IUpdate = function() {
+	};
+	stjs.extend(IUpdate, null, [], function(constructor, prototype) {
+	}, {});
+	return IUpdate;
+})
\ No newline at end of file
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgressToStringBuilderTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetailsToStringBuilderTest.java
similarity index 96%
rename from openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgressToStringBuilderTest.java
rename to openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetailsToStringBuilderTest.java
index a51262632b1..31dda17b916 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/EntityProgressToStringBuilderTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/ProgressDetailsToStringBuilderTest.java
@@ -1,4 +1,4 @@
-package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
+package ch.ethz.sis.openbis.generic.server.asapi.v3.context;
 
 import static org.testng.Assert.assertEquals;
 
@@ -10,7 +10,7 @@ import java.util.Map;
 
 import org.testng.annotations.Test;
 
-public class EntityProgressToStringBuilderTest
+public class ProgressDetailsToStringBuilderTest
 {
 
     @Test
@@ -228,7 +228,7 @@ public class EntityProgressToStringBuilderTest
 
     private void assertToStringEquals(Object object, String expectedToString)
     {
-        assertEquals(EntityProgressToStringBuilder.toString(object), expectedToString);
+        assertEquals(ProgressDetailsToStringBuilder.toString(object), expectedToString);
     }
 
 }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/TestClass.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/TestClass.java
similarity index 94%
rename from openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/TestClass.java
rename to openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/TestClass.java
index b84f1adc77c..110e23ef9dc 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/entity/progress/TestClass.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/context/TestClass.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.ethz.sis.openbis.generic.server.asapi.v3.helper.entity.progress;
+package ch.ethz.sis.openbis.generic.server.asapi.v3.context;
 
 import java.util.Collection;
 import java.util.Map;
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdateEntityPropertyExecutorTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdateEntityPropertyExecutorTest.java
index 15b20743138..24b2a2f1b97 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdateEntityPropertyExecutorTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/property/UpdateEntityPropertyExecutorTest.java
@@ -34,7 +34,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IEntityTypeDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IPropertyTypeDAO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityPropertiesHolder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
@@ -78,7 +78,7 @@ public class UpdateEntityPropertyExecutorTest extends AbstractEntityPropertyExec
         afterProperties.add(createEntityProperty("TEST_PROPERTY_2", "value 2"));
         afterProperties.add(createEntityProperty("TEST_PROPERTY_3", "value 3"));
 
-        final IEntityPropertiesHolder entityPropertiesHolder = context.mock(IEntityPropertiesHolder.class);
+        final IEntityInformationWithPropertiesHolder entityPropertiesHolder = context.mock(IEntityInformationWithPropertiesHolder.class);
 
         context.checking(new Expectations()
             {
@@ -131,7 +131,7 @@ public class UpdateEntityPropertyExecutorTest extends AbstractEntityPropertyExec
         execute(entityPropertiesHolder, entityType, updatedPropertyValues);
     }
 
-    private void execute(IEntityPropertiesHolder entity, EntityTypePE entityType, final Map<String, String> propertiesMap)
+    private void execute(IEntityInformationWithPropertiesHolder entity, EntityTypePE entityType, final Map<String, String> propertiesMap)
     {
         UpdateEntityPropertyExecutor executor = new UpdateEntityPropertyExecutor(daoFactory, managedPropertyEvaluatorFactory);
         IPropertiesHolder holder = new IPropertiesHolder()
@@ -160,7 +160,8 @@ public class UpdateEntityPropertyExecutorTest extends AbstractEntityPropertyExec
                     return propertiesMap;
                 }
             };
-        MapBatch<IPropertiesHolder, IEntityPropertiesHolder> batch = new MapBatch<>(0, 0, 1, Collections.singletonMap(holder, entity), 1);
+        MapBatch<IPropertiesHolder, IEntityInformationWithPropertiesHolder> batch =
+                new MapBatch<>(0, 0, 1, Collections.singletonMap(holder, entity), 1);
         executor.update(operationContext, batch);
     }
 
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java
index 2625692269b..74970407fd1 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/CreateSampleTest.java
@@ -763,7 +763,7 @@ public class CreateSampleTest extends AbstractSampleTest
             Assert.fail("Expected user failure exception");
         } catch (UserFailureException ufe)
         {
-            AssertionUtil.assertContains("cannot be it's own container. (Context: [])", ufe.getMessage());
+            AssertionUtil.assertContains("cannot be it's own container", ufe.getMessage());
         }
     }
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/attachment/create/AttachmentCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/attachment/create/AttachmentCreation.java
index da995a3b0a5..37b8fc89a85 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/attachment/create/AttachmentCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/attachment/create/AttachmentCreation.java
@@ -16,15 +16,14 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.create;
 
-import java.io.Serializable;
-
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
 /**
  * @author pkupczyk
  */
 @JsonObject("as.dto.attachment.create.AttachmentCreation")
-public class AttachmentCreation implements Serializable
+public class AttachmentCreation implements ICreation
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/create/ICreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/create/ICreation.java
new file mode 100644
index 00000000000..7b2324351b4
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/create/ICreation.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2016 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create;
+
+import java.io.Serializable;
+
+import ch.systemsx.cisd.base.annotation.JsonObject;
+
+/**
+ * @author pkupczyk
+ */
+@JsonObject("as.dto.common.create.ICreation")
+public interface ICreation extends Serializable
+{
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/update/IUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/update/IUpdate.java
new file mode 100644
index 00000000000..cd6504419c6
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/update/IUpdate.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2016 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update;
+
+import java.io.Serializable;
+
+import ch.systemsx.cisd.base.annotation.JsonObject;
+
+/**
+ * @author pkupczyk
+ */
+@JsonObject("as.dto.common.update.IUpdate")
+public interface IUpdate extends Serializable
+{
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java
index ef667b9a0e1..93f4e2171ab 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/DataSetCreation.java
@@ -16,12 +16,12 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create;
 
-import java.io.Serializable;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.CreationId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.ICreationIdHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
@@ -37,7 +37,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.dataset.create.DataSetCreation")
-public class DataSetCreation implements Serializable, ICreationIdHolder, IPropertiesHolder
+public class DataSetCreation implements ICreation, ICreationIdHolder, IPropertiesHolder
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/LinkedDataCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/LinkedDataCreation.java
index bc068755e29..5d6863b6edb 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/LinkedDataCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/LinkedDataCreation.java
@@ -16,10 +16,9 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create;
 
-import java.io.Serializable;
-
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.id.IExternalDmsId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -27,7 +26,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.dataset.create.LinkedDataCreation")
-public class LinkedDataCreation implements Serializable
+public class LinkedDataCreation implements ICreation
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/PhysicalDataCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/PhysicalDataCreation.java
index f5f695b5028..5594a5a8bb5 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/PhysicalDataCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/create/PhysicalDataCreation.java
@@ -16,10 +16,9 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create;
 
-import java.io.Serializable;
-
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.Complete;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.IFileFormatTypeId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.ILocatorTypeId;
@@ -30,7 +29,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.dataset.create.PhysicalDataCreation")
-public class PhysicalDataCreation implements Serializable
+public class PhysicalDataCreation implements ICreation
 {
     private static final long serialVersionUID = 1L;
 
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 06bc5d4a369..cb72c1530a6 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
@@ -16,7 +16,6 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -26,6 +25,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IdListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateAction;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.IDataSetId;
@@ -38,7 +38,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.dataset.update.DataSetUpdate")
-public class DataSetUpdate implements Serializable, IPropertiesHolder
+public class DataSetUpdate implements IUpdate, IPropertiesHolder
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/LinkedDataUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/LinkedDataUpdate.java
index 81ff22204d7..55b51c32a09 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/LinkedDataUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/LinkedDataUpdate.java
@@ -16,12 +16,11 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update;
 
-import java.io.Serializable;
-
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.id.IExternalDmsId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -29,7 +28,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.dataset.update.LinkedDataUpdate")
-public class LinkedDataUpdate implements Serializable
+public class LinkedDataUpdate implements IUpdate
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/PhysicalDataUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/PhysicalDataUpdate.java
index 3e41b16dddb..257c3f4bee0 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/PhysicalDataUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/update/PhysicalDataUpdate.java
@@ -16,12 +16,11 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update;
 
-import java.io.Serializable;
-
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.IFileFormatTypeId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -29,7 +28,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.dataset.update.PhysicalDataUpdate")
-public class PhysicalDataUpdate implements Serializable
+public class PhysicalDataUpdate implements IUpdate
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java
index 45f0a930441..8b7f75ca3d7 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java
@@ -16,12 +16,12 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.create;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.create.AttachmentCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.IEntityTypeId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.IProjectId;
@@ -32,7 +32,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.experiment.create.ExperimentCreation")
-public class ExperimentCreation implements Serializable, IPropertiesHolder
+public class ExperimentCreation implements ICreation, IPropertiesHolder
 {
     private static final long serialVersionUID = 1L;
 
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 a02b2185837..fd0d8723765 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
@@ -16,7 +16,6 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.update;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -27,6 +26,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.update.AttachmentListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IdListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateAction;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId;
@@ -38,7 +38,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.experiment.update.ExperimentUpdate")
-public class ExperimentUpdate implements Serializable, IPropertiesHolder
+public class ExperimentUpdate implements IUpdate, IPropertiesHolder
 {
 
     private static final long serialVersionUID = 1L;
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/create/MaterialCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/create/MaterialCreation.java
index 20652c29b31..92b218eab97 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/create/MaterialCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/create/MaterialCreation.java
@@ -16,11 +16,11 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.material.create;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.CreationId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.IEntityTypeId;
@@ -31,7 +31,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.material.create.MaterialCreation")
-public class MaterialCreation implements Serializable, IPropertiesHolder
+public class MaterialCreation implements ICreation, IPropertiesHolder
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/update/MaterialUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/update/MaterialUpdate.java
index 092ea7d1ac0..17ed2b2c082 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/update/MaterialUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/material/update/MaterialUpdate.java
@@ -16,7 +16,6 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.material.update;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -25,6 +24,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IdListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateAction;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.id.IMaterialId;
@@ -35,7 +35,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author Jakub Straszewski
  */
 @JsonObject("as.dto.material.update.MaterialUpdate")
-public class MaterialUpdate implements Serializable, IPropertiesHolder
+public class MaterialUpdate implements IUpdate, IPropertiesHolder
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/create/ProjectCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/create/ProjectCreation.java
index e47c8e4863d..dd43c2b8f5d 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/create/ProjectCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/create/ProjectCreation.java
@@ -16,10 +16,10 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.project.create;
 
-import java.io.Serializable;
 import java.util.List;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.create.AttachmentCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.person.id.IPersonId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.ISpaceId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.project.create.ProjectCreation")
-public class ProjectCreation implements Serializable
+public class ProjectCreation implements ICreation
 {
     private static final long serialVersionUID = 1L;
 
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 b08ad749a52..b2e8acca70a 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
@@ -16,7 +16,6 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.project.update;
 
-import java.io.Serializable;
 import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -24,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.update.AttachmentListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateAction;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.IProjectId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.ISpaceId;
@@ -33,7 +33,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.project.update.ProjectUpdate")
-public class ProjectUpdate implements Serializable
+public class ProjectUpdate implements IUpdate
 {
 
     private static final long serialVersionUID = 1L;
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java
index 2dc8964a1d4..a57f44ea901 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java
@@ -16,12 +16,12 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.create.AttachmentCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.CreationId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.ICreationIdHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
@@ -36,7 +36,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.sample.create.SampleCreation")
-public class SampleCreation implements Serializable, ICreationIdHolder, IPropertiesHolder
+public class SampleCreation implements ICreation, ICreationIdHolder, IPropertiesHolder
 {
     private static final long serialVersionUID = 1L;
 
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 dd71c500396..eb9dace1f41 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
@@ -16,7 +16,6 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update;
 
-import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -27,6 +26,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.update.AttachmentListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IdListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateAction;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId;
@@ -39,7 +39,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.sample.update.SampleUpdate")
-public class SampleUpdate implements Serializable, IPropertiesHolder
+public class SampleUpdate implements IUpdate, IPropertiesHolder
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/create/SpaceCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/create/SpaceCreation.java
index f414b90020a..260f1cad0d3 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/create/SpaceCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/create/SpaceCreation.java
@@ -16,15 +16,14 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.space.create;
 
-import java.io.Serializable;
-
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
 /**
  * @author pkupczyk
  */
 @JsonObject("as.dto.space.create.SpaceCreation")
-public class SpaceCreation implements Serializable
+public class SpaceCreation implements ICreation
 {
     private static final long serialVersionUID = 1L;
 
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 8cfe940b573..db88419f4ad 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
@@ -16,12 +16,11 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.space.update;
 
-import java.io.Serializable;
-
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.ISpaceId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -29,7 +28,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.space.update.SpaceUpdate")
-public class SpaceUpdate implements Serializable
+public class SpaceUpdate implements IUpdate
 {
 
     private static final long serialVersionUID = 1L;
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/create/TagCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/create/TagCreation.java
index 89b7fcc8a45..67a406df6e4 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/create/TagCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/create/TagCreation.java
@@ -16,9 +16,9 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.create;
 
-import java.io.Serializable;
 import java.util.List;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.IDataSetId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.id.IMaterialId;
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.tag.create.TagCreation")
-public class TagCreation implements Serializable
+public class TagCreation implements ICreation
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/update/TagUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/update/TagUpdate.java
index 990adc8d568..23b2fff9353 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/update/TagUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/update/TagUpdate.java
@@ -16,13 +16,13 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.update;
 
-import java.io.Serializable;
 import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IdListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateAction;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.IDataSetId;
@@ -36,7 +36,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.tag.update.TagUpdate")
-public class TagUpdate implements Serializable
+public class TagUpdate implements IUpdate
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/create/VocabularyTermCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/create/VocabularyTermCreation.java
index 1242e92d4d6..53c976b6c4b 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/create/VocabularyTermCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/create/VocabularyTermCreation.java
@@ -16,8 +16,7 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.create;
 
-import java.io.Serializable;
-
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.ICreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.IVocabularyId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.IVocabularyTermId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
@@ -26,7 +25,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.vocabulary.create.VocabularyTermCreation")
-public class VocabularyTermCreation implements Serializable
+public class VocabularyTermCreation implements ICreation
 {
     private static final long serialVersionUID = 1L;
 
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/update/VocabularyTermUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/update/VocabularyTermUpdate.java
index 083196382c4..79c20776546 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/update/VocabularyTermUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/update/VocabularyTermUpdate.java
@@ -16,12 +16,11 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.update;
 
-import java.io.Serializable;
-
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.IVocabularyTermId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -29,7 +28,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.vocabulary.update.VocabularyTermUpdate")
-public class VocabularyTermUpdate implements Serializable
+public class VocabularyTermUpdate implements IUpdate
 {
     private static final long serialVersionUID = 1L;
 
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 724e7e3bbc3..e05445f9faf 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
@@ -1148,4 +1148,6 @@ get Added
 get Removed
 get Set
 I Material Properties Holder
-set Material Property
\ No newline at end of file
+set Material Property
+I Creation
+I Update
\ No newline at end of file
-- 
GitLab