diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java
index 9c49098797c392a49d8fc47868b18fb1bf622ccb..14515927b662529d6db8147e1b8ec1fc1295f1d8 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java
@@ -57,6 +57,7 @@ import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
 import ch.systemsx.cisd.etlserver.ITypeExtractor;
 import ch.systemsx.cisd.etlserver.validation.IDataSetValidator;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.authorization.NewDataSetPredicate;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.FileInfoDssDTO;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO.DataSetOwner;
@@ -166,6 +167,8 @@ class PutDataSetExecutor implements IDataSetHandlerRpc
      */
     public List<DataSetInformation> execute() throws UserFailureException, IOException
     {
+        NewDataSetPredicate.evaluate(sessionToken, getOpenBisService(), newDataSet);
+
         writeDataSetToTempDirectory();
         overrideOrNull = null;
 
@@ -184,6 +187,8 @@ class PutDataSetExecutor implements IDataSetHandlerRpc
      */
     public List<DataSetInformation> executeWithoutWriting() throws UserFailureException
     {
+        NewDataSetPredicate.evaluate(sessionToken, getOpenBisService(), newDataSet);
+
         overrideOrNull = null;
 
         // Register the data set
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java
index 8c53db59aa7b51ee4c09a5d2ab86d8533b4f2acf..dab3e7a6031258677c75e8a3f3351bc9ea6e44a0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java
@@ -37,6 +37,7 @@ import ch.systemsx.cisd.etlserver.ITopLevelDataSetRegistrator;
 import ch.systemsx.cisd.etlserver.ITopLevelDataSetRegistratorDelegate;
 import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationPreStagingBehavior;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.authorization.NewDataSetPredicate;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.FileInfoDssDTO;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO.DataSetOwner;
@@ -177,6 +178,8 @@ class PutDataSetTopLevelDataSetHandler
      */
     public List<DataSetInformation> execute() throws UserFailureException, IOException
     {
+        NewDataSetPredicate.evaluate(sessionToken, getOpenBisService(), newDataSet);
+
         writeDataSetToTempDirectory();
 
         // Register the data set
@@ -189,7 +192,6 @@ class PutDataSetTopLevelDataSetHandler
         {
             deleteDataSetDir();
         }
-
     }
 
     /**
@@ -197,6 +199,8 @@ class PutDataSetTopLevelDataSetHandler
      */
     public List<DataSetInformation> executeWithoutWriting() throws UserFailureException
     {
+        NewDataSetPredicate.evaluate(sessionToken, getOpenBisService(), newDataSet);
+
         // Register the data set
         try
         {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/authorization/NewDataSetPredicate.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/authorization/NewDataSetPredicate.java
index 9ccc324f3643d2a472896d4454d1cc648adefbc8..255d3b71c924114de79b97fd003ef6a96d1538c0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/authorization/NewDataSetPredicate.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/authorization/NewDataSetPredicate.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.authorization.IAuthorizationGuardPredicate;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
@@ -47,6 +48,8 @@ public class NewDataSetPredicate implements
     public Status evaluate(IDssServiceRpcGeneric receiver, String sessionToken,
             NewDataSetDTO newDataSet) throws UserFailureException
     {
+        checkNewDataSet(newDataSet);
+
         DataSetOwner owner = newDataSet.getDataSetOwner();
         String ownerIdentifier = owner.getIdentifier();
 
@@ -60,6 +63,50 @@ public class NewDataSetPredicate implements
                 return DssSessionAuthorizationHolder.getAuthorizer().checkDatasetAccess(sessionToken, ownerIdentifier);
         }
 
-        return null; // impossible!
+        return null;
+    }
+
+    public static void evaluate(String sessionToken, IEncapsulatedOpenBISService service, NewDataSetDTO newDataSet)
+    {
+        checkNewDataSet(newDataSet);
+
+        DataSetOwner owner = newDataSet.getDataSetOwner();
+        String ownerIdentifier = owner.getIdentifier();
+
+        switch (owner.getType())
+        {
+            case EXPERIMENT:
+                service.checkExperimentAccess(sessionToken, ownerIdentifier);
+                break;
+            case SAMPLE:
+                service.checkSampleAccess(sessionToken, ownerIdentifier);
+                break;
+            case DATA_SET:
+                service.checkDataSetAccess(sessionToken, ownerIdentifier);
+                break;
+        }
+    }
+
+    private static void checkNewDataSet(NewDataSetDTO newDataSet)
+    {
+        if (newDataSet == null)
+        {
+            throw new UserFailureException("New data set cannot be null");
+        }
+
+        DataSetOwner owner = newDataSet.getDataSetOwner();
+
+        if (owner == null)
+        {
+            throw new UserFailureException("Owner of a new data set cannot be null");
+        }
+
+        String ownerIdentifier = owner.getIdentifier();
+
+        if (ownerIdentifier == null)
+        {
+            throw new UserFailureException("Owner identifier of a new data set cannot be null");
+        }
     }
+
 }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandlerTest.java
index 3d238b349c15cb4dd4f4adca27067a3280007254..6966523d5fb0f3ce87d9ebc6ab8c94a0504309d1 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandlerTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandlerTest.java
@@ -161,9 +161,7 @@ public class PutDataSetTopLevelDataSetHandlerTest extends AbstractFileSystemTest
                     one(service).createPermId();
                     will(returnValue(DATA_SET_CODE));
 
-                    one(service).checkSpaceAccess(
-                            SESSION_TOKEN,
-                            new SpaceIdentifier(experimentIdentifier.getSpaceCode()));
+                    one(service).checkExperimentAccess(SESSION_TOKEN, experimentIdentifier.toString());
                 }
             });
         RecordingMatcher<DataSetInformation> dataSetInfoMatcher =
@@ -210,7 +208,7 @@ public class PutDataSetTopLevelDataSetHandlerTest extends AbstractFileSystemTest
                     one(service).createPermId();
                     will(returnValue(DATA_SET_CODE));
 
-                    one(service).checkSpaceAccess(SESSION_TOKEN, sampleIdentifier.getSpaceLevel());
+                    one(service).checkSampleAccess(SESSION_TOKEN, sampleIdentifier.toString());
                 }
             });
         RecordingMatcher<DataSetInformation> dataSetInfoMatcher =
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DssServiceRpcV1Test.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DssServiceRpcV1Test.java
index 40079c25f0836c8d2e6cbfd8d804bd8c2f085c09..eed468d64d4c18d27937d6c63641832322d5468a 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DssServiceRpcV1Test.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DssServiceRpcV1Test.java
@@ -307,8 +307,8 @@ public class DssServiceRpcV1Test extends AbstractFileSystemTestCase
         context.checking(new Expectations()
             {
                 {
-                    atLeast(1).of(openBisService).checkSpaceAccess(with(SESSION_TOKEN),
-                            with(spaceIdentifier));
+                    atLeast(1).of(openBisService).checkSampleAccess(SESSION_TOKEN, NEW_DATA_SET_OWNER_ID);
+
                     one(dataSetRegistrator).handle(with(fileMatcher), with(SESSION_TOKEN),
                             with(dataSetInfoMatcher), with(delegateMatcher));
                     will(new CustomAction("Notify the delegate")