diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainedExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainedExecutor.java
index 145cd88521eb8092e0e0076f81269488ad58abbc..424243e17b6c5d0670b71cdc7ccbd894117609ab 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainedExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainedExecutor.java
@@ -24,6 +24,7 @@ import ch.ethz.sis.openbis.generic.server.api.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.api.v3.executor.entity.AbstractSetEntityToManyRelationExecutor;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.DataSetCreation;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.id.dataset.IDataSetId;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 
 /**
@@ -45,9 +46,18 @@ public class SetDataSetContainedExecutor extends AbstractSetEntityToManyRelation
     {
         context.pushContextDescription("set contained for dataset " + container.getCode());
 
-        for (DataPE aContained : contained)
+        if (false == contained.isEmpty())
         {
-            relationshipService.assignDataSetToContainer(context.getSession(), aContained, container);
+            if (false == container.isContainer())
+            {
+                throw new UserFailureException("Data set " + container.getCode()
+                        + " is not of a container type therefore cannot have contained data sets.");
+            }
+
+            for (DataPE aContained : contained)
+            {
+                relationshipService.assignDataSetToContainer(context.getSession(), aContained, container);
+            }
         }
 
         context.popContextDescription();
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainerExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainerExecutor.java
index 23e158dd7fd18f808d573eeaded2c60c1a5a4247..1faf3cddbc77475cca806388dde8235c60a9ddb6 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainerExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetContainerExecutor.java
@@ -24,6 +24,7 @@ import ch.ethz.sis.openbis.generic.server.api.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.api.v3.executor.entity.AbstractSetEntityToManyRelationExecutor;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.DataSetCreation;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.id.dataset.IDataSetId;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 
 /**
@@ -47,6 +48,11 @@ public class SetDataSetContainerExecutor extends AbstractSetEntityToManyRelation
 
         for (DataPE container : containers)
         {
+            if (false == container.isContainer())
+            {
+                throw new UserFailureException("Data set " + container.getCode()
+                        + " is not of a container type therefore cannot be set as a container of data set " + contained.getCode() + ".");
+            }
             relationshipService.assignDataSetToContainer(context.getSession(), contained, container);
         }
 
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java
index 43cde23180a0ba6b4a2394a2300d499c611e813f..26f6f07fb340f7ecb2d62a6f727769dcd157ee33 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateDataSetTest.java
@@ -581,12 +581,32 @@ public class CreateDataSetTest extends AbstractDataSetTest
     }
 
     @Test
-    public void testCreateWithContainers()
+    public void testCreateWithContainersThatAreNonContainerDataSets()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final DataSetCreation creation = physicalDataSetCreation();
+        creation.setContainerIds(Collections.singletonList(new DataSetPermId("20081105092159111-1")));
+
+        assertUserFailureException(new IDelegatedAction()
+            {
+
+                @Override
+                public void execute()
+                {
+                    v3api.createDataSets(sessionToken, Arrays.asList(creation));
+                }
+            }, "Data set 20081105092159111-1 is not of a container type therefore cannot be set as a container of data set "
+                + creation.getCode().toUpperCase() + ".");
+    }
+
+    @Test
+    public void testCreateWithContainersThatAreContainerDataSets()
     {
         String sessionToken = v3api.login(TEST_USER, PASSWORD);
 
         DataSetCreation creation = physicalDataSetCreation();
-        creation.setContainerIds(Collections.singletonList(new DataSetPermId("20081105092159111-1")));
+        creation.setContainerIds(Collections.singletonList(new DataSetPermId("20110509092359990-10")));
 
         DataSetFetchOptions fo = new DataSetFetchOptions();
         fo.withContainers();
@@ -594,7 +614,7 @@ public class CreateDataSetTest extends AbstractDataSetTest
         DataSet dataSet = createDataSet(sessionToken, creation, fo);
 
         assertEquals(dataSet.getCode(), creation.getCode().toUpperCase());
-        assertDataSetCodes(dataSet.getContainers(), "20081105092159111-1");
+        assertDataSetCodes(dataSet.getContainers(), "20110509092359990-10");
     }
 
     @Test
@@ -602,9 +622,9 @@ public class CreateDataSetTest extends AbstractDataSetTest
     {
         final String sessionToken = v3api.login(TEST_USER, PASSWORD);
 
-        final DataSetCreation creation1 = physicalDataSetCreation();
-        final DataSetCreation creation2 = physicalDataSetCreation();
-        final DataSetCreation creation3 = physicalDataSetCreation();
+        final DataSetCreation creation1 = containerDataSetCreation();
+        final DataSetCreation creation2 = containerDataSetCreation();
+        final DataSetCreation creation3 = containerDataSetCreation();
 
         creation2.setContainerIds(Collections.singletonList(creation1.getCreationId()));
         creation3.setContainerIds(Collections.singletonList(creation2.getCreationId()));
@@ -625,7 +645,7 @@ public class CreateDataSetTest extends AbstractDataSetTest
     {
         final String sessionToken = v3api.loginAs(TEST_USER, PASSWORD, TEST_SPACE_USER);
 
-        final IDataSetId containerId = new DataSetPermId("20081105092159111-1");
+        final IDataSetId containerId = new DataSetPermId("20110509092359990-10");
         final DataSetCreation creation = physicalDataSetCreation();
         creation.setExperimentId(new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
         creation.setContainerIds(Collections.singletonList(containerId));
@@ -641,11 +661,11 @@ public class CreateDataSetTest extends AbstractDataSetTest
     }
 
     @Test
-    public void testCreateWithContained()
+    public void testCreateWithContainedForContainerDataSet()
     {
         String sessionToken = v3api.login(TEST_USER, PASSWORD);
 
-        DataSetCreation creation = physicalDataSetCreation();
+        DataSetCreation creation = containerDataSetCreation();
         creation.setContainedIds(Collections.singletonList(new DataSetPermId("20081105092159111-1")));
 
         DataSetFetchOptions fo = new DataSetFetchOptions();
@@ -657,14 +677,32 @@ public class CreateDataSetTest extends AbstractDataSetTest
         assertDataSetCodes(dataSet.getContained(), "20081105092159111-1");
     }
 
+    @Test
+    public void testCreateWithContainedForNonContainerDataSet()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final DataSetCreation creation = physicalDataSetCreation();
+        creation.setContainedIds(Collections.singletonList(new DataSetPermId("20081105092159111-1")));
+
+        assertUserFailureException(new IDelegatedAction()
+            {
+                @Override
+                public void execute()
+                {
+                    createDataSet(sessionToken, creation, new DataSetFetchOptions());
+                }
+            }, "Data set " + creation.getCode().toUpperCase() + " is not of a container type therefore cannot have contained data sets.");
+    }
+
     @Test
     public void testCreateWithContainedCircularDependency()
     {
         final String sessionToken = v3api.login(TEST_USER, PASSWORD);
 
-        final DataSetCreation creation1 = physicalDataSetCreation();
-        final DataSetCreation creation2 = physicalDataSetCreation();
-        final DataSetCreation creation3 = physicalDataSetCreation();
+        final DataSetCreation creation1 = containerDataSetCreation();
+        final DataSetCreation creation2 = containerDataSetCreation();
+        final DataSetCreation creation3 = containerDataSetCreation();
 
         creation2.setContainedIds(Collections.singletonList(creation1.getCreationId()));
         creation3.setContainedIds(Collections.singletonList(creation2.getCreationId()));
@@ -686,7 +724,7 @@ public class CreateDataSetTest extends AbstractDataSetTest
         final String sessionToken = v3api.loginAs(TEST_USER, PASSWORD, TEST_SPACE_USER);
 
         final IDataSetId containedId = new DataSetPermId("20081105092159111-1");
-        final DataSetCreation creation = physicalDataSetCreation();
+        final DataSetCreation creation = containerDataSetCreation();
         creation.setExperimentId(new ExperimentIdentifier("/TEST-SPACE/TEST-PROJECT/EXP-SPACE-TEST"));
         creation.setContainedIds(Collections.singletonList(containedId));
 
@@ -1477,6 +1515,19 @@ public class CreateDataSetTest extends AbstractDataSetTest
         return creation;
     }
 
+    private DataSetCreation containerDataSetCreation()
+    {
+        String code = UUID.randomUUID().toString();
+
+        DataSetCreation creation = new DataSetCreation();
+        creation.setCode(code);
+        creation.setTypeId(new EntityTypePermId("CONTAINER_TYPE"));
+        creation.setExperimentId(new ExperimentIdentifier("/CISD/NEMO/EXP1"));
+        creation.setDataStoreId(new DataStorePermId("STANDARD"));
+        creation.setCreationId(new CreationId(code));
+        return creation;
+    }
+
     private DataSetCreation linkDataSetCreation()
     {
         String code = UUID.randomUUID().toString();
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapDataSetTest.java
index 9cf0308b3233360cf85824de18728f24f8ce52b9..45961a327e6fb471ebc4509e2e54406f33b718b7 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapDataSetTest.java
@@ -510,7 +510,7 @@ public class MapDataSetTest extends AbstractDataSetTest
     }
 
     @Test
-    public void testMapWithExternalDataForPhysicalDataSet()
+    public void testMapWithPhysicalDataForPhysicalDataSet()
     {
         String sessionToken = v3api.login(TEST_USER, PASSWORD);
 
@@ -564,7 +564,7 @@ public class MapDataSetTest extends AbstractDataSetTest
     }
 
     @Test
-    public void testMapWithExternalDataForContainerDataSet()
+    public void testMapWithPhysicalDataForContainerDataSet()
     {
         String sessionToken = v3api.login(TEST_USER, PASSWORD);