diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index abc1d26bb66711d30bfe923cb0aa643e75100d2f..107ecdf97707456dafe64522da753ab7ac859b41 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client;
 
+import java.util.Date;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
@@ -261,9 +262,9 @@ public interface ICommonClientService extends IClientService
             throws UserFailureException;
 
     /**
-     * Assumes that preparation of the export ({@link #prepareExportSamples(TableExportCriteria)} or
-     * {@link #prepareExportExperiments(TableExportCriteria)} has been invoked before and returned
-     * with an exportDataKey passed here as a parameter.
+     * Assumes that preparation of the export ({@link #prepareExportSamples(TableExportCriteria)}
+     * or {@link #prepareExportExperiments(TableExportCriteria)} has been invoked before and
+     * returned with an exportDataKey passed here as a parameter.
      */
     public String getExportTable(String exportDataKey, String lineSeparator)
             throws UserFailureException;
@@ -350,20 +351,21 @@ public interface ICommonClientService extends IClientService
      * Updates experiment.
      */
     public void updateExperiment(String attachmentSessionKey, final String experimentIdentifier,
-            List<ExperimentProperty> properties, String newProjectIdentifier)
+            List<ExperimentProperty> properties, String newProjectIdentifier, Date version)
             throws UserFailureException;
 
     /**
      * Updates material.
      */
-    public void updateMaterial(final String materialIdentifier, List<MaterialProperty> properties)
-            throws UserFailureException;
+    public void updateMaterial(final String materialIdentifier, List<MaterialProperty> properties,
+            Date version) throws UserFailureException;
 
     /**
      * Updates sample.
      */
     public void updateSample(final String sampleIdentifier, List<SampleProperty> properties,
-            ExperimentIdentifier experimentIdentifierOrNull) throws UserFailureException;
+            ExperimentIdentifier experimentIdentifierOrNull, Date version)
+            throws UserFailureException;
 
     /** Deletes the specified data sets. */
     public void deleteDataSets(List<String> dataSetCodes, String reason)
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 2111ef79d10f9961e547d059fdc6abc19d375285..4abd04d10c62da42f9c13d85a1e36b595c0fc727 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
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client;
 
+import java.util.Date;
 import java.util.List;
 
 import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -303,24 +304,23 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
             final AsyncCallback<Void> asyncCallback);
 
     /**
-     * @see ICommonClientService#updateExperiment(String, String, List,String)
+     * @see ICommonClientService#updateExperiment(String, String, List, String, Date)
      */
     public void updateExperiment(String attachmentSessionKey, final String experimentIdentifier,
-            List<ExperimentProperty> properties, String newProjectIdentifier,
+            List<ExperimentProperty> properties, String newProjectIdentifier, Date version,
             final AsyncCallback<Void> asyncCallback) throws UserFailureException;
 
     /**
-     * @see ICommonClientService#updateMaterial(String, List)
+     * @see ICommonClientService#updateMaterial(String, List, Date)
      */
     public void updateMaterial(final String materialIdentifier, List<MaterialProperty> properties,
-            final AsyncCallback<Void> asyncCallback) throws UserFailureException;
+            Date version, final AsyncCallback<Void> asyncCallback) throws UserFailureException;
 
     /**
-     * @see ICommonClientService#updateSample(String, List, ExperimentIdentifier)
+     * @see ICommonClientService#updateSample(String, List, ExperimentIdentifier, Date)
      */
     public void updateSample(final String sampleIdentifier, List<SampleProperty> properties,
-            ExperimentIdentifier experimentIdentifierOrNull, final AsyncCallback<Void> asyncCallback)
-            throws UserFailureException;
+            ExperimentIdentifier experimentIdentifierOrNull, Date version, final AsyncCallback<Void> asyncCallback) throws UserFailureException;
 
     /** @see ICommonClientService#deleteDataSets(List, String) */
     public void deleteDataSets(List<String> dataSetCodes, String reason,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
index ef6a1244263302e96f4e6ac28f9f8f3b06ad22ff..06d8bb143d55bb14cbefa0b36c531c0f45ab0124 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
@@ -64,6 +64,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentTypePropertyT
  */
 public class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment, ExperimentModel>
 {
+    public static final String ID_SUFFIX_EDIT_BUTTON = "_edit-button";
+
     private static final String PREFIX = "experiment-browser";
 
     public static final String BROWSER_ID = GenericConstants.ID_PREFIX + PREFIX;
@@ -125,6 +127,7 @@ public class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment, Exper
         this.topToolbar.add(new SeparatorToolItem());
         String editTitle = viewContext.getMessage(Dict.BUTTON_EDIT);
         Button editButton = createSelectedItemButton(editTitle, asShowEntityInvoker(true));
+        editButton.setId(GRID_ID + ID_SUFFIX_EDIT_BUTTON);
         this.topToolbar.add(new AdapterToolItem(editButton));
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index eed4624d838bb9c2e801acc41cb4aa541435fe73..fd152a2624914fae8f0ba4641f085976bc20c544 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -21,6 +21,7 @@ import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DAT
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 
 import javax.servlet.http.HttpSession;
@@ -974,7 +975,7 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     public void updateExperiment(String sessionKey, String experimentIdentifier,
-            List<ExperimentProperty> properties, String newProjectIdentifier)
+            List<ExperimentProperty> properties, String newProjectIdentifier, Date version)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
 
@@ -999,7 +1000,8 @@ public final class CommonClientService extends AbstractClientService implements
                     new ExperimentIdentifierFactory(experimentIdentifier).createIdentifier();
             final ProjectIdentifier project =
                     new ProjectIdentifierFactory(newProjectIdentifier).createIdentifier();
-            commonServer.editExperiment(sessionToken, identifier, properties, attachments, project);
+            commonServer.editExperiment(sessionToken, identifier, properties, attachments, project,
+                    version);
         } catch (final UserFailureException e)
         {
             throw UserFailureExceptionTranslator.translate(e);
@@ -1030,7 +1032,8 @@ public final class CommonClientService extends AbstractClientService implements
         }
     }
 
-    public void updateMaterial(String materialIdentifier, List<MaterialProperty> properties)
+    public void updateMaterial(String materialIdentifier, List<MaterialProperty> properties,
+            Date version)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         try
@@ -1038,7 +1041,7 @@ public final class CommonClientService extends AbstractClientService implements
             final String sessionToken = getSessionToken();
             final MaterialIdentifier identifier =
                     MaterialIdentifier.tryParseIdentifier(materialIdentifier);
-            commonServer.editMaterial(sessionToken, identifier, properties);
+            commonServer.editMaterial(sessionToken, identifier, properties, version);
         } catch (final ch.systemsx.cisd.common.exceptions.UserFailureException e)
         {
             throw UserFailureExceptionTranslator.translate(e);
@@ -1046,10 +1049,7 @@ public final class CommonClientService extends AbstractClientService implements
 
     }
 
-    public void updateSample(
-            String sampleIdentifier,
-            List<SampleProperty> properties,
-            ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier experimentIdentifierOrNull)
+    public void updateSample(String sampleIdentifier, List<SampleProperty> properties,ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier experimentIdentifierOrNull, Date  version)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         try
@@ -1065,7 +1065,7 @@ public final class CommonClientService extends AbstractClientService implements
                                 .createBean(ExperimentIdentifier.class, experimentIdentifierOrNull);
             }
             commonServer.editSample(sessionToken, identifier, properties,
-                    convExperimentIdentifierOrNull);
+                    convExperimentIdentifierOrNull,version);
         } catch (final ch.systemsx.cisd.common.exceptions.UserFailureException e)
         {
             throw UserFailureExceptionTranslator.translate(e);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 38ec5f23137e68ca88a3c8a587297ac105efe56f..80552c80026bc40a42506ede33582db66faccb96 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -643,7 +644,7 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements
 
     public void editExperiment(String sessionToken, ExperimentIdentifier identifier,
             List<ExperimentProperty> properties, List<AttachmentPE> attachments,
-            ProjectIdentifier newProjectIdentifier)
+            ProjectIdentifier newProjectIdentifier, Date version)
     {
         final Session session = getSessionManager().getSession(sessionToken);
         if (newProjectIdentifier.equals(identifier) == false)
@@ -653,7 +654,7 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements
         }
 
         final IExperimentBO experimentBO = businessObjectFactory.createExperimentBO(session);
-        experimentBO.edit(identifier, properties, attachments, newProjectIdentifier);
+        experimentBO.edit(identifier, properties, attachments, newProjectIdentifier, version);
         experimentBO.save();
     }
 
@@ -679,8 +680,7 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements
         final List<SamplePE> samples = sampleTable.getSamples();
         if (samples.size() > 0)
         {
-            checkExperimentGroupMatches(samples.get(0).getSampleIdentifier(),
-                    newProjectIdentifier);
+            checkExperimentGroupMatches(samples.get(0).getSampleIdentifier(), newProjectIdentifier);
         }
     }
 
@@ -708,21 +708,22 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements
     }
 
     public void editMaterial(String sessionToken, MaterialIdentifier identifier,
-            List<MaterialProperty> properties)
+            List<MaterialProperty> properties, Date version)
     {
         final Session session = getSessionManager().getSession(sessionToken);
         final IMaterialBO materialBO = businessObjectFactory.createMaterialBO(session);
-        materialBO.edit(identifier, properties);
+        materialBO.edit(identifier, properties, version);
         materialBO.save();
 
     }
 
     public void editSample(String sessionToken, SampleIdentifier identifier,
-            List<SampleProperty> properties, ExperimentIdentifier experimentIdentifierOrNull)
+            List<SampleProperty> properties, ExperimentIdentifier experimentIdentifierOrNull,
+            Date version)
     {
         final Session session = getSessionManager().getSession(sessionToken);
         final ISampleBO sampleBO = businessObjectFactory.createSampleBO(session);
-        sampleBO.edit(identifier, properties, experimentIdentifierOrNull);
+        sampleBO.edit(identifier, properties, experimentIdentifierOrNull, version);
         sampleBO.save();
 
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index 11cbffd165f02207c84dc00ae7e31666e7d5e1b4..df7dca9dacd7a22b519a4d98b69924cbccbb8484 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.server;
 
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 
 import ch.systemsx.cisd.authentication.ISessionManager;
@@ -313,7 +314,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
 
     public void editExperiment(String sessionToken, ExperimentIdentifier experimentIdentifier,
             List<ExperimentProperty> properties, List<AttachmentPE> attachments,
-            ProjectIdentifier newProjectIdentifierOrNull)
+            ProjectIdentifier newProjectIdentifierOrNull, Date version)
     {
         logTracking(sessionToken, "edit_experiment",
                 "EXPERIMENT(%s) ATTACHMENTS_ADDED(%s) NEW_PROJECT(%s)", experimentIdentifier,
@@ -326,14 +327,15 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     public void editMaterial(String sessionToken, MaterialIdentifier identifier,
-            List<MaterialProperty> properties)
+            List<MaterialProperty> properties, Date version)
     {
         logTracking(sessionToken, "edit_material", "MATERIAL(%s)", identifier);
 
     }
 
     public void editSample(String sessionToken, SampleIdentifier identifier,
-            List<SampleProperty> properties, ExperimentIdentifier experimentIdentifierOrNull)
+            List<SampleProperty> properties, ExperimentIdentifier experimentIdentifierOrNull,
+            Date version)
     {
         logTracking(sessionToken, "edit_sample", "SAMPLE(%s), CHANGE_TO_EXPERIMENT(%S)",
                 identifier, experimentIdentifierOrNull);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
index 6a131248e6d66704a4627d93ed76ed52c1a59077..9d7c58a81581ada03a916465fe91b07aca76c164 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
@@ -292,9 +293,13 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
     }
 
     public void edit(ExperimentIdentifier identifier, List<ExperimentProperty> properties,
-            List<AttachmentPE> newAttachments, ProjectIdentifier newProjectIdentifier)
+            List<AttachmentPE> newAttachments, ProjectIdentifier newProjectIdentifier, Date version)
     {
         loadByExperimentIdentifier(identifier);
+        if (experiment.getModificationDate().equals(version) == false)
+        {
+            throw new UserFailureException("Experiment has been modified in the meantime.");
+        }
         updateProperties(properties);
         updateProject(newProjectIdentifier);
         for (AttachmentPE a : newAttachments)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java
index 0cbef8d614a9edef26e01a4d29a7c778f3a75587..f67c5ba25d0b7e6e814b397a888822ea0b197f35 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
+import java.util.Date;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentProperty;
@@ -65,5 +66,5 @@ public interface IExperimentBO extends IBusinessObject
      * Changes given experiment. Currently allowed changes: properties.
      */
     public void edit(ExperimentIdentifier identifier, List<ExperimentProperty> properties,
-            List<AttachmentPE> attachments, ProjectIdentifier newProjectIdentifier);
+            List<AttachmentPE> attachments, ProjectIdentifier newProjectIdentifier, Date version);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMaterialBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMaterialBO.java
index 8db93a800de03bd7121742448bf006b05e47d197..3ce9f521daa600f2c227bd5836b533c363f9a9cf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMaterialBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMaterialBO.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
+import java.util.Date;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
@@ -36,5 +37,5 @@ public interface IMaterialBO extends IBusinessObject
     /**
      * Changes given material. Currently allowed changes: properties.
      */
-    public void edit(MaterialIdentifier identifier, List<MaterialProperty> properties);
+    public void edit(MaterialIdentifier identifier, List<MaterialProperty> properties, Date version);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleBO.java
index a97f35aa122558990c5331f06ed76d203ec385b6..e2700c022c216bf42325af50dc8a8e262fadda97 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleBO.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
+import java.util.Date;
 import java.util.List;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
@@ -82,5 +83,5 @@ public interface ISampleBO
      * sample is connected.
      */
     void edit(SampleIdentifier identifier, List<SampleProperty> properties,
-            ExperimentIdentifier experimentIdentifierOrNull);
+            ExperimentIdentifier experimentIdentifierOrNul, Date version);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java
index 4d006a2d9ae494bbb3a214e76df98c7add700c23..13af410ca16fb3cfb6faaa423c4a4537b6ad9514 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import org.springframework.dao.DataAccessException;
@@ -99,9 +100,13 @@ public final class MaterialBO extends AbstractBusinessObject implements IMateria
         }
     }
 
-    public void edit(MaterialIdentifier identifier, List<MaterialProperty> properties)
+    public void edit(MaterialIdentifier identifier, List<MaterialProperty> properties, Date version)
     {
         loadByMaterialIdentifier(identifier);
+        if (material.getModificationDate().equals(version) == false)
+        {
+            throw new UserFailureException("Material has been modified in the meantime.");
+        }
         updateProperties(properties);
         dataChanged = true;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
index d32d095ef768933c9f15b7957a01a86cc456d361..99bee89142260ef59f87c4daba32f0e780d2afed 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import org.springframework.dao.DataAccessException;
@@ -198,9 +199,13 @@ public final class SampleBO extends AbstractSampleBusinessObject implements ISam
     }
 
     public void edit(SampleIdentifier identifier, List<SampleProperty> properties,
-            ExperimentIdentifier experimentIdentifierOrNull)
+            ExperimentIdentifier experimentIdentifierOrNull, Date version)
     {
         loadBySampleIdentifier(identifier);
+        if (sample.getModificationDate().equals(version) == false)
+        {
+            throw new UserFailureException("Sample has been modified in the meantime.");
+        }
         updateProperties(properties);
         updateExperiment(experimentIdentifierOrNull);
         dataChanged = true;
@@ -265,7 +270,7 @@ public final class SampleBO extends AbstractSampleBusinessObject implements ISam
     {
         if (validProcedureOrNull == null)
         {
-            return (newExperimentOrNull == null);
+            return newExperimentOrNull == null;
         } else
         {
             if (newExperimentOrNull == null)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index f8a3ac82ac667964ec48c112c388abcc3352716d..ddc1db0ffef5f4ccf47d472b94f60000e99432b4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.shared;
 
+import java.util.Date;
 import java.util.List;
 
 import org.springframework.transaction.annotation.Transactional;
@@ -132,11 +133,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleSet.GROUP_ADMIN)
-    public void registerGroupRole(
-            String sessionToken,
-            RoleCode roleCode,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) GroupIdentifier identifier,
-            String person);
+    public void registerGroupRole(String sessionToken, RoleCode roleCode,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            GroupIdentifier identifier, String person);
 
     /**
      * Registers a new instance role.
@@ -150,11 +149,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleSet.GROUP_ADMIN)
-    public void deleteGroupRole(
-            String sessionToken,
-            RoleCode roleCode,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) GroupIdentifier groupIdentifier,
-            String person);
+    public void deleteGroupRole(String sessionToken, RoleCode roleCode,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            GroupIdentifier groupIdentifier, String person);
 
     /**
      * Deletes role described by given role code and user id.
@@ -189,10 +186,10 @@ public interface ICommonServer extends IServer
      */
     @Transactional(readOnly = true)
     @RolesAllowed(RoleSet.OBSERVER)
-    public List<ExperimentPE> listExperiments(
-            final String sessionToken,
+    public List<ExperimentPE> listExperiments(final String sessionToken,
             ExperimentTypePE experimentType,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier project);
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            ProjectIdentifier project);
 
     /**
      * For given {@link SampleIdentifier} returns the corresponding list of {@link ExternalDataPE}.
@@ -201,9 +198,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional(readOnly = true)
     @RolesAllowed(RoleSet.OBSERVER)
-    public List<ExternalDataPE> listExternalData(
-            final String sessionToken,
-            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) final SampleIdentifier identifier);
+    public List<ExternalDataPE> listExternalData(final String sessionToken,
+            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
+            final SampleIdentifier identifier);
 
     /**
      * For given {@link ExperimentIdentifier} returns the corresponding list of
@@ -213,9 +210,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional(readOnly = true)
     @RolesAllowed(RoleSet.OBSERVER)
-    public List<ExternalDataPE> listExternalData(
-            final String sessionToken,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) final ExperimentIdentifier identifier);
+    public List<ExternalDataPE> listExternalData(final String sessionToken,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            final ExperimentIdentifier identifier);
 
     /**
      * Performs an <i>Hibernate Search</i> based on given parameters.
@@ -291,10 +288,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleSet.GROUP_ADMIN)
-    public void registerProject(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier projectIdentifier,
-            String description, String leaderId);
+    public void registerProject(String sessionToken,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            ProjectIdentifier projectIdentifier, String description, String leaderId);
 
     /**
      * Performs an <i>Hibernate Search</i> based on given parameters.
@@ -350,20 +346,20 @@ public interface ICommonServer extends IServer
     @Transactional
     @RolesAllowed(RoleSet.GROUP_ADMIN)
     public void deleteDataSets(String sessionToken,
-            @AuthorizationGuard(guardClass = DataSetCodePredicate.class) List<String> dataSetCodes,
-            String reason);
+            @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
+            List<String> dataSetCodes, String reason);
 
     /**
      * Saves changed experiment.
      */
     @Transactional
     @RolesAllowed(RoleSet.USER)
-    public void editExperiment(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifier,
-            List<ExperimentProperty> properties,
+    public void editExperiment(String sessionToken,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties,
             List<AttachmentPE> attachments,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier newProjectIdentifier);
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            ProjectIdentifier newProjectIdentifier, Date version);
 
     /**
      * Saves changed material.
@@ -371,18 +367,18 @@ public interface ICommonServer extends IServer
     @Transactional
     @RolesAllowed(RoleSet.INSTANCE_ADMIN)
     public void editMaterial(String sessionToken, MaterialIdentifier identifier,
-            List<MaterialProperty> properties);
+            List<MaterialProperty> properties, Date version);
 
     /**
      * Saves changed sample.
      */
     @Transactional
     @RolesAllowed(RoleSet.USER)
-    public void editSample(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) SampleIdentifier identifier,
-            List<SampleProperty> properties,
-            @AuthorizationGuard(guardClass = NullableGroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifierOrNull);
+    public void editSample(String sessionToken,
+            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
+            SampleIdentifier identifier, List<SampleProperty> properties,
+            @AuthorizationGuard(guardClass = NullableGroupIdentifierPredicate.class)
+            ExperimentIdentifier experimentIdentifierOrNull, Date version);
 
     /** Lists vocabulary terms of a given vocabulary. Includes terms usage statistics. */
     @Transactional
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 da5ec1b2e60c315920805bd7ae3e655af959432f..c1aba1aec3147c5bdb0f088ab093353c1488d54d 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
@@ -130,7 +130,8 @@ public final class GenericExperimentEditForm
         final List<ExperimentProperty> properties = extractProperties();
         final String newProjectIdentifier = extractIdentifier();
         viewContext.getCommonService().updateExperiment(sessionKey, entity.getIdentifier(),
-                properties, newProjectIdentifier, new RegisterExperimentCallback(viewContext));
+                properties, newProjectIdentifier, entity.getModificationDate(),
+                new RegisterExperimentCallback(viewContext));
     }
 
     private String extractIdentifier()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java
index 012e5398448b81c56774c10bffb59d5f93c78389..a7a8b045d893519d8e7276f6365b9caa12989575 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java
@@ -62,7 +62,7 @@ public final class GenericMaterialEditForm
     {
         final List<MaterialProperty> properties = extractProperties();
         viewContext.getCommonService().updateMaterial(entity.getIdentifier(), properties,
-                new RegisterMaterialCallback(viewContext));
+                entity.getModificationDate(), new RegisterMaterialCallback(viewContext));
     }
 
     public final class RegisterMaterialCallback extends AbstractAsyncCallback<Void>
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 4716d657e82ea95199b9cf7538aab990b815e48d..4f4040fd3941b003b6256851667bc036b2ff1f0e 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
@@ -87,7 +87,8 @@ public final class GenericSampleEditForm
     {
         final List<SampleProperty> properties = extractProperties();
         viewContext.getCommonService().updateSample(entity.getIdentifier(), properties,
-                experimentField.getValue(), new RegisterSampleCallback(viewContext));
+                experimentField.getValue(), entity.getModificationDate(),
+                new RegisterSampleCallback(viewContext));
     }
 
     public final class RegisterSampleCallback extends AbstractAsyncCallback<Void>
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/SystemTestSuite.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/SystemTestSuite.java
index 690073426d2c93c7019ee41b7466600f1bb356a0..6d573cd0e9772e8c3076a15db9fdd627a0abf76a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/SystemTestSuite.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/SystemTestSuite.java
@@ -63,6 +63,7 @@ public class SystemTestSuite extends GWTTestSuite
         // (NS_ERROR_DOM_SECURITY_ERR): Security error on CC
         // testSuite.addTestSuite(GenericExperimentRegistrationTest.class);
         testSuite.addTestSuite(GenericExperimentViewerTest.class);
+        // testSuite.addTestSuite(GenericExperimentEditorTest.class);
         testSuite.addTestSuite(PropertyTypeBrowserTest.class);
         testSuite.addTestSuite(PropertyTypeAssignmentBrowserTest.class);
         testSuite.addTestSuite(EntityTypePropertyTypeAssignmentTest.class);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ShowExperimentEditor.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ShowExperimentEditor.java
new file mode 100644
index 0000000000000000000000000000000000000000..02ebd2c7db0ea66bc53d7cb8a530f67ee2600cbe
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ShowExperimentEditor.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2008 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.client.web.client.application.ui.experiment;
+
+import com.extjs.gxt.ui.client.widget.grid.Grid;
+import com.google.gwt.user.client.ui.Widget;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ExperimentModel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.experiment.CommonExperimentColDefKind;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.util.GridTestUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand;
+import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.GWTTestUtil;
+
+/**
+ * A {@link AbstractDefaultTestCommand} extension for showing a experiment editor.
+ * 
+ * @author Izabela Adamczyk
+ */
+public class ShowExperimentEditor extends AbstractDefaultTestCommand
+{
+    private final String code;
+
+    public ShowExperimentEditor(final String code)
+    {
+        this.code = code;
+    }
+
+    @SuppressWarnings("unchecked")
+    public void execute()
+    {
+        final Widget widget = GWTTestUtil.getWidgetWithID(ExperimentBrowserGrid.GRID_ID);
+        assertTrue(widget instanceof Grid);
+        final Grid<ExperimentModel> table = (Grid<ExperimentModel>) widget;
+        GridTestUtils.fireSingleClick(table, CommonExperimentColDefKind.CODE.id(), code);
+        GWTTestUtil.clickButtonWithID(ExperimentBrowserGrid.GRID_ID
+                + ExperimentBrowserGrid.ID_SUFFIX_EDIT_BUTTON);
+
+    }
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/util/GridTestUtils.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/util/GridTestUtils.java
index 6b038f6d3e836ff05b9b21d4831cc003d59c763a..e76ba012d5c1e8e453e79c4d603efdb9225c292a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/util/GridTestUtils.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/util/GridTestUtils.java
@@ -57,6 +57,17 @@ public class GridTestUtils
         table.fireEvent(Events.CellDoubleClick, event);
     }
 
+    /**
+     * Fires a single click event on a first row which contains given value in a column with a
+     * specified id.
+     */
+    public static <T extends ModelData> void fireSingleClick(final Grid<T> table, String columnId,
+            String columnValue)
+    {
+        GridEvent event = createGridEvent(table, columnId, columnValue);
+        table.fireEvent(Events.CellClick, event);
+    }
+
     private static <T extends ModelData> GridEvent createGridEvent(final Grid<T> table,
             String columnId, String columnValue)
     {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
index 47524694dcc1f3354622a0e9e62bb98c5f97a043..ce865884a9bd4e323bff14999440c743700a886c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 
 import org.jmock.Expectations;
@@ -791,22 +792,22 @@ public final class CommonServerTest extends AbstractServerTestCase
     @Test
     public void testEditMaterialNothingChanged() throws Exception
     {
-        final MaterialIdentifier identifier =
-                new MaterialIdentifier(MATERIAL_1, MATERIAL_TYPE_1);
+        final MaterialIdentifier identifier = new MaterialIdentifier(MATERIAL_1, MATERIAL_TYPE_1);
         final List<MaterialProperty> properties = new ArrayList<MaterialProperty>();
         prepareGetSession();
+        final Date version = new Date();
         context.checking(new Expectations()
             {
                 {
                     one(commonBusinessObjectFactory).createMaterialBO(SESSION);
                     will(returnValue(materialBO));
 
-                    one(materialBO).edit(identifier, properties);
+                    one(materialBO).edit(identifier, properties, version);
                     one(materialBO).save();
 
                 }
             });
-        createServer().editMaterial(SESSION_TOKEN, identifier, properties);
+        createServer().editMaterial(SESSION_TOKEN, identifier, properties, version);
         context.assertIsSatisfied();
     }
 
@@ -818,18 +819,19 @@ public final class CommonServerTest extends AbstractServerTestCase
                         DATABASE_1, GROUP_1)), SAMPLE_1);
         final List<SampleProperty> properties = new ArrayList<SampleProperty>();
         prepareGetSession();
+        final Date version = new Date();
         context.checking(new Expectations()
             {
                 {
                     one(commonBusinessObjectFactory).createSampleBO(SESSION);
                     will(returnValue(sampleBO));
 
-                    one(sampleBO).edit(identifier, properties, null);
+                    one(sampleBO).edit(identifier, properties, null, version);
                     one(sampleBO).save();
 
                 }
             });
-        createServer().editSample(SESSION_TOKEN, identifier, properties, null);
+        createServer().editSample(SESSION_TOKEN, identifier, properties, null, version);
         context.assertIsSatisfied();
     }
 
@@ -843,6 +845,7 @@ public final class CommonServerTest extends AbstractServerTestCase
         final ProjectIdentifier newProjectIdentifier =
                 new ProjectIdentifier(DATABASE_1, GROUP_1, PROJECT_1);
         prepareGetSession();
+        final Date version = new Date();
         context.checking(new Expectations()
             {
                 {
@@ -850,13 +853,13 @@ public final class CommonServerTest extends AbstractServerTestCase
                     will(returnValue(experimentBO));
 
                     one(experimentBO).edit(identifier, properties, attachments,
-                            newProjectIdentifier);
+                            newProjectIdentifier, version);
                     one(experimentBO).save();
 
                 }
             });
         createServer().editExperiment(SESSION_TOKEN, identifier, properties, attachments,
-                newProjectIdentifier);
+                newProjectIdentifier, version);
         context.assertIsSatisfied();
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
index 08d404b56f0a17c90aebf3d8e1c0fcf004fba78c..f06f868779a27c6e3f85659ff37057194c6974ef 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.shared;
 
+import java.util.Date;
 import java.util.List;
 
 import org.springframework.transaction.annotation.Transactional;
@@ -132,11 +133,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleSet.GROUP_ADMIN)
-    public void registerGroupRole(
-            String sessionToken,
-            RoleCode roleCode,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) GroupIdentifier identifier,
-            String person);
+    public void registerGroupRole(String sessionToken, RoleCode roleCode,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            GroupIdentifier identifier, String person);
 
     /**
      * Registers a new instance role.
@@ -150,11 +149,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleSet.GROUP_ADMIN)
-    public void deleteGroupRole(
-            String sessionToken,
-            RoleCode roleCode,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) GroupIdentifier groupIdentifier,
-            String person);
+    public void deleteGroupRole(String sessionToken, RoleCode roleCode,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            GroupIdentifier groupIdentifier, String person);
 
     /**
      * Deletes role described by given role code and user id.
@@ -189,10 +186,10 @@ public interface ICommonServer extends IServer
      */
     @Transactional(readOnly = true)
     @RolesAllowed(RoleSet.OBSERVER)
-    public List<ExperimentPE> listExperiments(
-            final String sessionToken,
+    public List<ExperimentPE> listExperiments(final String sessionToken,
             ExperimentTypePE experimentType,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier project);
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            ProjectIdentifier project);
 
     /**
      * For given {@link SampleIdentifier} returns the corresponding list of {@link ExternalDataPE}.
@@ -201,9 +198,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional(readOnly = true)
     @RolesAllowed(RoleSet.OBSERVER)
-    public List<ExternalDataPE> listExternalData(
-            final String sessionToken,
-            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) final SampleIdentifier identifier);
+    public List<ExternalDataPE> listExternalData(final String sessionToken,
+            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
+            final SampleIdentifier identifier);
 
     /**
      * For given {@link ExperimentIdentifier} returns the corresponding list of
@@ -213,9 +210,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional(readOnly = true)
     @RolesAllowed(RoleSet.OBSERVER)
-    public List<ExternalDataPE> listExternalData(
-            final String sessionToken,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) final ExperimentIdentifier identifier);
+    public List<ExternalDataPE> listExternalData(final String sessionToken,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            final ExperimentIdentifier identifier);
 
     /**
      * Performs an <i>Hibernate Search</i> based on given parameters.
@@ -291,10 +288,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleSet.GROUP_ADMIN)
-    public void registerProject(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier projectIdentifier,
-            String description, String leaderId);
+    public void registerProject(String sessionToken,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            ProjectIdentifier projectIdentifier, String description, String leaderId);
 
     /**
      * Performs an <i>Hibernate Search</i> based on given parameters.
@@ -350,20 +346,20 @@ public interface ICommonServer extends IServer
     @Transactional
     @RolesAllowed(RoleSet.GROUP_ADMIN)
     public void deleteDataSets(String sessionToken,
-            @AuthorizationGuard(guardClass = DataSetCodePredicate.class) List<String> dataSetCodes,
-            String reason);
+            @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
+            List<String> dataSetCodes, String reason);
 
     /**
      * Saves changed experiment.
      */
     @Transactional
     @RolesAllowed(RoleSet.USER)
-    public void editExperiment(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifier,
-            List<ExperimentProperty> properties,
+    public void editExperiment(String sessionToken,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties,
             List<AttachmentPE> attachments,
-            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier newProjectIdentifier);
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            ProjectIdentifier newProjectIdentifier, Date version);
 
     /**
      * Saves changed material.
@@ -371,18 +367,18 @@ public interface ICommonServer extends IServer
     @Transactional
     @RolesAllowed(RoleSet.INSTANCE_ADMIN)
     public void editMaterial(String sessionToken, MaterialIdentifier identifier,
-            List<MaterialProperty> properties);
+            List<MaterialProperty> properties, Date version);
 
     /**
      * Saves changed sample.
      */
     @Transactional
     @RolesAllowed(RoleSet.USER)
-    public void editSample(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) SampleIdentifier identifier,
-            List<SampleProperty> properties,
-            @AuthorizationGuard(guardClass = NullableGroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifierOrNull);
+    public void editSample(String sessionToken,
+            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
+            SampleIdentifier identifier, List<SampleProperty> properties,
+            @AuthorizationGuard(guardClass = NullableGroupIdentifierPredicate.class)
+            ExperimentIdentifier experimentIdentifierOrNull, Date version);
 
     /** Lists vocabulary terms of a given vocabulary. Includes terms usage statistics. */
     @Transactional
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/FillExperimentEditForm.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/FillExperimentEditForm.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c24a981b1cbdd7515124f0b299a68e36a6df852
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/FillExperimentEditForm.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2008 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.plugin.generic.client.web.client.application.experiment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.extjs.gxt.ui.client.widget.form.Field;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.Widget;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ProjectSelectionWidget;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ControlledVocabullaryField.VocabularyList;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand;
+import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.GWTTestUtil;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.PropertyField;
+
+/**
+ * A {@link AbstractDefaultTestCommand} extension for editing experiment.
+ * 
+ * @author Izabela Adamczyk
+ */
+public final class FillExperimentEditForm extends AbstractDefaultTestCommand
+{
+
+    private final String projectNameOrNull;
+
+    private final List<PropertyField> properties;
+
+    public FillExperimentEditForm(final String project)
+    {
+        this.projectNameOrNull = project;
+        this.properties = new ArrayList<PropertyField>();
+        addCallbackClass(ProjectSelectionWidget.ListProjectsCallback.class);
+    }
+
+    public final FillExperimentEditForm addProperty(final PropertyField property)
+    {
+        assert property != null : "Unspecified property";
+        properties.add(property);
+        return this;
+    }
+
+    //
+    // AbstractDefaultTestCommand
+    //
+
+    public final void execute()
+    {
+
+        final ProjectSelectionWidget projectSelector =
+                (ProjectSelectionWidget) GWTTestUtil.getWidgetWithID(ProjectSelectionWidget.ID
+                        + ProjectSelectionWidget.SUFFIX + GenericExperimentRegistrationForm.ID);
+        if (projectNameOrNull != null)
+        {
+            GWTUtils.setSelectedItem(projectSelector, ModelDataPropertyNames.CODE,
+                    projectNameOrNull);
+        }
+
+        for (final PropertyField property : properties)
+        {
+            final Widget widget = GWTTestUtil.getWidgetWithID(property.getPropertyFieldId());
+            if (widget instanceof Field)
+            {
+                ((Field<?>) widget).setRawValue(property.getPropertyFieldValue());
+            } else if (widget instanceof VocabularyList)
+            {
+                ListBox list = (VocabularyList) widget;
+                GWTUtils.setSelectedItem(list, property.getPropertyFieldValue());
+            } else
+            {
+                throw new IllegalStateException("Wrong widget type");
+            }
+        }
+        GWTTestUtil.clickButtonWithID(GenericExperimentRegistrationForm.ID
+                + AbstractRegistrationForm.SAVE_BUTTON);
+    }
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..75f6c4534a1ff364518a84e2eb74ac5752496755
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditorTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2008 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.plugin.generic.client.web.client.application.experiment;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ListExperiments;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ShowExperimentEditor;
+import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.PropertyField;
+
+/**
+ * A {@link AbstractGWTTestCase} extension to test {@link GenericExperimentEditForm}.
+ * 
+ * @author Izabela Adamczyk
+ */
+public class GenericExperimentEditorTest extends AbstractGWTTestCase
+{
+
+    private static final String SIRNA_HCS = "SIRNA_HCS";
+
+    private static final String NEMO = "NEMO (CISD)";
+
+    private static final String EXP1 = "EXP1";
+
+    public final void testShowExperimentDetails()
+    {
+        prepareShowExperimentEditor(NEMO, SIRNA_HCS, EXP1);
+        remoteConsole.prepare(new FillExperimentEditForm("NEMO").addProperty(new PropertyField(
+                GenericExperimentRegistrationForm.ID + "user-description",
+                "New test experiment description.")));
+
+        launchTest(60000);
+    }
+
+    private void prepareShowExperimentEditor(final String projectName,
+            final String experimentTypeName, final String experimentCode)
+    {
+        loginAndGotoTab(ActionMenuKind.EXPERIMENT_MENU_BROWSE);
+        remoteConsole.prepare(new ListExperiments(projectName, experimentTypeName));
+        remoteConsole.prepare(new ShowExperimentEditor(experimentCode));
+    }
+}