diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
index e3b0d180cc50716d21e971f215e4f6c6612ba94a..c95876a27d0bd6d7109adef015c37f48caf357db 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.systemtest;
 
+import javax.servlet.http.HttpServletRequest;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.test.context.ContextConfiguration;
@@ -40,6 +42,7 @@ public abstract class SystemTestCase extends AbstractTestNGSpringContextTests
 {
     protected ICommonServer commonServer;
     protected ICommonClientService commonClientService;
+    protected MockHttpServletRequest request;
     
     @BeforeSuite
     public void beforeSuite()
@@ -53,7 +56,8 @@ public abstract class SystemTestCase extends AbstractTestNGSpringContextTests
     @Autowired
     public final void setRequestContextProvider(final SpringRequestContextProvider contextProvider)
     {
-        contextProvider.setRequest(new MockHttpServletRequest());
+        request = new MockHttpServletRequest();
+        contextProvider.setRequest(request);
     }
     
     /**
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/ExperimentRegistrationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/ExperimentRegistrationTest.java
index c6d81332d7f610f3ebcd2ef8168fb1b637a8c766..7933b29884e03e8de85bbc0a2fa80599e15ae8c0 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/ExperimentRegistrationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/ExperimentRegistrationTest.java
@@ -19,30 +19,42 @@ package ch.systemsx.cisd.openbis.systemtest.plugin.generic;
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.fail;
 
+import java.util.Arrays;
 import java.util.List;
 
+import javax.servlet.http.HttpSession;
+
+import org.springframework.mock.web.MockMultipartFile;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListSampleDisplayCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.client.web.server.UploadedFilesBean;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Attachment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentWithContent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 
 /**
- * Head-less system test for experiment registration 
- *
+ * Head-less system test for experiment registration
+ * 
  * @author Franz-Josef Elmer
  */
 @Test(groups = "system test")
 public class ExperimentRegistrationTest extends GenericSystemTestCase
 {
+    private static final String ATTACHMENTS_SESSION_KEY = "attachments";
+    private static final String SAMPLES_SESSION_KEY = "samples";
+
     @Test
     public void testRegisterExperimentWithoutMissingMandatoryProperty()
     {
@@ -50,17 +62,19 @@ public class ExperimentRegistrationTest extends GenericSystemTestCase
         String experimentCode = commonClientService.generateCode("EXP");
         String experimentIdentifier = "/cisd/default/" + experimentCode;
         NewExperiment newExperiment = new NewExperiment(experimentIdentifier, "SIRNA_HCS");
-        
+
         try
         {
-            genericClientService.registerExperiment("attachments", "samples", newExperiment);
+            genericClientService.registerExperiment(ATTACHMENTS_SESSION_KEY, SAMPLES_SESSION_KEY,
+                    newExperiment);
             fail("UserFailureException expected");
         } catch (UserFailureException ex)
         {
-            assertEquals("Value of mandatory property 'DESCRIPTION' not specified.", ex.getMessage());
+            assertEquals("Value of mandatory property 'DESCRIPTION' not specified.", ex
+                    .getMessage());
         }
     }
-    
+
     @Test
     public void testRegisterExperiment()
     {
@@ -68,9 +82,10 @@ public class ExperimentRegistrationTest extends GenericSystemTestCase
         String experimentCode = commonClientService.generateCode("EXP");
         String experimentIdentifier = "/cisd/default/" + experimentCode;
         NewExperiment newExperiment = new NewExperiment(experimentIdentifier, "SIRNA_HCS");
-        newExperiment.setProperties(new IEntityProperty[] {property("DESCRIPTION", "my experiment")});
-        genericClientService.registerExperiment("attachments", "samples", newExperiment);
-        
+        newExperiment.setProperties(new IEntityProperty[]
+            { property("DESCRIPTION", "my experiment") });
+        genericClientService.registerExperiment(ATTACHMENTS_SESSION_KEY, SAMPLES_SESSION_KEY, newExperiment);
+
         Experiment experiment = genericClientService.getExperimentInfo(experimentIdentifier);
         assertEquals(experimentCode, experiment.getCode());
         assertEquals(experimentIdentifier.toUpperCase(), experiment.getIdentifier());
@@ -80,7 +95,7 @@ public class ExperimentRegistrationTest extends GenericSystemTestCase
         assertEquals("my experiment", properties.get(0).tryGetAsString());
         assertEquals(1, properties.size());
     }
-    
+
     @Test
     public void testRegisterExperimentWithSamples()
     {
@@ -88,23 +103,107 @@ public class ExperimentRegistrationTest extends GenericSystemTestCase
         String experimentCode = commonClientService.generateCode("EXP");
         String experimentIdentifier = "/cisd/default/" + experimentCode;
         NewExperiment newExperiment = new NewExperiment(experimentIdentifier, "SIRNA_HCS");
-        newExperiment.setProperties(new IEntityProperty[] {property("DESCRIPTION", "my experiment")});
-        newExperiment.setSamples(new String[] {"3vcp8"});
-        genericClientService.registerExperiment("attachments", "samples", newExperiment);
-        
+        newExperiment.setProperties(new IEntityProperty[]
+            { property("DESCRIPTION", "my experiment") });
+        newExperiment.setSamples(new String[]
+            { "3vcp8" });
+        genericClientService.registerExperiment(ATTACHMENTS_SESSION_KEY, SAMPLES_SESSION_KEY, newExperiment);
+
         Experiment experiment = genericClientService.getExperimentInfo(experimentIdentifier);
         TechId experimentId = new TechId(experiment.getId());
         ListSampleCriteria listCriteria = ListSampleCriteria.createForExperiment(experimentId);
         ResultSetWithEntityTypes<Sample> samples =
                 commonClientService.listSamples(new ListSampleDisplayCriteria(listCriteria));
-        
+
         assertEquals("[CELL_PLATE]", samples.getAvailableEntityTypes().toString());
         Sample sample = samples.getResultSet().getList().get(0).getOriginalObject();
         assertEquals("3VCP8", sample.getCode());
         assertEquals(experiment.getId(), sample.getExperiment().getId());
         assertEquals(1, samples.getResultSet().getList().size());
     }
+
+    @Test
+    public void testRegisterExperimentAndSamples()
+    {
+        logIntoCommonClientService();
+        
+        HttpSession session = request.getSession();
+        UploadedFilesBean uploadedFilesBean = new UploadedFilesBean();
+        String batchSamplesFileContent = "identifier\torganism\n" +
+        		                         "S1001\tfly\n" +
+        	                             "S1002\tdog\n";
+        uploadedFilesBean.addMultipartFile(new MockMultipartFile("samples.txt", 
+                batchSamplesFileContent.getBytes()));
+        session.setAttribute(SAMPLES_SESSION_KEY, uploadedFilesBean);
+        String experimentCode = commonClientService.generateCode("EXP");
+        String experimentIdentifier = "/cisd/default/" + experimentCode;
+        NewExperiment newExperiment = new NewExperiment(experimentIdentifier, "SIRNA_HCS");
+        newExperiment.setProperties(new IEntityProperty[]
+            { property("DESCRIPTION", "my experiment") });
+        newExperiment.setRegisterSamples(true);
+        SampleType sampleType = new SampleType();
+        sampleType.setCode("CELL_PLATE");
+        newExperiment.setSampleType(sampleType);
+        genericClientService.registerExperiment(ATTACHMENTS_SESSION_KEY, SAMPLES_SESSION_KEY, newExperiment);
+
+        Experiment experiment = genericClientService.getExperimentInfo(experimentIdentifier);
+        TechId experimentId = new TechId(experiment.getId());
+        ListSampleCriteria listCriteria = ListSampleCriteria.createForExperiment(experimentId);
+        ResultSetWithEntityTypes<Sample> samples =
+                commonClientService.listSamples(new ListSampleDisplayCriteria(listCriteria));
+
+        assertEquals("[CELL_PLATE]", samples.getAvailableEntityTypes().toString());
+        Sample sample = samples.getResultSet().getList().get(0).getOriginalObject();
+        assertEquals("S1001", sample.getCode());
+        assertEquals("FLY", sample.getProperties().get(0).tryGetAsString());
+        assertEquals(experiment.getId(), sample.getExperiment().getId());
+        sample = samples.getResultSet().getList().get(1).getOriginalObject();
+        assertEquals("S1002", sample.getCode());
+        assertEquals("DOG", sample.getProperties().get(0).tryGetAsString());
+        assertEquals(experiment.getId(), sample.getExperiment().getId());
+        assertEquals(2, samples.getResultSet().getList().size());
+    }
     
+    @Test
+    public void testRegisterExperimentAndAttachments()
+    {
+        String sessionToken = logIntoCommonClientService().getSessionID();
+        
+        HttpSession session = request.getSession();
+        UploadedFilesBean uploadedFilesBean = new UploadedFilesBean();
+        MockMultipartFile multipartFile =
+                new MockMultipartFile("hello.txt", "hello.txt", "", "hello world".getBytes());
+        uploadedFilesBean.addMultipartFile(multipartFile);
+        session.setAttribute(ATTACHMENTS_SESSION_KEY, uploadedFilesBean);
+        logIntoCommonClientService();
+        String experimentCode = commonClientService.generateCode("EXP");
+        String experimentIdentifier = "/cisd/default/" + experimentCode;
+        NewExperiment newExperiment = new NewExperiment(experimentIdentifier, "SIRNA_HCS");
+        newExperiment.setProperties(new IEntityProperty[]
+            { property("DESCRIPTION", "my experiment") });
+        newExperiment.setAttachments(Arrays.asList(new NewAttachment("hello.txt", "hello", "test attachment")));
+        genericClientService.registerExperiment(ATTACHMENTS_SESSION_KEY, SAMPLES_SESSION_KEY, newExperiment);
+
+        Experiment experiment = genericClientService.getExperimentInfo(experimentIdentifier);
+        assertEquals(experimentCode, experiment.getCode());
+        List<Attachment> attachments = experiment.getAttachments();
+        assertEquals("hello.txt", attachments.get(0).getFileName());
+        assertEquals("test attachment", attachments.get(0).getDescription());
+        assertEquals("hello", attachments.get(0).getTitle());
+        assertEquals(1, attachments.get(0).getVersion());
+        assertEquals(1, attachments.size());
+        
+        TechId experimentID = new TechId(experiment.getId());
+        AttachmentWithContent attachment =
+                genericServer.getExperimentFileAttachment(sessionToken, experimentID, "hello.txt",
+                        1);
+        assertEquals("hello.txt", attachment.getFileName());
+        assertEquals("test attachment", attachment.getDescription());
+        assertEquals("hello", attachment.getTitle());
+        assertEquals(1, attachment.getVersion());
+        assertEquals("hello world", new String(attachment.getContent()));
+    }
+
     private IEntityProperty property(String type, String value)
     {
         EntityProperty property = new EntityProperty();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/GenericSystemTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/GenericSystemTestCase.java
index e1e29b04888781f3dc6bf6eb8606928b8055ee20..e7ab14214567e75d289dd0932b2e855ee2254fb3 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/GenericSystemTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/GenericSystemTestCase.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.systemtest.plugin.generic;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientService;
+import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
 import ch.systemsx.cisd.openbis.systemtest.SystemTestCase;
 
 /**
@@ -30,4 +31,7 @@ public class GenericSystemTestCase extends SystemTestCase
 {
     @Autowired
     protected IGenericClientService genericClientService;
+    
+    @Autowired
+    protected IGenericServer genericServer;
 }