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 9759da99dd5da65495c6f3027b31fca87a71951e..8ca00943510e01c3d2801b1bb9fa3fec08161551 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
@@ -162,11 +162,12 @@ class PutDataSetExecutor implements IDataSetHandlerRpc
     /**
      * Run the put command; does *not* close the input stream — clients of the executor are expected to close the input stream when appropriate.
      * 
+     * @param noOwnerAllowed <code>true</code> if missing data set owner is allowed. This is the case for custom import.
      * @throws IOException
      */
-    public List<DataSetInformation> execute() throws UserFailureException, IOException
+    public List<DataSetInformation> execute(boolean noOwnerAllowed) throws UserFailureException, IOException
     {
-        PutDataSetUtil.checkAccess(sessionToken, getOpenBisService(), newDataSet);
+        PutDataSetUtil.checkAccess(sessionToken, getOpenBisService(), newDataSet, noOwnerAllowed);
 
         writeDataSetToTempDirectory();
         overrideOrNull = null;
@@ -186,7 +187,7 @@ class PutDataSetExecutor implements IDataSetHandlerRpc
      */
     public List<DataSetInformation> executeWithoutWriting() throws UserFailureException
     {
-        PutDataSetUtil.checkAccess(sessionToken, getOpenBisService(), newDataSet);
+        PutDataSetUtil.checkAccess(sessionToken, getOpenBisService(), newDataSet, false);
 
         overrideOrNull = null;
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java
index af25b6b502ff2d3ee584282326d81e6eb03f3565..c5e75e0e6f6faa4670e4ed8c85c0d3236573f544 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java
@@ -156,13 +156,13 @@ public class PutDataSetService
                         new PutDataSetExecutor(this,
                                 ((PutDataSetServerPluginHolder) registrator).getPlugin(),
                                 sessionToken, createNewDataSetDTO(customImportFile),
-                                getAsInputStream(customImportFile)).execute();
+                                getAsInputStream(customImportFile)).execute(true);
             } else
             {
                 infos =
                         new PutDataSetTopLevelDataSetHandler(this, registrator, sessionToken,
                                 createNewDataSetDTO(customImportFile),
-                                getAsInputStream(customImportFile)).execute();
+                                getAsInputStream(customImportFile)).execute(true);
             }
             StringBuilder sb = new StringBuilder();
             for (DataSetInformation info : infos)
@@ -220,12 +220,12 @@ public class PutDataSetService
                 infos =
                         new PutDataSetExecutor(this,
                                 ((PutDataSetServerPluginHolder) registrator).getPlugin(),
-                                sessionToken, newDataSet, inputStream).execute();
+                                sessionToken, newDataSet, inputStream).execute(false);
             } else
             {
                 infos =
                         new PutDataSetTopLevelDataSetHandler(this, registrator, sessionToken,
-                                newDataSet, inputStream).execute();
+                                newDataSet, inputStream).execute(false);
             }
             StringBuilder sb = new StringBuilder();
             for (DataSetInformation info : infos)
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 74c7015ad95f6cc0693e0f3be5fe401e5115f4fb..abc85f9fb6e4117f3b628b2b39a1652661c390ef 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
@@ -173,11 +173,12 @@ class PutDataSetTopLevelDataSetHandler
     /**
      * Run the put command; does *not* close the input stream &mdash; clients of the executor are expected to close the input stream when appropriate.
      * 
+     * @param noOwnerAllowed <code>true</code> if missing data set owner is allowed. This is the case for custom import.
      * @throws IOException
      */
-    public List<DataSetInformation> execute() throws UserFailureException, IOException
+    public List<DataSetInformation> execute(boolean noOwnerAllowed) throws UserFailureException, IOException
     {
-        PutDataSetUtil.checkAccess(sessionToken, getOpenBisService(), newDataSet);
+        PutDataSetUtil.checkAccess(sessionToken, getOpenBisService(), newDataSet, noOwnerAllowed);
 
         writeDataSetToTempDirectory();
 
@@ -198,7 +199,7 @@ class PutDataSetTopLevelDataSetHandler
      */
     public List<DataSetInformation> executeWithoutWriting() throws UserFailureException
     {
-        PutDataSetUtil.checkAccess(sessionToken, getOpenBisService(), newDataSet);
+        PutDataSetUtil.checkAccess(sessionToken, getOpenBisService(), newDataSet, false);
 
         // Register the data set
         try
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetUtil.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetUtil.java
index 558dd67e92a14b134fc1f39be4e98785c4f674da..e4e52ccca45e18ba1379d49a48f5cc6d6c53d2b4 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetUtil.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetUtil.java
@@ -27,7 +27,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO.DataSetO
 public class PutDataSetUtil
 {
 
-    public static void checkAccess(String sessionToken, IEncapsulatedOpenBISService service, NewDataSetDTO newDataSet)
+    public static void checkAccess(String sessionToken, IEncapsulatedOpenBISService service, NewDataSetDTO newDataSet, boolean noOwnerAllowed)
     {
         if (newDataSet == null)
         {
@@ -38,6 +38,10 @@ public class PutDataSetUtil
 
         if (owner == null)
         {
+            if (noOwnerAllowed)
+            {
+                return;
+            }
             throw new UserFailureException("Owner 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 6966523d5fb0f3ce87d9ebc6ab8c94a0504309d1..e833e853cf1d803d5fb74d716e40581cbcc64e1c 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
@@ -182,7 +182,7 @@ public class PutDataSetTopLevelDataSetHandlerTest extends AbstractFileSystemTest
                 new PutDataSetTopLevelDataSetHandler(putDataSetService, registrator, SESSION_TOKEN,
                         newDataSet, inputStream);
 
-        handler.execute();
+        handler.execute(false);
 
         assertEquals("MY-TYPE", dataSetInfoMatcher.recordedObject().getDataSetType().getCode());
         List<NewProperty> dataSetProperties =
@@ -230,7 +230,7 @@ public class PutDataSetTopLevelDataSetHandlerTest extends AbstractFileSystemTest
                 new PutDataSetTopLevelDataSetHandler(putDataSetService, registrator, SESSION_TOKEN,
                         newDataSet, inputStream);
 
-        handler.execute();
+        handler.execute(false);
 
         assertEquals(null, dataSetInfoMatcher.recordedObject().getDataSetType());
         assertEquals(0, dataSetInfoMatcher.recordedObject().getDataSetProperties().size());