diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
index 5acd1cc7c238761e4ba4b43af4f73163830eb2a8..75a134521b23a6eed5d5183baa4c4cf2c68b5aee 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
@@ -306,42 +306,56 @@ public class GenericClientService extends AbstractClientService implements IGene
     
     @Override
     public final List<BatchRegistrationResult> registerOrUpdateSamplesAndMaterials(
-            final String sessionKey, final String defaultGroupIdentifier, boolean updateExisting,
-            boolean async, String userEmail) throws UserFailureException
+            final String sessionKey,
+            final String defaultGroupIdentifier,
+            final boolean updateExisting,
+            final boolean async,
+            final String userEmail) throws UserFailureException
     {
-        BatchOperationKind operationKind = updateExisting ? BatchOperationKind.UPDATE : BatchOperationKind.REGISTRATION;
+        final BatchOperationKind operationKind = updateExisting ? BatchOperationKind.UPDATE : BatchOperationKind.REGISTRATION;
         final String sessionToken = getSessionToken();
+        final HttpSession session = getHttpSession();
         final SampleType sampleType = new SampleType();
         sampleType.setCode(EntityType.DEFINED_IN_FILE);
-
-        HttpSession session = getHttpSession();
+        ConsumerTask asyncGeneralTask = null;
         UploadedFilesBean uploadedFiles = null;
+        
         try
         {
             uploadedFiles = getUploadedFiles(sessionKey, session);
-            BatchSamplesOperation samplesInfo =
-                    parseSamples(sampleType, session, uploadedFiles, defaultGroupIdentifier,
-                            defaultGroupIdentifier != null, true, "SAMPLES", operationKind, sessionToken);
-
+            
+            BatchSamplesOperation samplesInfo = parseSamples(sampleType, session, uploadedFiles, defaultGroupIdentifier, defaultGroupIdentifier != null, true, "SAMPLES", operationKind, sessionToken);
+            
             final MaterialType materialType = new MaterialType();
             materialType.setCode(EntityType.DEFINED_IN_FILE);
-            BatchMaterialsOperation materialsInfo =
-                    parseMaterials(session, uploadedFiles, materialType, "MATERIALS",
-                            updateExisting);
+            BatchMaterialsOperation materialsInfo = parseMaterials(session, uploadedFiles, materialType, "MATERIALS", updateExisting);
             
-
             if (async)
             {
-                genericServer.registerOrUpdateSamplesAndMaterialsAsync(sessionToken,
-                        samplesInfo.getSamples(), materialsInfo.getMaterials(), userEmail);
-
+                final UploadedFilesBean asyncUploadedFiles = uploadedFiles;
+                asyncGeneralTask = new ConsumerTask() {
+                    @Override
+                    public String getTaskName() { return "General Batch Import Task"; }
+                    
+                    @Override
+                    public void executeTask()
+                    { 
+                        //Some stuff is repeated on the async executor, this is expected
+                        BatchSamplesOperation asyncSamplesInfo = parseSamples(sampleType, session, asyncUploadedFiles, defaultGroupIdentifier, defaultGroupIdentifier != null, true, "SAMPLES", operationKind, sessionToken);
+                        BatchMaterialsOperation asyncMaterialsInfo = parseMaterials(session, asyncUploadedFiles, materialType, "MATERIALS", updateExisting);
+                        
+                        //Execute task and clean files
+                        genericServer.registerOrUpdateSamplesAndMaterialsAsync(sessionToken, asyncSamplesInfo.getSamples(), asyncMaterialsInfo.getMaterials(), userEmail);
+                        cleanUploadedFiles(sessionKey, session, asyncUploadedFiles);
+                    }
+                };
+                
+                
                 String fileName = uploadedFiles.iterable().iterator().next().getOriginalFilename();
                 return AsyncBatchRegistrationResult.singletonList(fileName);
             } else
             {
-                genericServer.registerOrUpdateSamplesAndMaterials(sessionToken,
-                        samplesInfo.getSamples(), materialsInfo.getMaterials());
-
+                genericServer.registerOrUpdateSamplesAndMaterials(sessionToken, samplesInfo.getSamples(), materialsInfo.getMaterials());
                 List<BatchRegistrationResult> results = new ArrayList<BatchRegistrationResult>();
                 results.addAll(materialsInfo.getResultList());
                 results.addAll(samplesInfo.getResultList());
@@ -352,7 +366,11 @@ public class GenericClientService extends AbstractClientService implements IGene
             throw UserFailureExceptionTranslator.translate(e);
         } finally
         {
-            cleanUploadedFiles(sessionKey, session, uploadedFiles);
+            if (async && (asyncGeneralTask != null)) {
+                ConsumerQueue.addTaskAsLast(asyncGeneralTask);
+            } else {
+                cleanUploadedFiles(sessionKey, session, uploadedFiles);
+            }
         }
     }