diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index 6ed10c2de27e307398ba643eb283e122556f44f7..1ec39f567665bbb4df6a9ab510bcb51db3d915cc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -712,7 +712,7 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     /**
      * @see ICommonClientService#removePersonsFromAuthorizationGroup(TechId, List)
      */
-    public void removePersonsFromAuthorizationGroup(TechId create, List<String> extractCodes,
+    public void removePersonsFromAuthorizationGroup(TechId create, List<String> personsCodes,
             AsyncCallback<Void> callback);
 
     // -- custom grid filters
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java
index ad41660b43c04c7b95b7bdf39f17bbe2aaa29c7f..5b6826116b8767164efe119722f8dba8688a45cb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java
@@ -39,17 +39,17 @@ abstract public class CodesArea<T extends ICodeHolder> extends MultilineVarcharF
     public final void setCodeProviders(List<T> codeProviders)
     {
         List<String> codes = Code.extractCodes(codeProviders);
-        setCodes(codes.toArray(new String[0]));
+        setCodes(codes);
     }
 
-    public final void setCodes(String[] codes)
+    public final void setCodes(List<String> codes)
     {
         String textValue = createTextValue(codes);
         setValue(textValue);
         setOriginalValue(textValue);
     }
 
-    private static String createTextValue(String[] codes)
+    private static String createTextValue(List<String> codes)
     {
         StringBuffer sb = new StringBuffer();
         for (String code : codes)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java
index e384547dd749cfef25d046877574ae0312f0bfa5..0026f969a8240e775fd18f67ba2fb7fdf7ce1383 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java
@@ -37,7 +37,7 @@ public final class DataSetParentsArea extends CodesArea<ExternalData>
     public DataSetParentsArea(IMessageProvider messageProvider, String idPrefix)
     {
         super(messageProvider.getMessage(Dict.PARENTS_EMPTY));
-		this.setFieldLabel(messageProvider.getMessage(Dict.PARENTS));
+        this.setFieldLabel(messageProvider.getMessage(Dict.PARENTS));
         setId(createId(idPrefix));
     }
 
@@ -60,7 +60,7 @@ public final class DataSetParentsArea extends CodesArea<ExternalData>
         setCodeProviders(parents);
     }
 
-    public final void setParentCodes(String[] parentCodes)
+    public final void setParentCodes(List<String> parentCodes)
     {
         setCodes(parentCodes);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Code.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Code.java
index 964f1f39467c60659163b0c1c2cdc7aa8d0f4bca..db5d97ccdf697ec7df539dcbe20ead4ff700aef8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Code.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Code.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.List;
 
@@ -102,7 +103,7 @@ public class Code<T extends Code<T>> implements IsSerializable, ICodeHolder, Com
     // Helper classes
     //
 
-    public final static List<String> extractCodes(List<? extends ICodeHolder> codeProviders)
+    public final static List<String> extractCodes(Collection<? extends ICodeHolder> codeProviders)
     {
         List<String> codes = new ArrayList<String>();
         for (ICodeHolder codeProvider : codeProviders)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetUpdateResult.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetUpdateResult.java
index f9747e870392a9d4814929d5966fa4f76a4bb0c9..93383b060dcd5cfa3411491f3ec22270eba14b3d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetUpdateResult.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DataSetUpdateResult.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
@@ -32,7 +33,7 @@ public class DataSetUpdateResult implements IsSerializable, Serializable
 
     Date modificationDate;
 
-    String[] parentCodes;
+    List<String> parentCodes;
 
     public DataSetUpdateResult()
     {
@@ -48,12 +49,12 @@ public class DataSetUpdateResult implements IsSerializable, Serializable
         this.modificationDate = modificationDate;
     }
 
-    public String[] getParentCodes()
+    public List<String> getParentCodes()
     {
         return parentCodes;
     }
 
-    public void setParentCodes(String[] parentCodes)
+    public void setParentCodes(List<String> parentCodes)
     {
         this.parentCodes = parentCodes;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExperimentUpdateResult.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExperimentUpdateResult.java
index 9e46768454df687005e079f95df89676611bc753..ad70b021221a9b2a86a1ae062df471f8848eeca2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExperimentUpdateResult.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExperimentUpdateResult.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
@@ -32,7 +33,7 @@ public class ExperimentUpdateResult implements IsSerializable, Serializable
 
     private Date modificationDate;
 
-    private String[] samples;
+    private List<String> samples;
 
     public ExperimentUpdateResult()
     {
@@ -48,12 +49,12 @@ public class ExperimentUpdateResult implements IsSerializable, Serializable
         this.modificationDate = modificationDate;
     }
 
-    public String[] getSamples()
+    public List<String> getSamples()
     {
         return samples;
     }
 
-    public void setSamples(String[] samples)
+    public void setSamples(List<String> samples)
     {
         this.samples = samples;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SampleUpdateResult.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SampleUpdateResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..11e9b3773a291778bf2b2d1017a915d7f64cd97f
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SampleUpdateResult.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2009 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.dto;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
+
+/**
+ * Stores result of sample update.
+ * 
+ * @author Piotr Buczek
+ */
+public class SampleUpdateResult implements IsSerializable, Serializable
+{
+    private static final long serialVersionUID = ServiceVersionHolder.VERSION;
+
+    private Date modificationDate;
+
+    private List<String> parents;
+
+    public SampleUpdateResult()
+    {
+    }
+
+    public Date getModificationDate()
+    {
+        return modificationDate;
+    }
+
+    public void setModificationDate(Date modificationDate)
+    {
+        this.modificationDate = modificationDate;
+    }
+
+    public List<String> getParents()
+    {
+        return parents;
+    }
+
+    public void setParents(List<String> parents)
+    {
+        this.parents = parents;
+    }
+
+    public void copyFrom(SampleUpdateResult result)
+    {
+        setParents(result.getParents());
+        setModificationDate(result.getModificationDate());
+    }
+
+}
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 f8cca9d9b23d7a5d4427f24cd06b788db4b514ca..56f70c98432c95f6588f622901a759972af65437 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
@@ -59,6 +59,7 @@ import org.hibernate.validator.Pattern;
 import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.common.collections.UnmodifiableSetDecorator;
 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.IIdentifierHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
@@ -78,7 +79,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 @Inheritance(strategy = InheritanceType.JOINED)
 @Friend(toClasses = EventPE.class)
 public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements IEntityPropertiesHolder,
-        IEntityInformationHolderDTO, IIdentifierHolder
+        IEntityInformationHolderDTO, IIdentifierHolder, ICodeHolder
 {
     private static final long serialVersionUID = IServer.VERSION;
 
@@ -494,4 +495,4 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements IEntityPr
     {
         return getCode();
     }
-}
+}
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java
index 95e694112aa411a4f1041bf2a8f78601934b8b9d..dc74bd66471c812db994d88bfdc60af78ffb4fc0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java
@@ -38,6 +38,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleUpdateResult;
 
 /**
  * Service interface for the generic GWT client.
@@ -128,7 +129,7 @@ public interface IGenericClientService extends IClientService
     /**
      * Updates sample.
      */
-    public Date updateSample(SampleUpdates updates) throws UserFailureException;
+    public SampleUpdateResult updateSample(SampleUpdates updates) throws UserFailureException;
 
     /**
      * Updates data set.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java
index 4331819ee73e9926038ad0f36daaec2f0ade5ac3..2826303cacd3b31ce5f152694a1b6d1bf37fe28b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java
@@ -40,6 +40,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleUpdateResult;
 
 /**
  * Asynchronous version of {@link IGenericClientService}.
@@ -120,8 +121,8 @@ public interface IGenericClientServiceAsync extends IClientServiceAsync
     /**
      * @see IGenericClientService#updateSample(SampleUpdates)
      */
-    public void updateSample(SampleUpdates updates, final AsyncCallback<Date> asyncCallback)
-            throws UserFailureException;
+    public void updateSample(SampleUpdates updates,
+            final AsyncCallback<SampleUpdateResult> asyncCallback) throws UserFailureException;
 
     /**
      * @see IGenericClientService#updateDataSet(DataSetUpdates)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java
index 1a6b8e240af4583b7b2727383cb5dac2c28c1d60..86e9d315a157ddcbdf83e925b87c6812ff6188e4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java
@@ -184,7 +184,7 @@ public final class GenericDataSetEditForm extends
         }
     }
 
-    private void updateOriginalValues(String[] parentCodes)
+    private void updateOriginalValues(List<String> parentCodes)
     {
         updatePropertyFieldsOriginalValues();
         sampleChooser.updateOriginalValue();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java
index 6ceae1d005e9adf774a5fc2229339094ebacc7e1..cf74efb6458c051e849dfb98e7a4799726c9e9aa 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment;
 
+import java.util.List;
+
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
@@ -123,7 +125,7 @@ public final class GenericExperimentEditForm extends AbstractGenericExperimentRe
 
     }
 
-    public void updateOriginalValues(String[] samples)
+    public void updateOriginalValues(List<String> samples)
     {
         updatePropertyFieldsOriginalValues();
         updateFieldOriginalValue(projectChooser);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
index e39feb2386ff93f23e5259b5edf8e9451f27db2f..dc62f5740f3649dd426ff70aaf80d0e9044fc62a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample;
 
-import java.util.Date;
 import java.util.List;
 
 import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
@@ -33,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 
@@ -75,7 +75,7 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd
     }
 
     private final class UpdateSampleCallback extends
-            AbstractRegistrationForm.AbstractRegistrationCallback<Date>
+            AbstractRegistrationForm.AbstractRegistrationCallback<SampleUpdateResult>
     {
 
         UpdateSampleCallback(final IViewContext<?> viewContext)
@@ -84,28 +84,28 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd
         }
 
         @Override
-        protected void process(final Date result)
+        protected void process(final SampleUpdateResult result)
         {
-            originalSample.setModificationDate(result);
-            updateOriginalValues();
+            originalSample.setModificationDate(result.getModificationDate());
+            updateOriginalValues(result.getParents());
             super.process(result);
         }
 
         @Override
-        protected String createSuccessfullRegistrationInfo(Date result)
+        protected String createSuccessfullRegistrationInfo(SampleUpdateResult result)
         {
             return "Sample successfully updated";
         }
     }
 
-    public void updateOriginalValues()
+    public void updateOriginalValues(List<String> parents)
     {
         updatePropertyFieldsOriginalValues();
         experimentField.updateOriginalValue();
         updateFieldOriginalValue(groupSelectionWidget);
         container.updateOriginalValue();
         parent.updateOriginalValue();
-        updateFieldOriginalValue(parentsArea);
+        parentsArea.setSampleCodes(parents);
     }
 
     private void setOriginalSample(Sample sample)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java
index 49f6d4405bf6a5588d0badf0ad5dad8779dda4b8..2354cbaa0bb2f0c25dff1c04bcfc187800f7e983 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java
@@ -47,7 +47,7 @@ abstract public class SamplesArea extends CodesArea<Sample>
         setCodeProviders(samples);
     }
 
-    public final void setSampleCodes(String[] codes)
+    public final void setSampleCodes(List<String> codes)
     {
         setCodes(codes);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
index d94c67b5d2045a1e6a331267849cd9d15c1dd8dc..7ccdaa4edc324044bb06e776e2e1f004c47533a3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
@@ -58,6 +58,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
@@ -319,11 +320,11 @@ public class GenericClientService extends AbstractClientService implements IGene
         }
     }
 
-    public Date updateSample(final SampleUpdates updates)
+    public SampleUpdateResult updateSample(final SampleUpdates updates)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         final String sessionToken = getSessionToken();
-        final Date modificationDate = new Date();
+        final SampleUpdateResult result = new SampleUpdateResult();
         new AttachmentRegistrationHelper()
             {
                 @Override
@@ -344,17 +345,17 @@ public class GenericClientService extends AbstractClientService implements IGene
                                 new SampleIdentifierFactory(updates.getSampleIdentifier())
                                         .createIdentifier();
                     }
-                    Date date =
+                    SampleUpdateResult updateResult =
                             genericServer.updateSample(sessionToken, new SampleUpdatesDTO(updates
                                     .getSampleIdOrNull(), updates.getProperties(),
                                     convExperimentIdentifierOrNull, attachments, updates
                                             .getVersion(), sampleOwner, updates
                                             .getParentIdentifierOrNull(), updates
                                             .getContainerIdentifierOrNull()));
-                    modificationDate.setTime(date.getTime());
+                    result.copyFrom(updateResult);
                 }
             }.process(updates.getSessionKey(), getHttpSession(), updates.getAttachments());
-        return modificationDate;
+        return result;
     }
 
     public Date updateMaterial(TechId materialId, List<IEntityProperty> properties, Date version)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index 4663d99cf6f6c9952d65d464f56abee1b34127fc..105979dc8b67521b312f28c5705aa8fa69d4ddf6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -55,6 +55,7 @@ import ch.systemsx.cisd.openbis.generic.server.plugin.ISampleTypeSlaveServerPlug
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentWithContent;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
@@ -74,9 +75,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleBatchUpdateDetails;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.UpdatedSample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.CodeConverter;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
@@ -304,12 +305,12 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         public void execute(List<NewSample> newSamples)
         {
             List<Sample> existingSamples = new ArrayList<Sample>();
-            List<String> extractCodes = SampleRegisterOrUpdateUtil.extractCodes(newSamples, false);
+            List<String> codes = SampleRegisterOrUpdateUtil.extractCodes(newSamples, false);
             List<Sample> list =
                     sampleLister.list(SampleRegisterOrUpdateUtil
-                            .createListSamplesByCodeCriteria(extractCodes));
+                            .createListSamplesByCodeCriteria(codes));
             existingSamples.addAll(list);
-            List<String> codes = SampleRegisterOrUpdateUtil.extractCodes(newSamples, true);
+            codes = SampleRegisterOrUpdateUtil.extractCodes(newSamples, true);
             ListOrSearchSampleCriteria criteria =
                     SampleRegisterOrUpdateUtil.createListSamplesByCodeCriteria(codes);
             List<Sample> existingContainers = sampleLister.list(criteria);
@@ -657,23 +658,10 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         ExperimentUpdateResult result = new ExperimentUpdateResult();
         ExperimentPE experiment = experimentBO.getExperiment();
         result.setModificationDate(experiment.getModificationDate());
-        result.setSamples(extractSampleCodes(experiment.getSamples()));
+        result.setSamples(Code.extractCodes(experiment.getSamples()));
         return result;
     }
 
-    @Private
-    static final String[] extractSampleCodes(List<SamplePE> samples)
-    {
-        String[] codes = new String[samples.size()];
-        int i = 0;
-        for (SamplePE samplePE : samples)
-        {
-            codes[i] = IdentifierHelper.extractCode(samplePE);
-            i++;
-        }
-        return codes;
-    }
-
     public Date updateMaterial(String sessionToken, TechId materialId,
             List<IEntityProperty> properties, Date version)
     {
@@ -684,13 +672,17 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         return materialBO.getMaterial().getModificationDate();
     }
 
-    public Date updateSample(String sessionToken, SampleUpdatesDTO updates)
+    public SampleUpdateResult updateSample(String sessionToken, SampleUpdatesDTO updates)
     {
         final Session session = getSession(sessionToken);
         final ISampleBO sampleBO = businessObjectFactory.createSampleBO(session);
         sampleBO.update(updates);
         sampleBO.save();
-        return sampleBO.getSample().getModificationDate();
+        SampleUpdateResult result = new SampleUpdateResult();
+        SamplePE sample = sampleBO.getSample();
+        result.setModificationDate(sample.getModificationDate());
+        result.setParents(Code.extractCodes(sample.getParents()));
+        return result;
     }
 
     public DataSetUpdateResult updateDataSet(String sessionToken, DataSetUpdatesDTO updates)
@@ -701,23 +693,10 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         DataSetUpdateResult result = new DataSetUpdateResult();
         ExternalDataPE externalData = dataSetBO.getExternalData();
         result.setModificationDate(externalData.getModificationDate());
-        result.setParentCodes(extractDataSetCodes(externalData.getParents()));
+        result.setParentCodes(Code.extractCodes(externalData.getParents()));
         return result;
     }
 
-    @Private
-    static final String[] extractDataSetCodes(Collection<DataPE> dataSets)
-    {
-        String[] codes = new String[dataSets.size()];
-        int i = 0;
-        for (DataPE dataPE : dataSets)
-        {
-            codes[i] = dataPE.getCode();
-            i++;
-        }
-        return codes;
-    }
-
     public void registerOrUpdateMaterials(String sessionToken, String materialTypeCode,
             List<NewMaterial> materials)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java
index 9e9dfb7580c0aec1c6d5a534410bfb18f50f1018..10e0c04ced8cc0643b6404947dad286d6678f4db 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java
@@ -41,6 +41,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSamplesWithTypes;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
@@ -164,7 +165,7 @@ final class GenericServerLogger extends AbstractServerLogger implements IGeneric
         return null;
     }
 
-    public Date updateSample(String sessionToken, SampleUpdatesDTO updates)
+    public SampleUpdateResult updateSample(String sessionToken, SampleUpdatesDTO updates)
     {
         logTracking(sessionToken, "edit_sample",
                 "SAMPLE(%s), CHANGE_TO_EXPERIMENT(%s) ATTACHMENTS(%s)",
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java
index edd520597c0605d6d166d61a4bc9ca0482d7146f..262c53d20f20625db744157f217a0390f507fc5e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java
@@ -55,6 +55,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSamplesWithTypes;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
@@ -230,7 +231,7 @@ public interface IGenericServer extends IServer
     @Transactional
     @RolesAllowed(RoleWithHierarchy.SPACE_USER)
     @DatabaseUpdateModification(value = ObjectKind.SAMPLE)
-    public Date updateSample(String sessionToken,
+    public SampleUpdateResult updateSample(String sessionToken,
             @AuthorizationGuard(guardClass = SampleUpdatesPredicate.class) SampleUpdatesDTO updates);
 
     /**
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
index 33f870878bea9ed3f7389a09de329eb95ddebb40..5af5293e5b9da5466af85d32f6daeb17fbd4c65e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
@@ -477,8 +477,7 @@ public final class GenericServerTest extends AbstractServerTestCase
             });
         ExperimentUpdateResult result = createServer().updateExperiment(SESSION_TOKEN, updates);
         assertEquals(newModificationDate, result.getModificationDate());
-        assertEquals(GenericServer.extractSampleCodes(newSamples).length,
-                result.getSamples().length);
+        assertEquals(newSamples.size(), result.getSamples().size());
         context.assertIsSatisfied();
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java.expected
index edd520597c0605d6d166d61a4bc9ca0482d7146f..262c53d20f20625db744157f217a0390f507fc5e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java.expected
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java.expected
@@ -55,6 +55,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSamplesWithTypes;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
@@ -230,7 +231,7 @@ public interface IGenericServer extends IServer
     @Transactional
     @RolesAllowed(RoleWithHierarchy.SPACE_USER)
     @DatabaseUpdateModification(value = ObjectKind.SAMPLE)
-    public Date updateSample(String sessionToken,
+    public SampleUpdateResult updateSample(String sessionToken,
             @AuthorizationGuard(guardClass = SampleUpdatesPredicate.class) SampleUpdatesDTO updates);
 
     /**