diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/ISample.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/ISample.java
index aeb1f118e63e90813376bb1ef677a1ccb149c416..380ab52b8d677741709ea65c32c88233ff8bff0b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/ISample.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/ISample.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.etlserver.registrator.api.v2;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IExperimentImmutable;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IProjectImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
 
 /**
@@ -30,6 +31,11 @@ public interface ISample extends ISampleImmutable
      * Set the experiment for this sample. The experiment need not be immutable, but the immutable one is the superclass.
      */
     void setExperiment(IExperimentImmutable experiment);
+    
+    /**
+     * Set the project for this sample. The project need not be immutable, but the immutable one is the superclass.
+     */
+    void setProject(IProjectImmutable project);
 
     /**
      * Set the type for this sample.
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/Sample.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/Sample.java
index 30dd74af380e9fe48ec4b331391252b375dfd66d..9c9c58fcad788b751b90e392e8992a1eabab7fa7 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/Sample.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/Sample.java
@@ -23,6 +23,7 @@ import java.util.Set;
 
 import ch.systemsx.cisd.etlserver.registrator.api.v2.ISample;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IExperimentImmutable;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IProjectImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
@@ -126,6 +127,19 @@ public class Sample extends SampleImmutable implements ISample
         updateDetails.setExperimentUpdateRequested(true);
     }
 
+    @Override
+    public void setProject(IProjectImmutable project)
+    {
+        ProjectImmutable proj = (ProjectImmutable) project;
+        if (proj == null)
+        {
+            getSample().setProject(null);
+        } else
+        {
+            getSample().setProject(proj.getProject());
+        }
+    }
+
     @Override
     public void setPropertyValue(String propertyCode, String propertyValue)
     {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SampleImmutable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SampleImmutable.java
index 672368a4541b0fc5820c590613c10a637b9abd1d..cd1ad51fec0b8bd713b3ca99113dc207c7dd5711 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SampleImmutable.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SampleImmutable.java
@@ -23,10 +23,12 @@ import java.util.Set;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IExperimentImmutable;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IProjectImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.ISampleImmutable;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleFetchOption;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.IObjectId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.sample.SampleIdentifierId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
 
 /**
@@ -90,6 +92,13 @@ public class SampleImmutable implements ISampleImmutable
         return (null != experiment) ? new ExperimentImmutable(experiment) : null;
     }
 
+    @Override
+    public IProjectImmutable getProject()
+    {
+        Project project = sample.getProject();
+        return project == null ? null : new ProjectImmutable(project);
+    }
+
     @Override
     public String getSampleIdentifier()
     {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISampleImmutable.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISampleImmutable.java
index 04147c79e86d80598896ed8dee020dd5d918d505..6e2ab317bcf65fcf7933f64c611c1544ac9f103e 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISampleImmutable.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v2/ISampleImmutable.java
@@ -44,6 +44,11 @@ public interface ISampleImmutable extends IMetaprojectContent
      * Return the experiment for this sample. May be null.
      */
     IExperimentImmutable getExperiment();
+    
+    /**
+     * Returns the project for this sample or null.
+     */
+    IProjectImmutable getProject();
 
     /**
      * Return the type for this sample. May be null.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java
index 0523465c56cde5e677d7223508b2c58103bc9efb..df1b6018d386a084b1dfa6ece484cbd554264065 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/RelationshipService.java
@@ -97,6 +97,7 @@ public class RelationshipService implements IRelationshipService, ApplicationCon
     @Override
     public void assignSampleToProject(IAuthSession session, SamplePE sample, ProjectPE project)
     {
+        SampleUtils.assertProjectSamplesEnabled(sample, project);
         Date timeStamp = getTransactionTimeStamp();
         ProjectPE previousProject = sample.getProject();
         RelationshipUtils.updateModificationDateAndModifier(previousProject, session, timeStamp);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
index ab550bb41051c6ca23795af1020e90e71b0b09ef..fab96e1d340f6e10e51c8895d3337f9663d22ee3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.IEntityOperationChecker;
 import ch.systemsx.cisd.openbis.generic.server.business.IRelationshipService;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.util.DataSetTypeWithoutExperimentChecker;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleOwner;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleUtils;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IEntityPropertiesConverter;
@@ -178,18 +179,23 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi
         if (sampleIdentifier.isProjectLevel())
         {
             ProjectPE project = findProject(sampleIdentifier.getProjectLevel());
-            samplePE.setProject(project);
-            samplePE.setSpace(project.getSpace());
+            setProjectAndSpace(samplePE, project);
         }
         String projectIdentifier = newSample.getProjectIdentifier();
         if (projectIdentifier != null)
         {
             ProjectPE project = findProject(new ProjectIdentifierFactory(projectIdentifier).createIdentifier());
-            samplePE.setProject(project);
-            samplePE.setSpace(project.getSpace());
+            setProjectAndSpace(samplePE, project);
         }
     }
 
+    private void setProjectAndSpace(SamplePE samplePE, ProjectPE project)
+    {
+        SampleUtils.assertProjectSamplesEnabled(samplePE, project);
+        samplePE.setProject(project);
+        samplePE.setSpace(project.getSpace());
+    }
+
     private void updateModifierAndModificationDate(ExperimentPE experimentOrNull)
     {
         if (experimentOrNull != null)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
index c860377085d065a9b2c82695d534540818efe4c6..f388d7ee44ff8694c5aeebad27baeca63f65a767 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleTable.java
@@ -315,7 +315,7 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I
      */
     private void prepareBatchUpdate(SamplePE sample, List<AttachmentPE> attachments,
             SampleUpdatesDTO updates, Map<SampleOwnerIdentifier, SampleOwner> sampleOwnerCache,
-            Map<String, ExperimentPE> experimentCache,
+            Map<String, ExperimentPE> experimentCache, Map<String, ProjectPE> projectCache,
             Map<EntityTypePE, List<EntityTypePropertyTypePE>> propertiesCache)
     {
         if (sample == null)
@@ -329,11 +329,17 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I
         checkPropertiesBusinessRules(sample, propertiesCache);
 
         updateSpace(sample, updates.getSampleIdentifier(), sampleOwnerCache);
+        ExperimentIdentifier experimentIdentifier = updates.getExperimentIdentifierOrNull();
         if (updates.isUpdateExperimentLink())
         {
-            updateExperiment(sample, updates.getExperimentIdentifierOrNull(), experimentCache);
+            updateExperiment(sample, experimentIdentifier, experimentCache);
             checkExperimentBusinessRules(sample);
         }
+        
+        if (experimentIdentifier == null)
+        {
+            updateProject(sample, updates.getProjectIdentifier(), projectCache);
+        }
 
         boolean parentsUpdated = updateParents(sample, updates);
 
@@ -519,6 +525,7 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I
         final Map<SampleOwnerIdentifier, SampleOwner> sampleOwnerCache =
                 new HashMap<SampleOwnerIdentifier, SampleOwner>();
         final Map<String, ExperimentPE> experimentCache = new HashMap<String, ExperimentPE>();
+        final Map<String, ProjectPE> projectCache = new HashMap<String, ProjectPE>();
         final Map<EntityTypePE, List<EntityTypePropertyTypePE>> propertiesCache =
                 new HashMap<EntityTypePE, List<EntityTypePropertyTypePE>>();
         samples = loadSamplesByTechId(updates);
@@ -550,7 +557,7 @@ public final class SampleTable extends AbstractSampleBusinessObject implements I
             }
             final List<AttachmentPE> attachments = new ArrayList<AttachmentPE>();
             prepareBatchUpdate(sample, attachments, sampleUpdates, sampleOwnerCache,
-                    experimentCache, propertiesCache);
+                    experimentCache, projectCache, propertiesCache);
             putAttachments(sample.getPermId(), attachments);
         }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/SampleUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/SampleUtils.java
index 30521c76f70d5c31d095540e1e932536a1fee7c8..f8a200e459f688cdef61acb6c56c99e56efa09d7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/SampleUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/SampleUtils.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo.util;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 
@@ -47,4 +48,13 @@ public class SampleUtils
                 data.getCode(), sample == null ? "?" : sample.getIdentifier(), reason);
     }
 
+    public static void assertProjectSamplesEnabled(SamplePE samplePE, ProjectPE project)
+    {
+        if (SamplePE.projectSamplesEnabled == false)
+        {
+            throw new UserFailureException("Can not assign sample " + samplePE.getIdentifier()
+                    + " to project " + project.getIdentifier() + " because project samples are not enabled.");
+        }
+
+    }
 }