diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
index c26d2a0d29a7e4bafa21f9f916e5c70e9fd93edc..ceade489181e346af5ad8fee4e292fd9b1fc49c7 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import net.lemnik.eodsql.DynamicTransactionQuery;
+
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked;
 import ch.systemsx.cisd.base.exceptions.InterruptedExceptionUnchecked;
@@ -699,6 +700,19 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
         AtomicEntityOperationDetails<T> createEntityOperationDetails(
                 List<DataSetRegistrationInformation<T>> dataSetRegistrations)
         {
+            for (DataSetRegistrationInformation<T> dataSetRegistrationInformation : dataSetRegistrations)
+            {
+                DataSetInformation dsInfo = dataSetRegistrationInformation.getDataSetInformation();
+                if (dsInfo.isLinkSample() == false)
+                {
+                    // A storage processor might need the sample even though the data sets should
+                    // not be linked to the sample because they are data sets of a container data
+                    // set.
+                    dsInfo.setSample(null);
+                    dsInfo.setSampleCode(null);
+                    dataSetRegistrationInformation.getExternalData().setSampleIdentifierOrNull(null);
+                }
+            }
 
             List<NewSpace> spaceRegistrations = convertSpacesToBeRegistered();
             List<NewProject> projectRegistrations = convertProjectsToBeRegistered();
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java
index e1a87c5d472c6dd05c9d8b9ca1c52df16be88f61..68d51bb95b59033d3a20a26ddf4b7448fbf112ca 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java
@@ -78,6 +78,8 @@ public class DataSetInformation implements Serializable
 
     /** sample with properties, enriched with connected experiment with properties. */
     private transient Sample sample;
+    
+    private transient boolean linkSample = true;
 
     private transient Experiment experiment;
 
@@ -285,6 +287,16 @@ public class DataSetInformation implements Serializable
         this.sampleCode = sampleCode;
     }
 
+    public boolean isLinkSample()
+    {
+        return linkSample;
+    }
+
+    public void setLinkSample(boolean linkSample)
+    {
+        this.linkSample = linkSample;
+    }
+
     public final String getDataSetCode()
     {
         return extractableData.getCode();
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/impl/ImageContainerDataSet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/impl/ImageContainerDataSet.java
index 0f65a686ba896961247f211622c1dc7ba67ffd4c..1c2ef66881ccaef023232759d403e245727d12d7 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/impl/ImageContainerDataSet.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/impl/ImageContainerDataSet.java
@@ -40,6 +40,8 @@ public class ImageContainerDataSet extends DataSet<DataSetInformation> implement
     private DataSet<ImageDataSetInformation> originalDataset;
 
     private List<IDataSet> thumbnailDatasets = Collections.emptyList();
+    
+    private boolean establishSampleLinkForContainedDataSets = false;
 
     public ImageContainerDataSet(
             DataSetRegistrationDetails<? extends DataSetInformation> registrationDetails,
@@ -53,6 +55,16 @@ public class ImageContainerDataSet extends DataSet<DataSetInformation> implement
         setPropertyValue(ScreeningConstants.ANALYSIS_PROCEDURE, analysisProcedure);
     }
 
+    public void establishSampleLinkForContainedDataSets()
+    {
+        establishSampleLinkForContainedDataSets = true;
+    }
+
+    public boolean sampleLinkForContainedDataSetsShouldBeEstablished()
+    {
+        return establishSampleLinkForContainedDataSets;
+    }
+
     public DataSet<ImageDataSetInformation> getOriginalDataset()
     {
         return originalDataset;
@@ -80,10 +92,17 @@ public class ImageContainerDataSet extends DataSet<DataSetInformation> implement
         if (originalDataset != null)
         {
             originalDataset.setSample(sampleOrNull);
+            originalDataset.getRegistrationDetails().getDataSetInformation()
+                    .setLinkSample(establishSampleLinkForContainedDataSets);
         }
         for (IDataSet thumbnailDataset : thumbnailDatasets)
         {
             thumbnailDataset.setSample(sampleOrNull);
+            if (thumbnailDatasets instanceof DataSet)
+            {
+                ((DataSet<?>) thumbnailDatasets).getRegistrationDetails().getDataSetInformation()
+                        .setLinkSample(establishSampleLinkForContainedDataSets);
+            }
         }
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v1/IImageDataSet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v1/IImageDataSet.java
index 997f12b2e7347ed6e72775ecd75c56b57c41025c..221f500fa40d9662f4d8ac0d96912dd30f12c9a1 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v1/IImageDataSet.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v1/IImageDataSet.java
@@ -33,4 +33,12 @@ public interface IImageDataSet extends IDataSet
 
     /** Sets analysis procedure. Makes sense only for segmentation datasets. */
     void setAnalysisProcedure(String analysisProcedure);
+    
+    /**
+     * If this method is called the contained data sets (original data set and thumbnails) will
+     * automatically linked to the sample specified by 
+     * {@link IDataSet#setSample(ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISampleImmutable)}.
+     * By default there will be no such links.
+     */
+    void establishSampleLinkForContainedDataSets();
 }