diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/FullSampleIdentifier.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/FullSampleIdentifier.java
index d764874d317307213af038a51cc8d98de5d38232..9119b4b7a8daf9f1e20a055b5f63a8ca6811c331 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/FullSampleIdentifier.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/FullSampleIdentifier.java
@@ -172,12 +172,8 @@ public class FullSampleIdentifier
     @Override
     public String toString()
     {
-        // TODO: project samples
-        // return new SampleIdentifier(sampleIdentifierParts.getSpaceCodeOrNull(),
-        // sampleIdentifierParts.getProjectCodeOrNull(), sampleIdentifierParts.getContainerCodeOrNull(),
-        // sampleCode).toString();
         return new SampleIdentifier(sampleIdentifierParts.getSpaceCodeOrNull(),
-                sampleIdentifierParts.getContainerCodeOrNull(),
+                sampleIdentifierParts.getProjectCodeOrNull(), sampleIdentifierParts.getContainerCodeOrNull(),
                 sampleCode).toString();
     }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/SetSampleProjectExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/SetSampleProjectExecutor.java
index 2422a75ad26a5a649041ae957df4848cc9480d91..5d2010353a8ff010702b230ec0488210e9fc564d 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/SetSampleProjectExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/SetSampleProjectExecutor.java
@@ -51,9 +51,7 @@ public class SetSampleProjectExecutor extends AbstractSetEntityToOneRelationExec
     @Override
     protected IProjectId getRelatedId(SampleCreation creation)
     {
-        // TODO: project samples
-        // return creation.getProjectId();
-        return null;
+        return creation.getProjectId();
     }
 
     @Override
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleProjectExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleProjectExecutor.java
index afa66871e107800f46e9569d05a759416756b0b0..07be925aab168383e31f39c23096b853393e0711 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleProjectExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleProjectExecutor.java
@@ -65,9 +65,7 @@ public class UpdateSampleProjectExecutor extends AbstractUpdateEntityToOneRelati
     @Override
     protected FieldUpdateValue<IProjectId> getRelatedUpdate(SampleUpdate update)
     {
-        // TODO: project samples
-        // return update.getProjectId();
-        return null;
+        return update.getProjectId();
     }
 
     @Override
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleExecutor.java
index 69b73ad5c77a218bc4b19187134aa76334b4419b..ca1a9523636bab07e44ed37e3b7796f00d835cde 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/VerifySampleExecutor.java
@@ -34,9 +34,8 @@ public class VerifySampleExecutor implements IVerifySampleExecutor
     @Autowired
     private IVerifyEntityPropertyExecutor verifyEntityPropertyExecutor;
 
-    // TODO: project samples
-    // @Autowired
-    // private IVerifySampleProjectExecutor verifySampleProjectExecutor;
+    @Autowired
+    private IVerifySampleProjectExecutor verifySampleProjectExecutor;
 
     @Autowired
     private IVerifySampleExperimentExecutor verifySampleExperimentExecutor;
@@ -52,8 +51,7 @@ public class VerifySampleExecutor implements IVerifySampleExecutor
     {
         verifyEntityPropertyExecutor.verify(context, batch);
         verifySampleExperimentExecutor.verify(context, batch);
-        // TODO: project samples
-        // verifySampleProjectExecutor.verify(context, samples);
+        verifySampleProjectExecutor.verify(context, batch);
         verifySampleContainerExecutor.verify(context, batch);
         verifySampleParentsExecutor.verify(context, batch);
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java
index 7acc7067642bf6898c96431f01451f1033d38493..aa1e9e945b46904ae0507c8c5b8425ba3fb55ede 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/helper/generators/Generator.java
@@ -104,8 +104,7 @@ public class Generator extends AbstractGenerator
         addModificationDate(gen);
 
         gen.addFetchedField(SampleType.class, "type", "Sample type", SampleTypeFetchOptions.class);
-        // TODO: project samples
-        // gen.addFetchedField(Project.class, "project", "Project", ProjectFetchOptions.class);
+        gen.addFetchedField(Project.class, "project", "Project", ProjectFetchOptions.class);
         addSpace(gen);
         addExperiment(gen);
         addProperties(gen);
@@ -445,9 +444,8 @@ public class Generator extends AbstractGenerator
         gen.addPluralFetchedField("List<Experiment>", List.class.getName(), "experiments", "Experiments", ExperimentFetchOptions.class)
                 .withInterface(IExperimentsHolder.class);
         gen.addClassForImport(Experiment.class);
-        // TODO: project samples
-        // gen.addPluralFetchedField("List<Sample>", List.class.getName(), "samples", "Samples", SampleFetchOptions.class);
-        // gen.addClassForImport(Sample.class);
+        gen.addPluralFetchedField("List<Sample>", List.class.getName(), "samples", "Samples", SampleFetchOptions.class);
+        gen.addClassForImport(Sample.class);
         gen.addPluralFetchedField("List<HistoryEntry>", List.class.getName(), "history", "History", HistoryEntryFetchOptions.class);
         gen.addClassForImport(HistoryEntry.class);
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/entity/project/ProjectTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/entity/project/ProjectTranslator.java
index a6bf0de5e81f22e6de2eba903242d72c14ae320e..2ec93006b45fbc1af0b3e1cc111e85a3d987fd9d 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/entity/project/ProjectTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/entity/project/ProjectTranslator.java
@@ -29,6 +29,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.Project;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.fetchoptions.ProjectFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectIdentifier;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectPermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.translator.AbstractCachingTranslator;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.translator.TranslationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.translator.TranslationResults;
@@ -52,9 +53,8 @@ public class ProjectTranslator extends AbstractCachingTranslator<Long, Project,
     @Autowired
     private IProjectExperimentTranslator experimentTranslator;
 
-    // TODO : project samples
-    // @Autowired
-    // private IProjectSampleTranslator sampleTranslator;
+    @Autowired
+    private IProjectSampleTranslator sampleTranslator;
 
     @Autowired
     private IProjectRegistratorTranslator registratorTranslator;
@@ -102,11 +102,10 @@ public class ProjectTranslator extends AbstractCachingTranslator<Long, Project,
             relations.put(IProjectExperimentTranslator.class, experimentTranslator.translate(context, projectIds, fetchOptions.withExperiments()));
         }
 
-        // TODO: project samples
-        // if (fetchOptions.hasSamples())
-        // {
-        // relations.put(IProjectSampleTranslator.class, sampleTranslator.translate(context, projectIds, fetchOptions.withSamples()));
-        // }
+        if (fetchOptions.hasSamples())
+        {
+            relations.put(IProjectSampleTranslator.class, sampleTranslator.translate(context, projectIds, fetchOptions.withSamples()));
+        }
 
         if (fetchOptions.hasRegistrator())
         {
@@ -162,12 +161,11 @@ public class ProjectTranslator extends AbstractCachingTranslator<Long, Project,
             result.getFetchOptions().withExperimentsUsing(fetchOptions.withExperiments());
         }
 
-        // TODO: project samples
-        // if (fetchOptions.hasSamples())
-        // {
-        // result.setSamples((List<Sample>) relations.get(IProjectSampleTranslator.class, projectId));
-        // result.getFetchOptions().withSamplesUsing(fetchOptions.withSamples());
-        // }
+        if (fetchOptions.hasSamples())
+        {
+            result.setSamples((List<Sample>) relations.get(IProjectSampleTranslator.class, projectId));
+            result.getFetchOptions().withSamplesUsing(fetchOptions.withSamples());
+        }
 
         if (fetchOptions.hasRegistrator())
         {
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/entity/sample/SampleTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/entity/sample/SampleTranslator.java
index 44fe1042bcb82a9a7b2ebaf4936c4abaf6dcfd0c..eb0091af2a5af0368c01def3fc3989a252a1b4a3 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/entity/sample/SampleTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/entity/sample/SampleTranslator.java
@@ -53,9 +53,8 @@ public class SampleTranslator extends AbstractCachingTranslator<Long, Sample, Sa
     @Autowired
     private ISampleSpaceTranslator spaceTranslator;
 
-    // TODO: project samples
-    // @Autowired
-    // private ISampleProjectTranslator projectTranslator;
+    @Autowired
+    private ISampleProjectTranslator projectTranslator;
 
     @Autowired
     private ISamplePropertyTranslator propertyTranslator;
@@ -127,11 +126,10 @@ public class SampleTranslator extends AbstractCachingTranslator<Long, Sample, Sa
             relations.put(ISampleSpaceTranslator.class, spaceTranslator.translate(context, sampleIds, fetchOptions.withSpace()));
         }
 
-        // TODO: project samples
-        // if (fetchOptions.hasProject())
-        // {
-        // relations.put(ISampleProjectTranslator.class, projectTranslator.translate(context, sampleIds, fetchOptions.withProject()));
-        // }
+        if (fetchOptions.hasProject())
+        {
+            relations.put(ISampleProjectTranslator.class, projectTranslator.translate(context, sampleIds, fetchOptions.withProject()));
+        }
 
         if (fetchOptions.hasProperties())
         {
@@ -210,10 +208,7 @@ public class SampleTranslator extends AbstractCachingTranslator<Long, Sample, Sa
 
         result.setPermId(new SamplePermId(baseRecord.permId));
         result.setCode(baseRecord.code);
-        // TODO: project samples
-        // result.setIdentifier(new SampleIdentifier(baseRecord.spaceCode, baseRecord.projectCode,
-        // baseRecord.containerCode, baseRecord.code));
-        result.setIdentifier(new SampleIdentifier(baseRecord.spaceCode,
+        result.setIdentifier(new SampleIdentifier(baseRecord.spaceCode, baseRecord.projectCode,
                 baseRecord.containerCode, baseRecord.code));
         result.setModificationDate(baseRecord.modificationDate);
         result.setRegistrationDate(baseRecord.registrationDate);
@@ -230,12 +225,11 @@ public class SampleTranslator extends AbstractCachingTranslator<Long, Sample, Sa
             result.getFetchOptions().withSpaceUsing(fetchOptions.withSpace());
         }
 
-        // TODO: project samples
-        // if (fetchOptions.hasProject())
-        // {
-        // result.setProject(relations.get(ISampleProjectTranslator.class, sampleId));
-        // result.getFetchOptions().withProjectUsing(fetchOptions.withProject());
-        // }
+        if (fetchOptions.hasProject())
+        {
+            result.setProject(relations.get(ISampleProjectTranslator.class, sampleId));
+            result.getFetchOptions().withProjectUsing(fetchOptions.withProject());
+        }
 
         if (fetchOptions.hasProperties())
         {
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/ProjectSearchCriteriaTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/ProjectSearchCriteriaTranslator.java
index b640b691093927c909e7197a5c7bd652cb8584f7..ca2baa27865f12142fbe20c7b136c3c7f338d0c8 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/ProjectSearchCriteriaTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/ProjectSearchCriteriaTranslator.java
@@ -23,6 +23,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractCompositeS
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.search.NoProjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.search.ProjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.search.SpaceSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
@@ -51,9 +52,7 @@ public class ProjectSearchCriteriaTranslator extends AbstractFieldFromCompositeS
     @Override
     protected boolean doAccepts(ISearchCriteria criteria)
     {
-        // TODO: project samples
-        // return criteria instanceof NoProjectSearchCriteria || criteria instanceof ProjectSearchCriteria;
-        return criteria instanceof ProjectSearchCriteria;
+        return criteria instanceof NoProjectSearchCriteria || criteria instanceof ProjectSearchCriteria;
     }
 
     @Override
@@ -64,11 +63,10 @@ public class ProjectSearchCriteriaTranslator extends AbstractFieldFromCompositeS
             throw new IllegalArgumentException("Project criteria can be used only in experiment or sample criteria, "
                     + "but was used in: " + context.peekObjectKind() + " context.");
         }
-        // TODO: project samples
-        // if (criteria instanceof NoProjectSearchCriteria)
-        // {
-        // return new SearchCriteriaTranslationResult(new DetailedSearchCriterion(PROJECT_ID_FIELD, NullBridge.NULL));
-        // }
+        if (criteria instanceof NoProjectSearchCriteria)
+        {
+            return new SearchCriteriaTranslationResult(new DetailedSearchCriterion(PROJECT_ID_FIELD, NullBridge.NULL));
+        }
         AbstractCompositeSearchCriteria compositeCriteria = (AbstractCompositeSearchCriteria) criteria;
         Collection<ISearchCriteria> subCriteria = compositeCriteria.getCriteria();
         if (subCriteria.isEmpty())
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
index 09b131d12ac098a3832c975d6c4432a7feeb145b..40a494b8320ed1141583dcb0cd7cc543227dd7ec 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
@@ -22,6 +22,7 @@ import java.sql.Statement;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Properties;
 
 import javax.annotation.Resource;
 
@@ -32,6 +33,7 @@ import org.springframework.beans.factory.InitializingBean;
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.common.properties.PropertyUtils;
 import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer;
 import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
 import ch.systemsx.cisd.openbis.common.spring.SpringEoDSQLExceptionTranslator;
@@ -343,10 +345,8 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
     @Override
     public void afterPropertiesSet() throws Exception
     {
-        // TODO: project samples
-        // Properties serviceProperties = configurer.getResolvedProps();
-        // boolean projectSamplesEnabled = PropertyUtils.getBoolean(serviceProperties, Constants.PROJECT_SAMPLES_ENABLED_KEY, false);
-        boolean projectSamplesEnabled = false;
+        Properties serviceProperties = configurer.getResolvedProps();
+        boolean projectSamplesEnabled = PropertyUtils.getBoolean(serviceProperties, Constants.PROJECT_SAMPLES_ENABLED_KEY, false);
         Connection connection = null;
         try
         {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/FullSampleIdentifierTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/FullSampleIdentifierTest.java
index c0b0fae72ef8a9f4d24fc86101b7884e68e88513..92bfcf1877939b17dd5eef043c719077b940404d 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/FullSampleIdentifierTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/FullSampleIdentifierTest.java
@@ -21,8 +21,6 @@ import static junit.framework.Assert.fail;
 
 import org.testng.annotations.Test;
 
-import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.sample.FullSampleIdentifier;
-
 /**
  * @author Franz-Josef Elmer
  */
@@ -36,14 +34,13 @@ public class FullSampleIdentifierTest
         assertSampId("/C1:S1");
         assertSampId("/SPACE1/S2");
         assertSampId("/SPACE1/S2:A02");
-        // TODO: project samples
-        // assertSampId("/SPACE1/PROJECT1/S1");
-        // assertSampId("/SPACE1/PROJECT1/S1:A02");
+        assertSampId("/SPACE1/PROJECT1/S1");
+        assertSampId("/SPACE1/PROJECT1/S1:A02");
         assertSampIdWithHomeSpace("/HS/S1", "//s1", "HS");
         assertSampIdWithHomeSpace("/HS/C1:S1", "//c1:s1", "HS");
-        // assertSampIdWithHomeSpace("/HS/PROJECT1/S1", "//Project1/s1", "HS");
-        // assertSampIdWithHomeSpace("/HS/PROJECT1/C1:S1", "//project1/c1:s1", "HS");
-        // assertSampIdWithHomeSpace("/SP1/PROJECT1/C1:S1", "/sp1/project1/c1:s1", "HS");
+        assertSampIdWithHomeSpace("/HS/PROJECT1/S1", "//Project1/s1", "HS");
+        assertSampIdWithHomeSpace("/HS/PROJECT1/C1:S1", "//project1/c1:s1", "HS");
+        assertSampIdWithHomeSpace("/SP1/PROJECT1/C1:S1", "/sp1/project1/c1:s1", "HS");
     }
 
     @Test
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/Project.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/Project.java
index 8f8c97e9b6ed69c9727f1878a751b7df0db9ffcf..a90196e01c3a5dcdd90ff43d419fe99601722ca8 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/Project.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/Project.java
@@ -15,6 +15,13 @@
  */
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.project;
 
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.Attachment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IAttachmentsHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.ICodeHolder;
@@ -31,20 +38,17 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.person.Person;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.fetchoptions.ProjectFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectIdentifier;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectPermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.Space;
 import ch.ethz.sis.openbis.generic.asapi.v3.exceptions.NotFetchedException;
 import ch.systemsx.cisd.base.annotation.JsonObject;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
-import java.util.Date;
-import java.util.List;
 
 /*
  * Class automatically generated with DtoGenerator
  */
 @JsonObject("as.dto.project.Project")
-public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, IExperimentsHolder, IModificationDateHolder, IModifierHolder, IPermIdHolder, IRegistrationDateHolder, IRegistratorHolder, ISpaceHolder
+public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, IExperimentsHolder, IModificationDateHolder, IModifierHolder,
+        IPermIdHolder, IRegistrationDateHolder, IRegistratorHolder, ISpaceHolder
 {
     private static final long serialVersionUID = 1L;
 
@@ -72,6 +76,9 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
     @JsonProperty
     private List<Experiment> experiments;
 
+    @JsonProperty
+    private List<Sample> samples;
+
     @JsonProperty
     private List<HistoryEntry> history;
 
@@ -193,8 +200,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasExperiments())
         {
             return experiments;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Experiments have not been fetched.");
         }
@@ -206,6 +212,25 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         this.experiments = experiments;
     }
 
+    // Method automatically generated with DtoGenerator
+    @JsonIgnore
+    public List<Sample> getSamples()
+    {
+        if (getFetchOptions().hasSamples())
+        {
+            return samples;
+        } else
+        {
+            throw new NotFetchedException("Samples have not been fetched.");
+        }
+    }
+
+    // Method automatically generated with DtoGenerator
+    public void setSamples(List<Sample> samples)
+    {
+        this.samples = samples;
+    }
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     public List<HistoryEntry> getHistory()
@@ -213,8 +238,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasHistory())
         {
             return history;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("History have not been fetched.");
         }
@@ -234,8 +258,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasSpace())
         {
             return space;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Space has not been fetched.");
         }
@@ -255,8 +278,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasRegistrator())
         {
             return registrator;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Registrator has not been fetched.");
         }
@@ -276,8 +298,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasModifier())
         {
             return modifier;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Modifier has not been fetched.");
         }
@@ -296,8 +317,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasLeader())
         {
             return leader;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Leader has not been fetched.");
         }
@@ -317,8 +337,7 @@ public class Project implements Serializable, IAttachmentsHolder, ICodeHolder, I
         if (getFetchOptions() != null && getFetchOptions().hasAttachments())
         {
             return attachments;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Attachments have not been fetched.");
         }
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/fetchoptions/ProjectFetchOptions.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/fetchoptions/ProjectFetchOptions.java
index 06f8e7d2602f1d89e8719c6f64cd8568fd0bcf38..23e27f149bba4f78091d7a8f023ce3000215d750 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/fetchoptions/ProjectFetchOptions.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/fetchoptions/ProjectFetchOptions.java
@@ -15,6 +15,10 @@
  */
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.project.fetchoptions;
 
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.fetchoptions.AttachmentFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.fetchoptions.FetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.fetchoptions.FetchOptionsToStringBuilder;
@@ -22,10 +26,9 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.fetchoptions.Experime
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.history.fetchoptions.HistoryEntryFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.person.fetchoptions.PersonFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.Project;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.fetchoptions.SpaceFetchOptions;
 import ch.systemsx.cisd.base.annotation.JsonObject;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
 
 /*
  * Class automatically generated with DtoGenerator
@@ -38,6 +41,9 @@ public class ProjectFetchOptions extends FetchOptions<Project> implements Serial
     @JsonProperty
     private ExperimentFetchOptions experiments;
 
+    @JsonProperty
+    private SampleFetchOptions samples;
+
     @JsonProperty
     private HistoryEntryFetchOptions history;
 
@@ -81,6 +87,27 @@ public class ProjectFetchOptions extends FetchOptions<Project> implements Serial
         return experiments != null;
     }
 
+    public SampleFetchOptions withSamples()
+    {
+        if (samples == null)
+        {
+            samples = new SampleFetchOptions();
+        }
+        return samples;
+    }
+
+    // Method automatically generated with DtoGenerator
+    public SampleFetchOptions withSamplesUsing(SampleFetchOptions fetchOptions)
+    {
+        return samples = fetchOptions;
+    }
+
+    // Method automatically generated with DtoGenerator
+    public boolean hasSamples()
+    {
+        return samples != null;
+    }
+
     // Method automatically generated with DtoGenerator
     public HistoryEntryFetchOptions withHistory()
     {
@@ -230,6 +257,7 @@ public class ProjectFetchOptions extends FetchOptions<Project> implements Serial
     {
         return sort;
     }
+
     @Override
     protected FetchOptionsToStringBuilder getFetchOptionsStringBuilder()
     {
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/search/NoProjectSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/search/NoProjectSearchCriteria.java
new file mode 100644
index 0000000000000000000000000000000000000000..850d6f58c83a882f9564311e2cbdcb7e24635ef7
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/search/NoProjectSearchCriteria.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2015 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.asapi.v3.dto.project.search;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+
+/**
+ * @author pkupczyk
+ */
+@JsonObject("as.dto.project.search.NoProjectSearchCriteria")
+public class NoProjectSearchCriteria implements ISearchCriteria
+{
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public String toString()
+    {
+        return "without project";
+    }
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java
index c5b41d0db3305a748fd02042c642dae4b49db416..d25d14fa640b504e3be78043a7905478521919f0 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/Sample.java
@@ -15,6 +15,16 @@
  */
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.sample;
 
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.Attachment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IAttachmentsHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.ICodeHolder;
@@ -35,8 +45,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.history.HistoryEntry;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.Material;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.person.Person;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.SampleType;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.Project;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
@@ -44,20 +53,14 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.Space;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.Tag;
 import ch.ethz.sis.openbis.generic.asapi.v3.exceptions.NotFetchedException;
 import ch.systemsx.cisd.base.annotation.JsonObject;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 /*
  * Class automatically generated with DtoGenerator
  */
 @JsonObject("as.dto.sample.Sample")
-public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, IDataSetsHolder, IExperimentHolder, IMaterialPropertiesHolder, IModificationDateHolder, IModifierHolder, IParentChildrenHolder<Sample>, IPermIdHolder, IPropertiesHolder, IRegistrationDateHolder, IRegistratorHolder, ISpaceHolder, ITagsHolder
+public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, IDataSetsHolder, IExperimentHolder, IMaterialPropertiesHolder,
+        IModificationDateHolder, IModifierHolder, IParentChildrenHolder<Sample>, IPermIdHolder, IPropertiesHolder, IRegistrationDateHolder,
+        IRegistratorHolder, ISpaceHolder, ITagsHolder
 {
     private static final long serialVersionUID = 1L;
 
@@ -82,6 +85,9 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
     @JsonProperty
     private SampleType type;
 
+    @JsonProperty
+    private Project project;
+
     @JsonProperty
     private Space space;
 
@@ -213,8 +219,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasType())
         {
             return type;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Sample type has not been fetched.");
         }
@@ -226,6 +231,25 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         this.type = type;
     }
 
+    // Method automatically generated with DtoGenerator
+    @JsonIgnore
+    public Project getProject()
+    {
+        if (getFetchOptions().hasProject())
+        {
+            return project;
+        } else
+        {
+            throw new NotFetchedException("Project has not been fetched.");
+        }
+    }
+
+    // Method automatically generated with DtoGenerator
+    public void setProject(Project project)
+    {
+        this.project = project;
+    }
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     @Override
@@ -234,8 +258,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasSpace())
         {
             return space;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Space has not been fetched.");
         }
@@ -255,8 +278,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasExperiment())
         {
             return experiment;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Experiment has not been fetched.");
         }
@@ -276,8 +298,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasProperties())
         {
             return properties;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Properties have not been fetched.");
         }
@@ -298,8 +319,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasMaterialProperties())
         {
             return materialProperties;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Material Properties have not been fetched.");
         }
@@ -320,8 +340,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasParents())
         {
             return parents;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Parents have not been fetched.");
         }
@@ -341,8 +360,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasChildren())
         {
             return children;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Children have not been fetched.");
         }
@@ -361,8 +379,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasContainer())
         {
             return container;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Container sample has not been fetched.");
         }
@@ -381,8 +398,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasComponents())
         {
             return components;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Component samples have not been fetched.");
         }
@@ -402,8 +418,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasDataSets())
         {
             return dataSets;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Data sets have not been fetched.");
         }
@@ -422,8 +437,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasHistory())
         {
             return history;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("History have not been fetched.");
         }
@@ -443,8 +457,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasTags())
         {
             return tags;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Tags have not been fetched.");
         }
@@ -464,8 +477,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasRegistrator())
         {
             return registrator;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Registrator has not been fetched.");
         }
@@ -485,8 +497,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasModifier())
         {
             return modifier;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Modifier has not been fetched.");
         }
@@ -506,8 +517,7 @@ public class Sample implements Serializable, IAttachmentsHolder, ICodeHolder, ID
         if (getFetchOptions() != null && getFetchOptions().hasAttachments())
         {
             return attachments;
-        }
-        else
+        } else
         {
             throw new NotFetchedException("Attachments have not been fetched.");
         }
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java
index a57f44ea901b0ab77a94cd852912510b7497a626..3e7bf9d81d0e7cbcaf37830a9d5a88e1acc129a2 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/create/SampleCreation.java
@@ -27,6 +27,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.ICreationIdHol
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.IEntityTypeId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.IProjectId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.ISampleId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.ISpaceId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.ITagId;
@@ -44,6 +45,8 @@ public class SampleCreation implements ICreation, ICreationIdHolder, IProperties
 
     private IExperimentId experimentId;
 
+    private IProjectId projectId;
+
     private ISpaceId spaceId;
 
     private String code;
@@ -86,6 +89,16 @@ public class SampleCreation implements ICreation, ICreationIdHolder, IProperties
         this.experimentId = experimentId;
     }
 
+    public IProjectId getProjectId()
+    {
+        return projectId;
+    }
+
+    public void setProjectId(IProjectId projectId)
+    {
+        this.projectId = projectId;
+    }
+
     public ISpaceId getSpaceId()
     {
         return spaceId;
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/fetchoptions/SampleFetchOptions.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/fetchoptions/SampleFetchOptions.java
index 9bf85de4e79ff531e2297b6a5cfe7e858c6dbef6..27254569856b21b9bc751f54ef380fe7d1ca70e0 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/fetchoptions/SampleFetchOptions.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/fetchoptions/SampleFetchOptions.java
@@ -15,6 +15,10 @@
  */
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions;
 
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.fetchoptions.AttachmentFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.fetchoptions.FetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.fetchoptions.FetchOptionsToStringBuilder;
@@ -23,15 +27,12 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.fetchoptions.Experime
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.history.fetchoptions.HistoryEntryFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.fetchoptions.MaterialFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.person.fetchoptions.PersonFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.fetchoptions.ProjectFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.fetchoptions.PropertyFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleTypeFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.fetchoptions.SpaceFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.fetchoptions.TagFetchOptions;
 import ch.systemsx.cisd.base.annotation.JsonObject;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.io.Serializable;
 
 /*
  * Class automatically generated with DtoGenerator
@@ -44,6 +45,9 @@ public class SampleFetchOptions extends FetchOptions<Sample> implements Serializ
     @JsonProperty
     private SampleTypeFetchOptions type;
 
+    @JsonProperty
+    private ProjectFetchOptions project;
+
     @JsonProperty
     private SpaceFetchOptions space;
 
@@ -111,6 +115,28 @@ public class SampleFetchOptions extends FetchOptions<Sample> implements Serializ
         return type != null;
     }
 
+    // Method automatically generated with DtoGenerator
+    public ProjectFetchOptions withProject()
+    {
+        if (project == null)
+        {
+            project = new ProjectFetchOptions();
+        }
+        return project;
+    }
+
+    // Method automatically generated with DtoGenerator
+    public ProjectFetchOptions withProjectUsing(ProjectFetchOptions fetchOptions)
+    {
+        return project = fetchOptions;
+    }
+
+    // Method automatically generated with DtoGenerator
+    public boolean hasProject()
+    {
+        return project != null;
+    }
+
     // Method automatically generated with DtoGenerator
     public SpaceFetchOptions withSpace()
     {
@@ -436,6 +462,7 @@ public class SampleFetchOptions extends FetchOptions<Sample> implements Serializ
     {
         return sort;
     }
+
     @Override
     protected FetchOptionsToStringBuilder getFetchOptionsStringBuilder()
     {
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/id/SampleIdentifier.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/id/SampleIdentifier.java
index eba15de05f2565ff67692db9888d94b2aef7bf40..37eef13b576d1ea3e28418ad761b395c757f313a 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/id/SampleIdentifier.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/id/SampleIdentifier.java
@@ -40,10 +40,15 @@ public class SampleIdentifier extends ObjectIdentifier implements ISampleId
 
     public SampleIdentifier(String spaceCodeOrNull, String containerCodeOrNull, String sampleCode)
     {
-        this(createIdentifier(spaceCodeOrNull, containerCodeOrNull, sampleCode));
+        this(spaceCodeOrNull, null, containerCodeOrNull, sampleCode);
     }
 
-    private static String createIdentifier(String spaceCodeOrNull,
+    public SampleIdentifier(String spaceCodeOrNull, String projectCodeOrNull, String containerCodeOrNull, String sampleCode)
+    {
+        this(createIdentifier(spaceCodeOrNull, projectCodeOrNull, containerCodeOrNull, sampleCode));
+    }
+
+    private static String createIdentifier(String spaceCodeOrNull, String projectCodeOrNull,
             String containerCodeOrNull, String sampleCode)
     {
         StringBuilder builder = new StringBuilder("/");
@@ -51,6 +56,10 @@ public class SampleIdentifier extends ObjectIdentifier implements ISampleId
         {
             builder.append(spaceCodeOrNull).append("/");
         }
+        if (projectCodeOrNull != null)
+        {
+            builder.append(projectCodeOrNull).append("/");
+        }
         if (containerCodeOrNull != null)
         {
             builder.append(containerCodeOrNull).append(":");
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java
index eb9dace1f415bb731c28c08aa2addba22e52e67f..b7120ce25c02987587982b77dd4d11f85e9f23b9 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/sample/update/SampleUpdate.java
@@ -30,6 +30,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IdListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue.ListUpdateAction;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.IProjectId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.ISampleId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.ISpaceId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.ITagId;
@@ -49,6 +50,9 @@ public class SampleUpdate implements IUpdate, IPropertiesHolder
     @JsonProperty
     private FieldUpdateValue<IExperimentId> experimentId = new FieldUpdateValue<IExperimentId>();
 
+    @JsonProperty
+    private FieldUpdateValue<IProjectId> projectId = new FieldUpdateValue<IProjectId>();
+
     @JsonProperty
     private FieldUpdateValue<ISpaceId> spaceId = new FieldUpdateValue<ISpaceId>();
 
@@ -97,6 +101,18 @@ public class SampleUpdate implements IUpdate, IPropertiesHolder
         this.experimentId.setValue(experimentId);
     }
 
+    @JsonIgnore
+    public FieldUpdateValue<IProjectId> getProjectId()
+    {
+        return projectId;
+    }
+
+    @JsonIgnore
+    public void setProjectId(IProjectId projectId)
+    {
+        this.projectId.setValue(projectId);
+    }
+
     @JsonIgnore
     public FieldUpdateValue<ISpaceId> getSpaceId()
     {