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 87c73759f25746de3d81483b2a8bd72d8fe52cf4..e8e8fb81878ef082dc7f5a1e4ddb264bfb463bbd 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
@@ -260,9 +260,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;
@@ -349,7 +349,8 @@ public interface ICommonClientService extends IClientService
      * Updates experiment.
      */
     public void updateExperiment(String attachmentSessionKey, final String experimentIdentifier,
-            List<ExperimentProperty> properties) throws UserFailureException;
+            List<ExperimentProperty> properties, String newProjectIdentifierOrNull)
+            throws UserFailureException;
 
     /**
      * Updates material.
@@ -364,6 +365,7 @@ public interface ICommonClientService extends IClientService
             throws UserFailureException;
 
     /** Deletes the specified data sets. */
-    public void deleteDataSets(List<String> dataSetCodes, String reason) throws UserFailureException;
+    public void deleteDataSets(List<String> dataSetCodes, String reason)
+            throws UserFailureException;
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index 934e8abbe11168b9b366c200f2321b8e975ed8ef..8e67325334a7e242908a6298360041e5af009c4f 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
@@ -302,11 +302,11 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
             final AsyncCallback<Void> asyncCallback);
 
     /**
-     * @see ICommonClientService#updateExperiment(String, String, List)
+     * @see ICommonClientService#updateExperiment(String, String, List,String)
      */
     public void updateExperiment(String attachmentSessionKey, final String experimentIdentifier,
-            List<ExperimentProperty> properties, final AsyncCallback<Void> asyncCallback)
-            throws UserFailureException;
+            List<ExperimentProperty> properties, String newProjectIdentifier,
+            final AsyncCallback<Void> asyncCallback) throws UserFailureException;
 
     /**
      * @see ICommonClientService#updateMaterial(String, List)
@@ -321,5 +321,6 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
             final AsyncCallback<Void> asyncCallback) throws UserFailureException;
 
     /** @see ICommonClientService#deleteDataSets(List, String) */
-    public void deleteDataSets(List<String> dataSetCodes, String reason, AsyncCallback<Void> asyncCallback);
+    public void deleteDataSets(List<String> dataSetCodes, String reason,
+            AsyncCallback<Void> asyncCallback);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java
index 6a89734fcb0b4349dda4bbe270c8dfbc0b918c51..3f769e1a3c7055b337c80e712f500e9cb895dc13 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java
@@ -94,6 +94,8 @@ public final class ModelDataPropertyNames
 
     public static final String IS_MANAGED_INTERNALLY = "isManagedInternally";
 
+    public static final String PROJECT_IDENTIFIER = "projectIdentifier";
+
     private ModelDataPropertyNames()
     {
         // Can not be instantiated.
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 326a1bf4fcd08a0b936a56625adde89d8b0cb46f..6b8d03f0331288f28c6ba2246b5f4c48783725ab 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
@@ -134,7 +134,7 @@ public final class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment,
     {
         return new EditableExperiment(selectedType.getExperimentTypePropertyTypes(), experiment
                 .getProperties(), selectedType, experiment.getIdentifier(), experiment.getId(),
-                experiment.getModificationDate());
+                experiment.getModificationDate(), experiment.getProject().getIdentifier());
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionWidget.java
index bcb192fd167f819d7bc491945ced328eaa499816..b4e684c2bdea068c114a192b70d6ddfba46f34ba 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionWidget.java
@@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AppEvents;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.DropDownList;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Project;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
@@ -55,6 +56,7 @@ public final class ProjectSelectionWidget extends
         public ProjectComboModel(Project project)
         {
             set(DISPLAY_COLUMN_ID, renderProjectWithGroup(project));
+            set(ModelDataPropertyNames.PROJECT_IDENTIFIER, project.getIdentifier());
             set(ModelDataPropertyNames.OBJECT, project);
         }
 
@@ -68,11 +70,20 @@ public final class ProjectSelectionWidget extends
 
     private final IViewContext<?> viewContext;
 
+    private final String initialProjectIdentifier;
+
     public ProjectSelectionWidget(final IViewContext<?> viewContext, final String idSuffix)
+    {
+        this(viewContext, idSuffix, null);
+    }
+
+    public ProjectSelectionWidget(final IViewContext<?> viewContext, final String idSuffix,
+            String initialProjectIdentifier)
     {
         super(viewContext, SUFFIX + idSuffix, Dict.PROJECT, DISPLAY_COLUMN_ID, CHOOSE_SUFFIX,
                 EMPTY_RESULT_SUFFIX);
         this.viewContext = viewContext;
+        this.initialProjectIdentifier = initialProjectIdentifier;
     }
 
     /**
@@ -108,8 +119,19 @@ public final class ProjectSelectionWidget extends
                 setReadOnly(true);
             }
             applyEmptyText();
+            if (initialProjectIdentifier != null)
+            {
+                trySelectByIdentifier(initialProjectIdentifier);
+                updateOriginalValue();
+            }
             fireEvent(AppEvents.CALLBACK_FINISHED);
         }
+
+    }
+
+    public void updateOriginalValue()
+    {
+        setOriginalValue(getValue());
     }
 
     @Override
@@ -129,4 +151,10 @@ public final class ProjectSelectionWidget extends
         DefaultResultSetConfig<String, Project> config = DefaultResultSetConfig.createFetchAll();
         viewContext.getCommonService().listProjects(config, new ListProjectsCallback(viewContext));
     }
+
+    public void trySelectByIdentifier(String projectIdentifier)
+    {
+        GWTUtils
+                .setSelectedItem(this, ModelDataPropertyNames.PROJECT_IDENTIFIER, projectIdentifier);
+    }
 }
\ No newline at end of file
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 d35fa5e82de90c14f02dc95c14a92ca8c8d55ea5..55d9da4cddb78af1fbe954b99c6ad194a25e4c50 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
@@ -974,7 +974,7 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     public void updateExperiment(String sessionKey, String experimentIdentifier,
-            List<ExperimentProperty> properties)
+            List<ExperimentProperty> properties, String newProjectIdentifier)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
 
@@ -997,7 +997,10 @@ public final class CommonClientService extends AbstractClientService implements
             }
             final ExperimentIdentifier identifier =
                     new ExperimentIdentifierFactory(experimentIdentifier).createIdentifier();
-            commonServer.editExperiment(sessionToken, identifier, properties, attachments);
+            final ProjectIdentifier project =
+                    newProjectIdentifier == null ? null : new ProjectIdentifierFactory(
+                            newProjectIdentifier).createIdentifier();
+            commonServer.editExperiment(sessionToken, identifier, properties, attachments, project);
         } catch (final UserFailureException e)
         {
             throw UserFailureExceptionTranslator.translate(e);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 6fc15a6082a043a1f01154f21b2fe2f019d9b768..520b9e258a2d72d270ed93211c47066a24703ce7 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
@@ -642,11 +642,12 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements
     }
 
     public void editExperiment(String sessionToken, ExperimentIdentifier identifier,
-            List<ExperimentProperty> properties, List<AttachmentPE> attachments)
+            List<ExperimentProperty> properties, List<AttachmentPE> attachments,
+            ProjectIdentifier newProjectIdentifierOrNull)
     {
         final Session session = getSessionManager().getSession(sessionToken);
         final IExperimentBO experimentBO = businessObjectFactory.createExperimentBO(session);
-        experimentBO.edit(identifier, properties, attachments);
+        experimentBO.edit(identifier, properties, attachments, newProjectIdentifierOrNull);
         experimentBO.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 dc7e1cc8e11c9fee457eb60619d1eec21948c094..1a5563cbc6082da52670d4b4b1777596be130788 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
@@ -312,10 +312,12 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     public void editExperiment(String sessionToken, ExperimentIdentifier experimentIdentifier,
-            List<ExperimentProperty> properties, List<AttachmentPE> attachments)
+            List<ExperimentProperty> properties, List<AttachmentPE> attachments,
+            ProjectIdentifier newProjectIdentifierOrNull)
     {
-        logTracking(sessionToken, "edit_experiment", "EXPERIMENT(%s) ATTACHMENTS_ADDED(%s)",
-                experimentIdentifier, attachments.size());
+        logTracking(sessionToken, "edit_experiment",
+                "EXPERIMENT(%s) ATTACHMENTS_ADDED(%s) NEW_PROJECT(%s)", experimentIdentifier,
+                attachments.size(), newProjectIdentifierOrNull);
     }
 
     public void deleteDataSets(String sessionToken, List<String> dataSetCodes, String reason)
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 c611ea76aff066c8f95c6ec10b7d4b150f1c7413..e61ff86b096fa5fc6c0118408599292011ddb697 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
@@ -39,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
@@ -291,10 +292,11 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
     }
 
     public void edit(ExperimentIdentifier identifier, List<ExperimentProperty> properties,
-            List<AttachmentPE> newAttachments)
+            List<AttachmentPE> newAttachments, ProjectIdentifier newProjectIdentifierOrNull)
     {
         loadByExperimentIdentifier(identifier);
         updateProperties(properties);
+        updateProject(newProjectIdentifierOrNull);
         for (AttachmentPE a : newAttachments)
         {
             addAttachment(a);
@@ -302,6 +304,24 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
         dataChanged = true;
     }
 
+    private void updateProject(ProjectIdentifier newProjectIdentifierOrNull)
+    {
+        if (newProjectIdentifierOrNull != null)
+        {
+            ProjectPE project =
+                    getProjectDAO().tryFindProject(
+                            newProjectIdentifierOrNull.getDatabaseInstanceCode(),
+                            newProjectIdentifierOrNull.getGroupCode(),
+                            newProjectIdentifierOrNull.getProjectCode());
+            if (project == null)
+            {
+                throw UserFailureException.fromTemplate(ERR_PROJECT_NOT_FOUND,
+                        newProjectIdentifierOrNull);
+            }
+            experiment.setProject(project);
+        }
+    }
+
     private void updateProperties(List<ExperimentProperty> properties)
     {
         final ArrayList<ExperimentPropertyPE> existingProperties =
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 74b3e7553db25891490e1497b50269707edb14ba..e9154b16db9a8d64a6f91b609576e64fa9041cc0 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
@@ -23,6 +23,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 
 /**
  * A generic experiment <i>Business Object</i>.
@@ -64,5 +65,5 @@ public interface IExperimentBO extends IBusinessObject
      * Changes given experiment. Currently allowed changes: properties.
      */
     public void edit(ExperimentIdentifier identifier, List<ExperimentProperty> properties,
-            List<AttachmentPE> attachments);
+            List<AttachmentPE> attachments, ProjectIdentifier newProjectIdentifierOrNull);
 }
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 48f017687e4531761ae24bcb9ca777a76ad1864b..f98a3546fee312ae24b92432d5b9318068f46608 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
@@ -131,11 +131,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.
@@ -149,11 +147,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.
@@ -188,10 +184,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}.
@@ -200,9 +196,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
@@ -212,9 +208,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.
@@ -290,10 +286,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.
@@ -360,7 +355,9 @@ public interface ICommonServer extends IServer
     public void editExperiment(String sessionToken,
             @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
             ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties,
-            List<AttachmentPE> attachments);
+            List<AttachmentPE> attachments,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            ProjectIdentifier newProjectIdentifierOrNull);
 
     /**
      * Saves changed material.
@@ -375,10 +372,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleSet.USER)
-    public void editSample(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) SampleIdentifier identifier,
-            List<SampleProperty> properties);
+    public void editSample(String sessionToken,
+            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
+            SampleIdentifier identifier, List<SampleProperty> properties);
 
     /** Lists vocabulary terms of a given vocabulary. Includes terms usage statistics. */
     @Transactional
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableExperiment.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableExperiment.java
index 92991923c4cc1e1d5ccb1ebe84add7a335b297c7..64232ca286146e37a8221a7fa7de9ab8f0e3c274 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableExperiment.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableExperiment.java
@@ -19,7 +19,6 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 import java.util.Date;
 import java.util.List;
 
-
 /**
  * @author Izabela Adamczyk
  */
@@ -27,11 +26,19 @@ public class EditableExperiment extends
         EditableEntity<ExperimentType, ExperimentTypePropertyType, ExperimentProperty>
 {
 
+    private final String project;
+
     public EditableExperiment(List<ExperimentTypePropertyType> etpts,
             List<ExperimentProperty> properties, ExperimentType type, String identifier, Long id,
-            Date modificationDate)
+            Date modificationDate, String project)
     {
         super(EntityKind.EXPERIMENT, etpts, properties, type, identifier, id, modificationDate);
+        this.project = project;
+    }
+
+    public String getProjectIdentifier()
+    {
+        return project;
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
index 7fd37eadc7caef5cd4fceac77d2f1b40ee492172..f66bff733724fad5126eaadd3dc4950a9976b02c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
@@ -202,7 +202,7 @@ public class ExperimentPE implements IEntityPropertiesHolder<ExperimentPropertyP
 
     @ManyToOne(fetch = FetchType.EAGER)
     @NotNull(message = ValidationMessages.PROJECT_NOT_NULL_MESSAGE)
-    @JoinColumn(name = ColumnNames.PROJECT_COLUMN, updatable = false)
+    @JoinColumn(name = ColumnNames.PROJECT_COLUMN, updatable = true)
     @IndexedEmbedded(prefix = SearchFieldConstants.PREFIX_PROJECT)
     public ProjectPE getProject()
     {
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 45d09cd9f93a2d3d2a45199203f6456c507cf6e9..1ac2ea4d5e479454d817c246d001203b0e19b32a 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
@@ -32,6 +32,8 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.InfoBoxCallbackListener;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ProjectSelectionWidget;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EditableExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentProperty;
@@ -63,12 +65,20 @@ public final class GenericExperimentEditForm
 
     private Html attachmentsInfo;
 
+    private ProjectSelectionWidget projectChooser;
+
+    private String originalProjectIdentifier;
+
     public GenericExperimentEditForm(IViewContext<IGenericClientServiceAsync> viewContext,
             EditableExperiment entity, boolean editMode)
     {
         super(viewContext, entity, editMode);
         this.viewContext = viewContext;
         sessionKey = createSimpleId(EntityKind.EXPERIMENT, entity.getId() + "");
+        originalProjectIdentifier = entity.getProjectIdentifier();
+        projectChooser =
+                new ProjectSelectionWidget(viewContext, sessionKey, originalProjectIdentifier);
+        FieldUtil.markAsMandatory(projectChooser);
         attachmentManager =
                 new AttachmentManager(sessionKey, DEFAULT_NUMBER_OF_ATTACHMENTS, "New Attachment");
         addUploadFeatures(formPanel, sessionKey);
@@ -115,8 +125,22 @@ public final class GenericExperimentEditForm
     private void save()
     {
         final List<ExperimentProperty> properties = extractProperties();
-        viewContext.getCommonService().updateExperiment(sessionKey, entity.getIdentifier(),
-                properties, new RegisterExperimentCallback(viewContext));
+        final String newProjectIdentifierOrNull = extractIdentifier();
+        viewContext.getCommonService()
+                .updateExperiment(sessionKey, entity.getIdentifier(), properties,
+                        newProjectIdentifierOrNull, new RegisterExperimentCallback(viewContext));
+    }
+
+    private String extractIdentifier()
+    {
+        final String newIdentifier = projectChooser.tryGetSelectedProject().getIdentifier();
+        if (originalProjectIdentifier.equals(newIdentifier))
+        {
+            return null;
+        } else
+        {
+            return newIdentifier;
+        }
     }
 
     @Override
@@ -149,7 +173,7 @@ public final class GenericExperimentEditForm
     protected PropertiesEditor<ExperimentType, ExperimentTypePropertyType, ExperimentProperty> createPropertiesEditor(
             List<ExperimentTypePropertyType> entityTypesPropertyTypes,
             List<ExperimentProperty> properties, String id,
-            IViewContext<ICommonClientServiceAsync>  context)
+            IViewContext<ICommonClientServiceAsync> context)
     {
         return new ExperimentPropertyEditor(entityTypesPropertyTypes, properties, id, context);
     }
@@ -158,6 +182,7 @@ public final class GenericExperimentEditForm
     protected List<Field<?>> getEntitySpecificFormFields()
     {
         List<Field<?>> fields = new ArrayList<Field<?>>();
+        fields.add(projectChooser);
         for (FileUploadField f : attachmentManager.getFields())
         {
             fields.add(f);
@@ -176,6 +201,7 @@ public final class GenericExperimentEditForm
     @Override
     protected void updateCheckPageWidgets()
     {
+        projectChooser.updateOriginalValue();
         attachmentsInfo.setHtml(getAttachmentInfoText(attachmentManager.attachmentsDefined()));
     }
 
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 b61efa711ed9bfc0c9689820e587daea0fb8602a..674440954b13443e3e5b469fc66cd9ed656f35df 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
@@ -131,11 +131,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.
@@ -149,11 +147,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.
@@ -188,10 +184,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}.
@@ -200,9 +196,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
@@ -212,9 +208,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.
@@ -290,10 +286,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.
@@ -360,7 +355,9 @@ public interface ICommonServer extends IServer
     public void editExperiment(String sessionToken,
             @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
             ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties,
-            List<AttachmentPE> attachments);
+            List<AttachmentPE> attachments,
+            @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
+            ProjectIdentifier newProjectIdentifierOrNull);
 
     /**
      * Saves changed material.
@@ -375,10 +372,9 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @RolesAllowed(RoleSet.USER)
-    public void editSample(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) SampleIdentifier identifier,
-            List<SampleProperty> properties);
+    public void editSample(String sessionToken,
+            @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class)
+            SampleIdentifier identifier, List<SampleProperty> properties);
 
     /** Lists vocabulary terms of a given vocabulary. Includes terms usage statistics. */
     @Transactional