diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetLinkedDataExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetLinkedDataExecutor.java
index 729242e4ec3ac97a768486d9955ab7a482aa9d6f..7edb5fd7431ea45c4933a59f2d20016c9aeaa58d 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetLinkedDataExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetLinkedDataExecutor.java
@@ -44,26 +44,30 @@ public class SetDataSetLinkedDataExecutor implements ISetDataSetLinkedDataExecut
         for (Map.Entry<DataSetCreation, DataPE> entry : entitiesMap.entrySet())
         {
             DataSetCreation creation = entry.getKey();
+            LinkedDataCreation linkedCreation = creation.getLinkedData();
             DataPE entity = entry.getValue();
 
             if (entity instanceof LinkDataPE)
             {
-                set(context, creation, (LinkDataPE) entity);
+                if (linkedCreation == null)
+                {
+                    throw new UserFailureException("Linked data cannot be null for a link data set.");
+                }
+                set(context, linkedCreation, (LinkDataPE) entity);
+            } else
+            {
+                if (linkedCreation != null)
+                {
+                    throw new UserFailureException("Linked data cannot be set for a non-link data set.");
+                }
             }
         }
 
         setDataSetExternalDmsExecutor.set(context, entitiesMap);
     }
 
-    private void set(IOperationContext context, DataSetCreation creation, LinkDataPE dataSet)
+    private void set(IOperationContext context, LinkedDataCreation linkedCreation, LinkDataPE dataSet)
     {
-        LinkedDataCreation linkedCreation = creation.getLinkedData();
-
-        if (linkedCreation == null)
-        {
-            throw new UserFailureException("Linked data cannot be null for a link data set.");
-        }
-
         dataSet.setExternalCode(linkedCreation.getExternalCode());
     }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetPhysicalDataExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetPhysicalDataExecutor.java
index 9d9abb1e0e0ee8749c778f296164a6cfde94b5bd..19e6b0d070782a088c3938d5f4dc346f6b55a175 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetPhysicalDataExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/executor/dataset/SetDataSetPhysicalDataExecutor.java
@@ -52,11 +52,22 @@ public class SetDataSetPhysicalDataExecutor implements ISetDataSetPhysicalDataEx
         for (Map.Entry<DataSetCreation, DataPE> entry : entitiesMap.entrySet())
         {
             DataSetCreation creation = entry.getKey();
+            PhysicalDataCreation physicalCreation = creation.getPhysicalData();
             DataPE entity = entry.getValue();
 
             if (entity instanceof ExternalDataPE)
             {
-                set(context, creation, (ExternalDataPE) entity);
+                if (physicalCreation == null)
+                {
+                    throw new UserFailureException("Physical data cannot be null for a physical data set.");
+                }
+                set(context, physicalCreation, (ExternalDataPE) entity);
+            } else
+            {
+                if (physicalCreation != null)
+                {
+                    throw new UserFailureException("Physical data cannot be set for a non-physical data set.");
+                }
             }
         }
 
@@ -65,15 +76,8 @@ public class SetDataSetPhysicalDataExecutor implements ISetDataSetPhysicalDataEx
         setDataSetLocatorTypeExecutor.set(context, entitiesMap);
     }
 
-    private void set(IOperationContext context, DataSetCreation creation, ExternalDataPE dataSet)
+    private void set(IOperationContext context, PhysicalDataCreation physicalCreation, ExternalDataPE dataSet)
     {
-        PhysicalDataCreation physicalCreation = creation.getPhysicalData();
-
-        if (physicalCreation == null)
-        {
-            throw new UserFailureException("Physical data cannot be null for a physical data set.");
-        }
-
         dataSet.setShareId(physicalCreation.getShareId());
         dataSet.setLocation(physicalCreation.getLocation());
 
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 26f6f07fb340f7ecb2d62a6f727769dcd157ee33..d80a3c1fa3a5f38fe8e2bb8dd2bb8ec4a7571d03 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
@@ -952,6 +952,24 @@ public class CreateDataSetTest extends AbstractDataSetTest
         assertNull(dataSet.getLinkedData());
     }
 
+    @Test
+    public void testCreatePhysicalDataSetWithPhysicalDataNotNullAndLinkedDataNotNull()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final DataSetCreation creation = physicalDataSetCreation();
+        creation.setLinkedData(new LinkedDataCreation());
+
+        assertUserFailureException(new IDelegatedAction()
+            {
+                @Override
+                public void execute()
+                {
+                    createDataSet(sessionToken, creation, new DataSetFetchOptions());
+                }
+            }, "Linked data cannot be set for a non-link data set.");
+    }
+
     @Test
     public void testCreatePhysicalDataSetWithPhysicalDataNull()
     {
@@ -1388,6 +1406,42 @@ public class CreateDataSetTest extends AbstractDataSetTest
         assertEquals(dataSet.getContained().iterator().next().getCode(), "20081105092159188-3");
     }
 
+    @Test
+    public void testCreateContainerDataSetWithPhysicalDataNotNull()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final DataSetCreation creation = containerDataSetCreation();
+        creation.setPhysicalData(new PhysicalDataCreation());
+
+        assertUserFailureException(new IDelegatedAction()
+            {
+                @Override
+                public void execute()
+                {
+                    createDataSet(sessionToken, creation, new DataSetFetchOptions());
+                }
+            }, "Physical data cannot be set for a non-physical data set.");
+    }
+
+    @Test
+    public void testCreateContainerDataSetWithLinkedDataNotNull()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final DataSetCreation creation = containerDataSetCreation();
+        creation.setLinkedData(new LinkedDataCreation());
+
+        assertUserFailureException(new IDelegatedAction()
+            {
+                @Override
+                public void execute()
+                {
+                    createDataSet(sessionToken, creation, new DataSetFetchOptions());
+                }
+            }, "Linked data cannot be set for a non-link data set.");
+    }
+
     @Test
     public void testCreateLinkDataSetWithLinkedDataNotNull()
     {
@@ -1421,6 +1475,24 @@ public class CreateDataSetTest extends AbstractDataSetTest
         assertNull(dataSet.getPhysicalData());
     }
 
+    @Test
+    public void testCreateLinkDataSetWithLinkedDataNotNullAndPhyscialDataNotNull()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final DataSetCreation creation = linkDataSetCreation();
+        creation.setPhysicalData(new PhysicalDataCreation());
+
+        assertUserFailureException(new IDelegatedAction()
+            {
+                @Override
+                public void execute()
+                {
+                    createDataSet(sessionToken, creation, new DataSetFetchOptions());
+                }
+            }, "Physical data cannot be set for a non-physical data set.");
+    }
+
     @Test
     public void testCreateLinkDataSetWithLinkedDataNull()
     {