diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index c0b4ee53fe9bf4e5bf855fbebd24d24a678fc254..b1b62954dddb55562d3cab0b15931af16c6b771c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -57,6 +57,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AuthorizationGroupUpdat
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchOperationKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
@@ -1272,7 +1273,7 @@ public interface ICommonClientService extends IClientService
     /**
      * Performs custom import operation
      */
-    public String performCustomImport(String sessionKey, String customImportCode)
+    public List<BatchRegistrationResult> performCustomImport(String sessionKey, String customImportCode, boolean async, String userEmail)
             throws UserFailureException;
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index 2fa01d41886fa64266a39d68ffaad68b5da7cd37..577af9a17191c64aec0ff8ba316383ad9b259eef 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -59,6 +59,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AuthorizationGroupUpdat
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchOperationKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
@@ -1161,10 +1162,10 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     public void emptyTrash(boolean forceDisallowedTypes, AsyncCallback<Void> callback);
 
     /**
-     * @see ICommonClientService#performCustomImport(String, String)
+     * @see ICommonClientService#performCustomImport(String, String, boolean, String)
      */
-    public void performCustomImport(String sessionKey, String customImportCode,
-            AsyncCallback<String> callback)
+    public void performCustomImport(String sessionKey, String customImportCode, boolean async, String userEmail,
+            final AsyncCallback<List<BatchRegistrationResult>> asyncCallback)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractBatchRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractBatchRegistrationForm.java
index 48ebd48ab34979cf3ae5d44137a07ef765dd1e93..9bf42f1af465b4089e03c6e5c69aabd87684fc38 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractBatchRegistrationForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractBatchRegistrationForm.java
@@ -66,7 +66,7 @@ public abstract class AbstractBatchRegistrationForm extends AbstractRegistration
 
     protected final String sessionKey;
 
-    protected final LabelField templateField;
+    protected Field<?> templateField;
 
     protected final BasicFileFieldManager fileFieldsManager;
 
@@ -205,7 +205,7 @@ public abstract class AbstractBatchRegistrationForm extends AbstractRegistration
         return field;
     }
 
-    protected LabelField createTemplateField()
+    protected Field<?> createTemplateField()
     {
         LabelField result =
                 new LabelField(LinkRenderer.renderAsLink(viewContext
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CustomImportForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CustomImportForm.java
index ab9927869bc88faaff27fc65804b5423aa4c0e59..914c36f3e1d71fdb3cd95e536116bedc3ab0ae4f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CustomImportForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CustomImportForm.java
@@ -16,17 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui;
 
-import static ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareField.wrapUnaware;
-
-import java.util.Arrays;
-import java.util.List;
-
 import com.extjs.gxt.ui.client.event.BaseEvent;
 import com.extjs.gxt.ui.client.event.Events;
-import com.extjs.gxt.ui.client.event.FormEvent;
 import com.extjs.gxt.ui.client.event.Listener;
 import com.extjs.gxt.ui.client.widget.form.Field;
-import com.extjs.gxt.ui.client.widget.form.FileUploadField;
 import com.extjs.gxt.ui.client.widget.form.LabelField;
 import com.extjs.gxt.ui.client.widget.form.MultiField;
 import com.google.gwt.user.client.Event;
@@ -35,11 +28,8 @@ import com.google.gwt.user.client.Window;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.FormPanelListener;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.file.BasicFileFieldManager;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.HtmlMessageElement;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.PermlinkUtilities;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentHolderKind;
@@ -50,20 +40,11 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 /**
  * @author Pawel Glyzewski
  */
-public class CustomImportForm extends AbstractRegistrationForm
+public class CustomImportForm extends AbstractBatchRegistrationForm
 {
-    private static final String FIELD_LABEL_TEMPLATE = "File";
-
-    private static final int NUMBER_OF_FIELDS = 1;
-
-    private final String sessionKey;
 
     private final CustomImport customImport;
 
-    private final IViewContext<ICommonClientServiceAsync> viewContext;
-
-    private final BasicFileFieldManager fileFieldsManager;
-
     /**
      * @param viewContext
      * @param id
@@ -71,93 +52,28 @@ public class CustomImportForm extends AbstractRegistrationForm
     public CustomImportForm(IViewContext<ICommonClientServiceAsync> viewContext, String id,
             CustomImport customImport)
     {
-        super(viewContext, id);
+        super(viewContext.getCommonViewContext(), id, id + "-" + customImport.getCode());
 
-        saveButton.setText(messageProvider.getMessage(Dict.BUTTON_UPLOAD));
         setResetButtonVisible(true);
         setDirtyCheckEnabled(false);
 
-        this.sessionKey = id + "-" + customImport.getCode();
         this.customImport = customImport;
-        this.viewContext = viewContext;
 
         if (isTemplateAvailable())
         {
             MultiField<Object> multifield =
-                    new MultiField<Object>("", createTemplateField(),
+                    new MultiField<Object>("", createTemplateLinkField(),
                             createEntityWithTemplateField());
             multifield.setLabelSeparator("");
-            formPanel.add(multifield);
-        }
-
-        fileFieldsManager =
-                new BasicFileFieldManager(sessionKey, NUMBER_OF_FIELDS, FIELD_LABEL_TEMPLATE);
-        fileFieldsManager.setMandatory();
-        for (FileUploadField field : fileFieldsManager.getFields())
-        {
-            formPanel.add(wrapUnaware((Field<?>) field).get());
+            this.templateField = multifield;
         }
-        addUploadFeatures(sessionKey);
-
-        formPanel.addListener(Events.BeforeSubmit, new Listener<FormEvent>()
-            {
-                @Override
-                public void handleEvent(FormEvent be)
-                {
-                    infoBox.displayProgress(messageProvider.getMessage(Dict.PROGRESS_UPLOADING));
-                }
-            });
-
-        formPanel.addListener(Events.Submit, new FormPanelListener(infoBox)
-            {
-                @Override
-                protected void setUploadEnabled()
-                {
-                    CustomImportForm.this.setUploadEnabled(true);
-                }
-
-                @Override
-                protected void onSuccessfullUpload()
-                {
-                    infoBox.displayProgress(messageProvider.getMessage(Dict.PROGRESS_PROCESSING));
-
-                    CustomImportForm.this.viewContext.getCommonService().performCustomImport(
-                            sessionKey,
-                            CustomImportForm.this.customImport.getCode(),
-                            new AbstractRegistrationCallback<String>(
-                                    CustomImportForm.this.viewContext)
-                                {
-                                    @Override
-                                    protected void process(String result)
-                                    {
-                                        super.process(result);
-                                        resetPanel();
-                                    }
-
-                                    @Override
-                                    protected List<HtmlMessageElement> createSuccessfullRegistrationInfo(String result)
-                                    {
-                                        return Arrays.asList(new HtmlMessageElement(result + " succesfully uploaded to the datastore server."));
-                                    }
-
-                                    @Override
-                                    public void finishOnFailure(Throwable caught)
-                                    {
-                                        super.finishOnFailure(caught);
-                                        resetPanel();
-                                    }
-
-                                });
-
-                }
-            });
     }
 
     @Override
-    protected void submitValidForm()
+    protected void save()
     {
-        CustomImportForm.this.setUploadEnabled(false);
-        formPanel.submit();
+        CustomImportForm.this.viewContext.getCommonService().performCustomImport(sessionKey, CustomImportForm.this.customImport.getCode(), isAsync(),
+                emailField.getValue(), new BatchRegistrationCallback(this.viewContext));
     }
 
     private boolean isTemplateAvailable()
@@ -166,9 +82,8 @@ public class CustomImportForm extends AbstractRegistrationForm
                 && getTemplateAttachmentName() != null;
     }
 
-    private Field<?> createTemplateField()
+    private Field<?> createTemplateLinkField()
     {
-
         LabelField linkToTemplate =
                 new LabelField(LinkRenderer.renderAsLink(viewContext
                         .getMessage(Dict.FILE_TEMPLATE_LABEL)));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index b6433a283628f0e9eabad69aeb170348dfe6d802..6fe8c846a368db223fc48467bbfbbb9b01af86b4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -119,6 +119,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AsyncBatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Attachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentHolderKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentVersions;
@@ -127,6 +128,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AuthorizationGroupUpdat
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchOperationKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CustomImportFile;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelatedEntities;
@@ -2707,7 +2709,7 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     @Override
-    public String performCustomImport(String sessionKey, String customImportCode)
+    public List<BatchRegistrationResult> performCustomImport(String sessionKey, String customImportCode, boolean async, String userEmail)
     {
         HttpSession httpSession = getHttpSession();
         UploadedFilesBean uploadedFiles = null;
@@ -2715,8 +2717,19 @@ public final class CommonClientService extends AbstractClientService implements
         {
             uploadedFiles = (UploadedFilesBean) httpSession.getAttribute(sessionKey);
             abortIfMaxSizeExceeded(uploadedFiles);
-            return commonServer.performCustomImport(getSessionToken(), customImportCode,
-                    getCustomImportFile(uploadedFiles));
+
+            CustomImportFile customImportFile = getCustomImportFile(uploadedFiles);
+
+            if (async)
+            {
+                commonServer.performCustomImportAsync(getSessionToken(), customImportCode, customImportFile, userEmail);
+                return AsyncBatchRegistrationResult.singletonList(customImportFile.getFileName());
+            } else
+            {
+                commonServer.performCustomImport(getSessionToken(), customImportCode, customImportFile);
+                return Collections.singletonList(new BatchRegistrationResult(customImportFile.getFileName(), String
+                        .format("Import successfully completed.")));
+            }
         } catch (final UserFailureException e)
         {
             throw UserFailureExceptionTranslator.translate(e);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 72f94019d017bd6838cf25c4763541b038799eef..342e3d3a5b0c48d630a8641ba1c0824c446bf60f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server;
 
+import java.io.Writer;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -35,6 +36,8 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 
+import javax.annotation.Resource;
+
 import org.springframework.dao.DataAccessException;
 import org.springframework.dao.DataIntegrityViolationException;
 
@@ -145,6 +148,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.IEnt
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.entity_validation.api.IEntityValidator;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.EncapsulatedCommonServer;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl.MasterDataRegistrationScriptRunner;
+import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.IOpenBisSessionManager;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
@@ -264,6 +268,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
     private String defaultPutDataStoreServerCodeOrNull;
 
+    @Resource(name = ch.systemsx.cisd.openbis.generic.shared.ResourceNames.COMMON_SERVER)
+    protected ICommonServer commonServer;
+
     public CommonServer(final IAuthenticationService authenticationService,
             final IOpenBisSessionManager sessionManager, final IDAOFactory daoFactory,
             final ICommonBusinessObjectFactory businessObjectFactory,
@@ -4122,7 +4129,28 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_USER)
-    public String performCustomImport(String sessionToken, String customImportCode,
+    public void performCustomImportAsync(final String sessionToken, final String customImportCode,
+            final CustomImportFile customImportFile, final String userEmail) throws UserFailureException
+    {
+        executeASync(userEmail, new AbstractASyncAction()
+            {
+                @Override
+                public String getName()
+                {
+                    return "Custom import";
+                }
+
+                @Override
+                protected void doActionOrThrowException(Writer messageWriter)
+                {
+                    commonServer.performCustomImport(sessionToken, customImportCode, customImportFile);
+                }
+            });
+    }
+
+    @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    public void performCustomImport(String sessionToken, String customImportCode,
             CustomImportFile customImportFile) throws UserFailureException
     {
         Session session = getSession(sessionToken);
@@ -4144,7 +4172,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                 IDataStoreBO dataStore = businessObjectFactory.createDataStoreBO(session);
                 dataStore.loadByCode(dssCode);
                 dataStore.uploadFile(dropboxName, customImportFile);
-                return customImportFile.getFileName();
+                return;
             }
         }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index 54e473704f026b1a65a27856d47465d24cb00a05..ad0da899be3d3d706f81480eebaf3e6b7895edfd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -1616,13 +1616,21 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     @Override
-    public String performCustomImport(String sessionToken, String customImportCode,
+    public void performCustomImportAsync(String sessionToken, String customImportCode,
+            CustomImportFile customImportFile, String userEmail)
+    {
+        logAccess(sessionToken, "performCustomImportAsync",
+                "CUSTOM_IMPORT_CODE(%s), CUSTOM_IMPORT_FILE(%s), USER_EMAIL(%s)", customImportCode,
+                customImportFile, userEmail);
+    }
+
+    @Override
+    public void performCustomImport(String sessionToken, String customImportCode,
             CustomImportFile customImportFile)
     {
         logAccess(sessionToken, "performCustomImport",
                 "CUSTOM_IMPORT_CODE(%s), CUSTOM_IMPORT_FILE(%s)", customImportCode,
                 customImportFile);
-        return null;
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java
index 4815725c8aa9f8fb56795fba96afa4803d5aca2a..7aa222b018e1377a2bbb15c63daa623a4fe36e18 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/AbstractServerLogger.java
@@ -203,7 +203,7 @@ public abstract class AbstractServerLogger implements IServer
 
         if (sessionManagerOrNull != null && sessionManagerOrNull.isAWellFormedSessionToken(sessionToken))
         {
-            Session session = sessionManagerOrNull.getSession(sessionToken);
+            Session session = sessionManagerOrNull.tryGetSession(sessionToken);
 
             if (session != null && session.isOnBehalfSession())
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index d27799a07f635fa6d115652fbccccf19aa589f6a..08e3100362ce191d32050534a64e35517b070dfe 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -1451,11 +1451,18 @@ public interface ICommonServer extends IServer
     @Transactional(readOnly = true)
     public List<Material> searchForMaterials(String sessionToken, DetailedSearchCriteria criteria);
 
+    /**
+     * Performs an asynchronous import of file to the dss.
+     */
+    @Transactional
+    public void performCustomImportAsync(String sessionToken, String customImportCode,
+            CustomImportFile customImportFile, String userEmail) throws UserFailureException;
+
     /**
      * Performs an import of file to the dss.
      */
     @Transactional
-    public String performCustomImport(String sessionToken, String customImportCode,
+    public void performCustomImport(String sessionToken, String customImportCode,
             CustomImportFile customImportFile) throws UserFailureException;
 
     /**