diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSet.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSet.java
index cb6184b35860111995e1307d297b589ab10d1353..3def5731dff8b77398594a1d5bfbddb7157f3f42 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSet.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSet.java
@@ -102,10 +102,10 @@ public interface IDataSet
      * Set the data set type.
      */
     public void setDataSetType(String dataSetTypeCode);
-    
+
     /**
-     * Returns the speed hint. If it hasn't been set by {@link #setSpeedHint(int)} the default
-     * value {@link Constants#DEFAULT_SPEED_HINT} will be returned.
+     * Returns the speed hint. If it hasn't been set by {@link #setSpeedHint(int)} the default value
+     * {@link Constants#DEFAULT_SPEED_HINT} will be returned.
      */
     public int getSpeedHint();
 
@@ -122,17 +122,29 @@ public interface IDataSet
     /**
      * Get the value for a property.
      */
-    String getPropertyValue(String propertyCode);
+    public String getPropertyValue(String propertyCode);
 
     /**
      * Set the value for a property.
      */
-    void setPropertyValue(String propertyCode, String propertyValue);
+    public void setPropertyValue(String propertyCode, String propertyValue);
 
     /** Sets the parents of the dataset. */
-    void setParentDatasets(List<String> parentDatasetCodes);
+    public void setParentDatasets(List<String> parentDatasetCodes);
 
-    /** Sets the parents of the dataset. */
-    List<String> getParentDatasets();
+    /** Gets the parents of the dataset. */
+    public List<String> getParentDatasets();
+
+    // Methods relating to container data sets which contain other data sets
+    /** Return true if this data set contains other data sets. */
+    public boolean isContainerDataSet();
+
+    /**
+     * Get the codes for contained data sets. This is empty if {@link #isContainerDataSet()} returns
+     * false.
+     */
+    public List<String> getContainedDataSetCodes();
 
+    /** Set the codes for contained data sets. */
+    public void setContainedDataSetCodes(List<String> containedDataSetCodes);
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
index 0e528f15f2717d0acd7c22b946998c95354a4234..4a53da953fcb52ff2502a1b78013803e5d0a4fc5 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
@@ -29,6 +29,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewProject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSpace;
+import ch.systemsx.cisd.openbis.generic.shared.dto.NewContainerDataSet;
+import ch.systemsx.cisd.openbis.generic.shared.dto.NewDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
@@ -101,24 +103,32 @@ public class ConversionUtils
             StorageFormat storageFormat, String dataFileRelativePath)
     {
         DataSetInformation dataSetInformation = registrationDetails.getDataSetInformation();
-        final NewExternalData data = new NewExternalData();
+        final NewExternalData data;
+        if (dataSetInformation.isContainerDataSet())
+        {
+            data = new NewContainerDataSet();
+            ((NewContainerDataSet) data).setContainedDataSetCodes(dataSetInformation
+                    .getContainedDataSetCodes());
+        } else
+        {
+            data = new NewDataSet();
+            data.setSpeedHint(dataSetInformation.getSpeedHint());
+            final BooleanOrUnknown isCompleteFlag = dataSetInformation.getIsCompleteFlag();
+            data.setComplete(isCompleteFlag);
+            data.setLocatorType(registrationDetails.getLocatorType());
+            data.setShareId(dataSetInformation.getShareId());
+            data.setLocation(dataFileRelativePath.substring(data.getShareId().length() + 1));
+            data.setFileFormatType(registrationDetails.getFileFormatType());
+        }
         data.setUserId(dataSetInformation.getUploadingUserIdOrNull());
         data.setUserEMail(dataSetInformation.tryGetUploadingUserEmail());
         data.setExtractableData(dataSetInformation.getExtractableData());
         data.setDataSetType(registrationDetails.getDataSetType());
-        data.setSpeedHint(dataSetInformation.getSpeedHint());
-        data.setFileFormatType(registrationDetails.getFileFormatType());
         data.setMeasured(registrationDetails.isMeasuredData());
         data.setDataStoreCode(dataStoreCode);
         data.setExperimentIdentifierOrNull(dataSetInformation.getExperimentIdentifier());
         data.setSampleIdentifierOrNull(dataSetInformation.getSampleIdentifier());
 
-        final BooleanOrUnknown isCompleteFlag = dataSetInformation.getIsCompleteFlag();
-
-        data.setComplete(isCompleteFlag);
-        data.setLocatorType(registrationDetails.getLocatorType());
-        data.setShareId(dataSetInformation.getShareId());
-        data.setLocation(dataFileRelativePath.substring(data.getShareId().length() + 1));
         data.setStorageFormat(storageFormat);
 
         List<NewProperty> newProperties =
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSet.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSet.java
index 54ba15ea24f2324b336d17177cd2980779cffd23..690da1f0b798b0b8f6bc52bda6eb233d6cfa63a1 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSet.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSet.java
@@ -17,6 +17,8 @@
 package ch.systemsx.cisd.etlserver.registrator.api.v1.impl;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
@@ -191,4 +193,23 @@ public class DataSet<T extends DataSetInformation> implements IDataSet
     {
         return registrationDetails.getDataSetInformation().getParentDataSetCodes();
     }
+
+    public boolean isContainerDataSet()
+    {
+        return registrationDetails.getDataSetInformation().isContainerDataSet();
+    }
+
+    public List<String> getContainedDataSetCodes()
+    {
+        return Collections.unmodifiableList(registrationDetails.getDataSetInformation()
+                .getContainedDataSetCodes());
+    }
+
+    public void setContainedDataSetCodes(List<String> containedDataSetCodes)
+    {
+        ArrayList<String> newContainedDataSetCodes = new ArrayList<String>(containedDataSetCodes);
+        registrationDetails.getDataSetInformation().setContainedDataSetCodes(
+                newContainedDataSetCodes);
+
+    }
 }
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 bf1ccfa7be2d8c8977336a38364eecb5aa648ac0..41e332fb7d837266fb8882b58d1f46426b4c0970 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
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.dss.generic.shared.dto;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -54,7 +55,7 @@ public class DataSetInformation implements Serializable
     private IEntityProperty[] topSampleProperties = IEntityProperty.EMPTY_ARRAY;
 
     private DataSetType dataSetType;
-    
+
     private int speedHint = ch.systemsx.cisd.openbis.generic.shared.Constants.DEFAULT_SPEED_HINT;
 
     private String shareId;
@@ -81,6 +82,8 @@ public class DataSetInformation implements Serializable
 
     private BooleanOrUnknown isCompleteFlag = BooleanOrUnknown.U;
 
+    private List<String> containedDataSetCodes = new ArrayList<String>();
+
     /**
      * A subset of {@link NewExternalData} which gets set by the code extractor.
      * <p>
@@ -337,6 +340,21 @@ public class DataSetInformation implements Serializable
         return extractableData.getDataSetProperties();
     }
 
+    public List<String> getContainedDataSetCodes()
+    {
+        return containedDataSetCodes;
+    }
+
+    public void setContainedDataSetCodes(List<String> containedDataSetCodes)
+    {
+        this.containedDataSetCodes = containedDataSetCodes;
+    }
+
+    public boolean isContainerDataSet()
+    {
+        return false == containedDataSetCodes.isEmpty();
+    }
+
     public final String describe()
     {
         if (experimentIdentifier == null)