diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java
index 67051d73648120ac76d4a70c2824b513cf85a467..2457bb9a6900fdf73925bbae35a8c222bda3ed0b 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/Experiment.java
@@ -111,6 +111,9 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
     @JsonProperty
     private Map<String, Material> materialProperties;
 
+    @JsonProperty
+    private Map<String, Sample> sampleProperties;
+
     @JsonProperty
     private Set<Tag> tags;
 
@@ -377,6 +380,23 @@ public class Experiment implements Serializable, IAttachmentsHolder, ICodeHolder
         this.materialProperties = materialProperties;
     }
 
+    @JsonIgnore
+    public Map<String, Sample> getSampleProperties()
+    {
+        if (getFetchOptions() != null && getFetchOptions().hasSampleProperties())
+        {
+            return sampleProperties;
+        } else
+        {
+            throw new NotFetchedException("Sample Properties have not been fetched.");
+        }
+    }
+
+    public void setSampleProperties(Map<String, Sample> sampleProperties)
+    {
+        this.sampleProperties = sampleProperties;
+    }
+
     // Method automatically generated with DtoGenerator
     @JsonIgnore
     @Override
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java
index bd1ab132d947af0d1f60e3eed885dd576705f443..6e0c022e9bb50badb9d76b6dcb00c28369b60c3f 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/create/ExperimentCreation.java
@@ -27,8 +27,10 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.create.IObjectCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.CreationId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.ICreationIdHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.ISamplePropertiesHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.IEntityTypeId;
 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.tag.id.ITagId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -36,7 +38,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.experiment.create.ExperimentCreation")
-public class ExperimentCreation implements ICreation, IObjectCreation, ICreationIdHolder, IPropertiesHolder
+public class ExperimentCreation implements ICreation, IObjectCreation, ICreationIdHolder, IPropertiesHolder, ISamplePropertiesHolder
 {
     private static final long serialVersionUID = 1L;
 
@@ -50,6 +52,8 @@ public class ExperimentCreation implements ICreation, IObjectCreation, ICreation
 
     private Map<String, String> properties = new HashMap<String, String>();
 
+    private Map<String, ISampleId> sampleProperties = new HashMap<String, ISampleId>();
+
     private List<AttachmentCreation> attachments;
 
     private CreationId creationId;
@@ -118,6 +122,16 @@ public class ExperimentCreation implements ICreation, IObjectCreation, ICreation
         return properties;
     }
 
+    public void setSampleProperty(String propertyName, ISampleId sampleId)
+    {
+        sampleProperties.put(propertyName, sampleId);
+    }
+
+    public Map<String, ISampleId> getSampleProperties()
+    {
+        return sampleProperties;
+    }
+
     public List<AttachmentCreation> getAttachments()
     {
         return attachments;
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/fetchoptions/ExperimentFetchOptions.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/fetchoptions/ExperimentFetchOptions.java
index 2cc919e80a69647002ac6e2bcca8d7ef5a5b7687..3423e9cd7389a2fd117ddaa23aeac85be4a72426 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/fetchoptions/ExperimentFetchOptions.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/fetchoptions/ExperimentFetchOptions.java
@@ -61,6 +61,9 @@ public class ExperimentFetchOptions extends FetchOptions<Experiment> implements
     @JsonProperty
     private MaterialFetchOptions materialProperties;
 
+    @JsonProperty
+    private SampleFetchOptions sampleProperties;
+
     @JsonProperty
     private TagFetchOptions tags;
 
@@ -230,6 +233,25 @@ public class ExperimentFetchOptions extends FetchOptions<Experiment> implements
         return materialProperties != null;
     }
 
+    public SampleFetchOptions withSampleProperties()
+    {
+        if (sampleProperties == null)
+        {
+            sampleProperties = new SampleFetchOptions();
+        }
+        return sampleProperties;
+    }
+
+    public SampleFetchOptions withSamplePropertiesUsing(SampleFetchOptions fetchOptions)
+    {
+        return sampleProperties = fetchOptions;
+    }
+
+    public boolean hasSampleProperties()
+    {
+        return sampleProperties != null;
+    }
+
     // Method automatically generated with DtoGenerator
     public TagFetchOptions withTags()
     {
@@ -346,6 +368,7 @@ public class ExperimentFetchOptions extends FetchOptions<Experiment> implements
         f.addFetchOption("History", history);
         f.addFetchOption("Properties", properties);
         f.addFetchOption("MaterialProperties", materialProperties);
+        f.addFetchOption("SampleProperties", sampleProperties);
         f.addFetchOption("Tags", tags);
         f.addFetchOption("Registrator", registrator);
         f.addFetchOption("Modifier", modifier);
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java
index c5dbf86ac364260d0c3d07f50fd81096f0aa1c9b..83da18d31422c8c703717e90e066febd7bfaf367 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/experiment/update/ExperimentUpdate.java
@@ -26,6 +26,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.update.AttachmentListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.ObjectToString;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.ISamplePropertiesHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.FieldUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IObjectUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.IUpdate;
@@ -33,6 +34,7 @@ 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.tag.id.ITagId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -40,7 +42,7 @@ import ch.systemsx.cisd.base.annotation.JsonObject;
  * @author pkupczyk
  */
 @JsonObject("as.dto.experiment.update.ExperimentUpdate")
-public class ExperimentUpdate implements IUpdate, IObjectUpdate<IExperimentId>, IPropertiesHolder
+public class ExperimentUpdate implements IUpdate, IObjectUpdate<IExperimentId>, IPropertiesHolder, ISamplePropertiesHolder
 {
 
     private static final long serialVersionUID = 1L;
@@ -60,6 +62,9 @@ public class ExperimentUpdate implements IUpdate, IObjectUpdate<IExperimentId>,
     @JsonProperty
     private Map<String, String> properties = new HashMap<String, String>();
 
+    @JsonProperty
+    private Map<String, ISampleId> sampleProperties = new HashMap<String, ISampleId>();
+
     @JsonProperty
     private FieldUpdateValue<IProjectId> projectId = new FieldUpdateValue<IProjectId>();
 
@@ -151,6 +156,19 @@ public class ExperimentUpdate implements IUpdate, IObjectUpdate<IExperimentId>,
         return properties;
     }
 
+    @JsonIgnore
+    public void setSampleProperty(String propertyName, ISampleId sampleId)
+    {
+        sampleProperties.put(propertyName, sampleId);
+    }
+
+    @Override
+    @JsonIgnore
+    public Map<String, ISampleId> getSampleProperties()
+    {
+        return sampleProperties;
+    }
+
     @JsonIgnore
     public void setProjectId(IProjectId projectId)
     {