diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java
index 30aaf1ed9f89fbb5bce1b7f1084e24570ab1b87f..d6ee954acf4d1ac15a2605204271dae22a46a862 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java
@@ -47,6 +47,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample.SampleInitializ
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Vocabulary.VocabularyInitializer;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.VocabularyTerm;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -331,6 +332,21 @@ public class Translator
             initializer.putProperty(prop.getPropertyType().getCode(), prop.tryGetAsString());
         }
 
+        initializer.setContainerDataSet(externalDatum.isContainer());
+        if (externalDatum.isContainer())
+        {
+            // Recursively translate any contained data sets
+            ContainerDataSet containerDataSet = externalDatum.tryGetAsContainerDataSet();
+
+            ArrayList<DataSet> containedDataSetCodes =
+                    new ArrayList<DataSet>(containerDataSet.getContainedDataSets().size());
+            for (ExternalData containedDataSet : containerDataSet.getContainedDataSets())
+            {
+                containedDataSetCodes.add(translate(containedDataSet, connectionsToGet));
+            }
+            initializer.setContainedDataSets(containedDataSetCodes);
+        }
+
         initializer.setRetrievedConnections(connectionsToGet);
         for (Connections connection : connectionsToGet)
         {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
index 371eba9e818349fa93fd336078893793f52280e2..2a9231134524870077d31894a84c7b12d8062f53 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
@@ -24,12 +24,12 @@ import org.testng.AssertJUnit;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.Translator;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ContainerDataSetBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleBuilder;
@@ -43,6 +43,8 @@ public class TranslatorTest extends AssertJUnit
 
     private DataSetBuilder ds2;
 
+    private ContainerDataSetBuilder dsContainer;
+
     @BeforeMethod
     public void setUp()
     {
@@ -55,6 +57,25 @@ public class TranslatorTest extends AssertJUnit
         ds2 =
                 new DataSetBuilder().code("ds2").type("T2").experiment(experiment)
                         .property("B", "true");
+
+        dsContainer =
+                new ContainerDataSetBuilder().code("ds-container").type("T3")
+                        .experiment(experiment).sample(sample).contains(ds1.getDataSet())
+                        .contains(ds2.getDataSet());
+
+    }
+
+    @Test
+    public void testTranslateContainerDataSetWithNoConnectionsAndRetrievingNoConnections()
+    {
+        DataSet translated =
+                Translator.translate(dsContainer.getContainerDataSet(),
+                        EnumSet.noneOf(DataSet.Connections.class));
+        assertTrue(translated.isContainerDataSet());
+        assertBasicAttributes(ds1.getDataSet(), translated.getContainedDataSets().get(0));
+        assertBasicAttributes(ds2.getDataSet(), translated.getContainedDataSets().get(1));
+        assertChildrenNotRetrieved(translated);
+        assertParentsNotRetrieved(translated);
     }
 
     @Test
@@ -143,6 +164,7 @@ public class TranslatorTest extends AssertJUnit
                     translatedProperties.get(property.getPropertyType().getCode()));
         }
         assertEquals(originalProperties.size(), translatedProperties.size());
+        assertEquals(originalDataSet.isContainer(), translatedDataSet.isContainerDataSet());
     }
 
     private void assertChildrenNotRetrieved(DataSet dataSet)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/AbstractDataSetBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/AbstractDataSetBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..865c7fee8e02a51b137490f8c0151dda09db780d
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/AbstractDataSetBuilder.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2012 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.systemsx.cisd.openbis.generic.shared.basic.dto.builders;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+
+/**
+ * @author Chandrasekhar Ramakrishnan
+ */
+public abstract class AbstractDataSetBuilder<T extends AbstractDataSetBuilder<?>>
+{
+
+    protected final ExternalData dataSet;
+
+    /**
+     * Return this object typed to the concrete class. This is a subclass responsibility.
+     */
+    abstract protected T asConcreteSubclass();
+
+    /**
+     * Constructor that takes a concrete data set class as an argument.
+     */
+    protected AbstractDataSetBuilder(ExternalData concreteDataSet)
+    {
+        super();
+        this.dataSet = concreteDataSet;
+        dataSet.setDataSetProperties(new ArrayList<IEntityProperty>());
+    }
+
+    public T code(String code)
+    {
+        dataSet.setCode(code);
+        return asConcreteSubclass();
+    }
+
+    public T type(String dataSetTypeCode)
+    {
+        dataSet.setDataSetType(new DataSetType(dataSetTypeCode));
+        return asConcreteSubclass();
+    }
+
+    public T experiment(Experiment experiment)
+    {
+        dataSet.setExperiment(experiment);
+        return asConcreteSubclass();
+    }
+
+    public T sample(Sample sample)
+    {
+        dataSet.setSample(sample);
+        return asConcreteSubclass();
+    }
+
+    public T store(DataStore dataStore)
+    {
+        dataSet.setDataStore(dataStore);
+        return asConcreteSubclass();
+    }
+
+    public T size(long size)
+    {
+        dataSet.setSize(size);
+        return asConcreteSubclass();
+    }
+
+    public PropertyBuilder property(String key)
+    {
+        List<IEntityProperty> properties = dataSet.getProperties();
+        PropertyBuilder propertyBuilder = new PropertyBuilder(key);
+        properties.add(propertyBuilder.getProperty());
+        return propertyBuilder;
+    }
+
+    public T property(String key, String value)
+    {
+        property(key).value(value);
+        return asConcreteSubclass();
+    }
+
+    public T registrationDate(Date registrationDate)
+    {
+        dataSet.setRegistrationDate(registrationDate);
+        return asConcreteSubclass();
+    }
+
+    public T modificationDate(Date modificationDate)
+    {
+        dataSet.setModificationDate(modificationDate);
+        return asConcreteSubclass();
+    }
+
+    public T parent(DataSet parent)
+    {
+        Collection<ExternalData> parents = dataSet.getParents();
+        if (parents == null)
+        {
+            parents = new ArrayList<ExternalData>();
+            dataSet.setParents(parents);
+        }
+        parents.add(parent);
+        return asConcreteSubclass();
+    }
+
+    public T child(DataSet child)
+    {
+        List<ExternalData> children = dataSet.getChildren();
+        if (children == null)
+        {
+            children = new ArrayList<ExternalData>();
+            dataSet.setChildren(children);
+        }
+        children.add(child);
+        return asConcreteSubclass();
+    }
+
+}
\ No newline at end of file
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/ContainerDataSetBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/ContainerDataSetBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..7455ca039b4b6b3b8c83a7a4f8b9360f84fa5d4d
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/ContainerDataSetBuilder.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2011 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.systemsx.cisd.openbis.generic.shared.basic.dto.builders;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+
+/**
+ * Builder class for creating an instance of {@link DataSet} or {@link ContainerDataSet}.
+ * 
+ * @author Franz-Josef Elmer
+ */
+public class ContainerDataSetBuilder extends AbstractDataSetBuilder<ContainerDataSetBuilder>
+{
+    public ContainerDataSetBuilder()
+    {
+        super(new ContainerDataSet());
+    }
+
+    public ContainerDataSetBuilder(long id)
+    {
+        this();
+        dataSet.setId(id);
+    }
+
+    public final ContainerDataSet getContainerDataSet()
+    {
+        return dataSet.tryGetAsContainerDataSet();
+    }
+
+    public ContainerDataSetBuilder contains(DataSet contained)
+    {
+        List<ExternalData> containedDataSets =
+                dataSet.tryGetAsContainerDataSet().getContainedDataSets();
+        if (containedDataSets == null)
+        {
+            containedDataSets = new ArrayList<ExternalData>();
+            dataSet.tryGetAsContainerDataSet().setContainedDataSets(containedDataSets);
+        }
+        containedDataSets.add(contained);
+        return asConcreteSubclass();
+    }
+
+    @Override
+    protected ContainerDataSetBuilder asConcreteSubclass()
+    {
+        return this;
+    }
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/DataSetBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/DataSetBuilder.java
index 195caac5945a6824e6281ff28fe6423b14984543..9d5403d5a21bbed030e630d691b1f65950120709 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/DataSetBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/DataSetBuilder.java
@@ -16,34 +16,21 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 /**
- * Builder class for creating an instance of {@link DataSet}.
+ * Builder class for creating an instance of {@link DataSet} or {@link ContainerDataSet}.
  * 
  * @author Franz-Josef Elmer
  */
-public class DataSetBuilder
+public class DataSetBuilder extends AbstractDataSetBuilder<DataSetBuilder>
 {
-    private final DataSet dataSet;
-
     public DataSetBuilder()
     {
-        dataSet = new DataSet();
-        dataSet.setDataSetProperties(new ArrayList<IEntityProperty>());
+        super(new DataSet());
     }
 
     public DataSetBuilder(long id)
@@ -52,119 +39,38 @@ public class DataSetBuilder
         dataSet.setId(id);
     }
 
-    public DataSetBuilder code(String code)
-    {
-        dataSet.setCode(code);
-        return this;
-    }
-
-    public DataSetBuilder type(String dataSetTypeCode)
-    {
-        dataSet.setDataSetType(new DataSetType(dataSetTypeCode));
-        return this;
-    }
-
     public DataSetBuilder location(String location)
     {
-        dataSet.setLocation(location);
-        return this;
-    }
-
-    public DataSetBuilder experiment(Experiment experiment)
-    {
-        dataSet.setExperiment(experiment);
-        return this;
-    }
-
-    public DataSetBuilder sample(Sample sample)
-    {
-        dataSet.setSample(sample);
-        return this;
-    }
-
-    public DataSetBuilder store(DataStore dataStore)
-    {
-        dataSet.setDataStore(dataStore);
+        dataSet.tryGetAsDataSet().setLocation(location);
         return this;
     }
 
     public DataSetBuilder shareID(String shareID)
     {
-        dataSet.setShareId(shareID);
+        dataSet.tryGetAsDataSet().setShareId(shareID);
         return this;
     }
 
     public DataSetBuilder fileFormat(String fileFormatType)
     {
-        dataSet.setFileFormatType(new FileFormatType(fileFormatType));
+        dataSet.tryGetAsDataSet().setFileFormatType(new FileFormatType(fileFormatType));
         return this;
     }
 
     public DataSetBuilder status(DataSetArchivingStatus status)
     {
-        dataSet.setStatus(status);
-        return this;
-    }
-
-    public DataSetBuilder size(long size)
-    {
-        dataSet.setSize(size);
-        return this;
-    }
-
-    public PropertyBuilder property(String key)
-    {
-        List<IEntityProperty> properties = dataSet.getProperties();
-        PropertyBuilder propertyBuilder = new PropertyBuilder(key);
-        properties.add(propertyBuilder.getProperty());
-        return propertyBuilder;
-    }
-
-    public DataSetBuilder property(String key, String value)
-    {
-        property(key).value(value);
-        return this;
-    }
-
-    public DataSetBuilder registrationDate(Date registrationDate)
-    {
-        dataSet.setRegistrationDate(registrationDate);
-        return this;
-    }
-
-    public DataSetBuilder modificationDate(Date modificationDate)
-    {
-        dataSet.setModificationDate(modificationDate);
+        dataSet.tryGetAsDataSet().setStatus(status);
         return this;
     }
 
-    public DataSetBuilder parent(DataSet parent)
+    public final DataSet getDataSet()
     {
-        Collection<ExternalData> parents = dataSet.getParents();
-        if (parents == null)
-        {
-            parents = new ArrayList<ExternalData>();
-            dataSet.setParents(parents);
-        }
-        parents.add(parent);
-        return this;
+        return dataSet.tryGetAsDataSet();
     }
 
-    public DataSetBuilder child(DataSet child)
+    @Override
+    protected DataSetBuilder asConcreteSubclass()
     {
-        List<ExternalData> children = dataSet.getChildren();
-        if (children == null)
-        {
-            children = new ArrayList<ExternalData>();
-            dataSet.setChildren(children);
-        }
-        children.add(child);
         return this;
     }
-
-    public final DataSet getDataSet()
-    {
-        return dataSet;
-    }
-
 }