diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java
index cf2b6d65b8d998d35fbe748281a3e9938069f1d1..0f57e28f02a15200dd001bb10754ff923971960c 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java
@@ -17,28 +17,26 @@
 package ch.systemsx.cisd.openbis.etlserver.phosphonetx;
 
 import java.io.File;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 import java.util.Properties;
 
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
-import ch.systemsx.cisd.common.utilities.ITimeProvider;
 import ch.systemsx.cisd.common.utilities.PropertyUtils;
-import ch.systemsx.cisd.common.utilities.SystemTimeProvider;
 import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 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.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleTypePropertyType;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 
 /**
  * Data set info extractor for MS injection data sets. Information is extracted from a properties
@@ -53,35 +51,30 @@ public class DataSetInfoExtractorForMSInjection implements IDataSetInfoExtractor
     static final String DEFAULT_MS_INJECTION_PROPERTIES_FILE = "ms-injection.properties";
 
     static final String PROJECT_CODE_KEY = "PROJECT_CODE";
-    static final String MZXML_FILENAME_KEY = "MZXML_FILENAME";
+    static final String EXPERIMENT_CODE_KEY = "EXPERIMENT_CODE";
+    static final String SAMPLE_CODE_KEY = "SAMPLE_CODE";
     
     static final String GROUP_CODE = "MS_DATA";
+    static final String EXPERIMENT_TYPE_CODE = "MS_INJECT";
 
     static final String SAMPLE_TYPE_CODE = "MS_INJECTION";
 
 
-    private static final SimpleDateFormat EXPERIMENT_CODE_TEMPLATE =
-            new SimpleDateFormat("yyyy-MM");
-
     private final String msInjectionPropertiesFileName;
 
     private final IEncapsulatedOpenBISService service;
 
-    private final ITimeProvider timeProvider;
-
     public DataSetInfoExtractorForMSInjection(Properties properties)
     {
         this(properties.getProperty(MS_INJECTION_PROPERTIES_FILE_KEY,
-                DEFAULT_MS_INJECTION_PROPERTIES_FILE), ServiceProvider.getOpenBISService(),
-                SystemTimeProvider.SYSTEM_TIME_PROVIDER);
+                DEFAULT_MS_INJECTION_PROPERTIES_FILE), ServiceProvider.getOpenBISService());
     }
 
     DataSetInfoExtractorForMSInjection(String msInjectionPropertiesFileName,
-            IEncapsulatedOpenBISService service, ITimeProvider timeProvider)
+            IEncapsulatedOpenBISService service)
     {
         this.msInjectionPropertiesFileName = msInjectionPropertiesFileName;
         this.service = service;
-        this.timeProvider = timeProvider;
 
     }
 
@@ -93,12 +86,12 @@ public class DataSetInfoExtractorForMSInjection implements IDataSetInfoExtractor
                 loadMSInjectionProperties(incomingDataSetPath);
         DataSetInformation info = new DataSetInformation();
         info.setGroupCode(GROUP_CODE);
-        info.setSampleCode(PropertyUtils.getMandatoryProperty(properties, MZXML_FILENAME_KEY));
+        info.setSampleCode(PropertyUtils.getMandatoryProperty(properties, SAMPLE_CODE_KEY));
         NewSample sample = new NewSample();
         SampleType sampleType = new SampleType();
         sampleType.setCode(SAMPLE_TYPE_CODE);
         sample.setSampleType(sampleType);
-        sample.setExperimentIdentifier(createExperimentIdentifer(properties));
+        sample.setExperimentIdentifier(getOrCreateExperiment(properties));
         sample.setIdentifier(info.getSampleIdentifier().toString());
         List<EntityProperty> sampleProperties = createSampleProperties(properties);
         sample.setProperties(sampleProperties.toArray(new EntityProperty[sampleProperties.size()]));
@@ -106,15 +99,19 @@ public class DataSetInfoExtractorForMSInjection implements IDataSetInfoExtractor
         return info;
     }
 
-    private String createExperimentIdentifer(Properties msInjectionProperties)
+    private String getOrCreateExperiment(Properties msInjectionProperties)
     {
         String projectCode =
                 PropertyUtils.getMandatoryProperty(msInjectionProperties, PROJECT_CODE_KEY);
         String experimentCode =
-                EXPERIMENT_CODE_TEMPLATE.format(new Date(timeProvider.getTimeInMilliseconds()));
-        return DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + GROUP_CODE
-                + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + projectCode
-                + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + experimentCode;
+                PropertyUtils.getMandatoryProperty(msInjectionProperties, EXPERIMENT_CODE_KEY);
+        ExperimentIdentifier identifier = new ExperimentIdentifier(null, GROUP_CODE, projectCode, experimentCode);
+        Experiment experiment = service.tryToGetExperiment(identifier);
+        if (experiment == null)
+        {
+            service.registerExperiment(new NewExperiment(identifier.toString(), EXPERIMENT_TYPE_CODE));
+        }
+        return identifier.toString();
     }
 
     private List<EntityProperty> createSampleProperties(Properties msInjectionProperties)
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/public/index.html b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/public/index.html
index 609dc0c139f825777a1748b448568a276862799a..b6a4477b841a06f0fffa82ace463a1a17b750b50 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/public/index.html
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/public/index.html
@@ -6,7 +6,19 @@
 <!--
 // This script loads your compiled module. If you add any GWT meta tags, they must be added before this line.
 -->
-<script language="javascript" src="ch.systemsx.cisd.openbis.plugin.phosphonetx.OpenBIS.nocache.js"></script>
+<script language="javascript"
+	src="ch.systemsx.cisd.openbis.plugin.phosphonetx.OpenBIS.nocache.js"></script>
+<script language="JavaScript">
+	// confirmation on exit depends on whether user is logged in
+	var allowConfirmOnExit = false; 
+  window.onbeforeunload = confirmExit;
+  function confirmExit()
+  {
+    if (allowConfirmOnExit) {
+      return "WARNING: By doing this you will in fact leave openBIS!";
+    }
+  }  
+</script>
 
 <link rel="shortcut icon" href="images/favicon.ico" />
 <link rel="icon" type="image/png" href="images/favicon.png" />
@@ -16,5 +28,36 @@
 // The body can have arbitrary html, or you can leave the body empty if you want to create a completely dynamic ui.
 -->
 <body>
+<!-- Required by IE (GWT 1.7) -->
+<iframe id="__gwt_historyFrame" style="width: 0; height: 0; border: 0"></iframe>
+<div id="openbis_login_div" style="visibility: hidden">
+<form id="openbis_login_form" method="post" action="javascript:;">
+<table>
+	<tbody>
+		<tr>
+			<td><span>User:</span></td>
+			<td><input type="text" id="openbis_login_username"
+				name="openbis-username" style="width: 150px;"></td>
+			<td>&nbsp;</td>
+		</tr>
+		<tr>
+			<td><span>Password:</span></td>
+			<td><input type="password" id="openbis_login_password"
+				name="openbis-password" style="width: 150px;"></td>
+			<td>&nbsp;</td>
+		</tr>
+		<tr>
+			<td rowspan="3">&nbsp;</td>
+		</tr>
+		<tr>
+			<td>&nbsp;</td>
+			<td>&nbsp;</td>
+			<td align="right"><input type="submit" id="openbis_login_submit"
+				value="Login"></td>
+		</tr>
+	</tbody>
+</table>
+</form>
+</div>
 </body>
 </html>
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjectionTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjectionTest.java
index 5eebb1441b5e596df922d323d9286d5c084d8950..0283bc0c54c474fd61f1aa06c7ab09d813027719 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjectionTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjectionTest.java
@@ -17,9 +17,11 @@
 package ch.systemsx.cisd.openbis.etlserver.phosphonetx;
 
 import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.DEFAULT_MS_INJECTION_PROPERTIES_FILE;
+import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.EXPERIMENT_CODE_KEY;
+import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.EXPERIMENT_TYPE_CODE;
 import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.GROUP_CODE;
-import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.MZXML_FILENAME_KEY;
 import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.PROJECT_CODE_KEY;
+import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.SAMPLE_CODE_KEY;
 import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.SAMPLE_TYPE_CODE;
 
 import java.io.File;
@@ -43,16 +45,18 @@ import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
-import ch.systemsx.cisd.common.utilities.ITimeProvider;
 import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
+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.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 
 /**
  * 
@@ -62,18 +66,18 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceId
 public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTestCase
 {
     private static final String PROJECT_CODE = "MS2";
-    private static final String MZXML_FILENAME = "U09-1242";
+    private static final String EXPERIMENT_CODE = "2010-02";
+    private static final String SAMPLE_CODE = "U09-1242";
     private static final String SAMPLE_IDENTIFIER =
             DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + GROUP_CODE
-                    + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + MZXML_FILENAME;
+                    + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + SAMPLE_CODE;
     private static final String EXPERIMENT_IDENTIFIER =
             DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + GROUP_CODE
                     + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + PROJECT_CODE
-                    + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + "1973-04";
+                    + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + EXPERIMENT_CODE;
     
     private Mockery context;
     private IEncapsulatedOpenBISService service;
-    private ITimeProvider timeProvider;
     private IDataSetInfoExtractor extractor;
     private File dataSet;
     
@@ -82,10 +86,9 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
     {
         context = new Mockery();
         service = context.mock(IEncapsulatedOpenBISService.class);
-        timeProvider = context.mock(ITimeProvider.class);
         extractor =
                 new DataSetInfoExtractorForMSInjection(DEFAULT_MS_INJECTION_PROPERTIES_FILE,
-                        service, timeProvider);
+                        service);
         dataSet = new File(workingDirectory, "data-set");
         dataSet.mkdirs();
     }
@@ -132,7 +135,7 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
     }
     
     @Test
-    public void testMissingMZXML()
+    public void testMissingSampleCode()
     {
         Properties properties = new Properties();
         save(properties, DEFAULT_MS_INJECTION_PROPERTIES_FILE);
@@ -143,7 +146,7 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
             fail("ConfigurationFailureException expected");
         } catch (ConfigurationFailureException ex)
         {
-            assertEquals("Given key '" + MZXML_FILENAME_KEY + "' not found in properties '[]'", ex
+            assertEquals("Given key '" + SAMPLE_CODE_KEY + "' not found in properties '[]'", ex
                     .getMessage());
         }
         
@@ -154,8 +157,8 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
     public void testMissingProjectCode()
     {
         Properties properties = new Properties();
-
-        properties.setProperty(MZXML_FILENAME_KEY, MZXML_FILENAME);
+        
+        properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE);
         save(properties, DEFAULT_MS_INJECTION_PROPERTIES_FILE);
         
         try
@@ -165,9 +168,30 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
         } catch (ConfigurationFailureException ex)
         {
             assertEquals("Given key '" + PROJECT_CODE_KEY + "' not found in properties '["
-                    + MZXML_FILENAME_KEY + "]'", ex.getMessage());
+                    + SAMPLE_CODE_KEY + "]'", ex.getMessage());
         }
-
+        
+        context.assertIsSatisfied();
+    }
+    
+    @Test
+    public void testMissingExperimentCode()
+    {
+        Properties properties = new Properties();
+        properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE);
+        properties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE);
+        save(properties, DEFAULT_MS_INJECTION_PROPERTIES_FILE);
+        
+        try
+        {
+            extractor.getDataSetInformation(dataSet, service);
+            fail("ConfigurationFailureException expected");
+        } catch (ConfigurationFailureException ex)
+        {
+            assertEquals("Given key '" + EXPERIMENT_CODE_KEY + "' not found in properties '["
+                    + PROJECT_CODE_KEY + ", " + SAMPLE_CODE_KEY + "]'", ex.getMessage());
+        }
+        
         context.assertIsSatisfied();
     }
     
@@ -176,12 +200,13 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
     {
         Properties properties = new Properties();
         properties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE);
-        properties.setProperty(MZXML_FILENAME_KEY, MZXML_FILENAME);
+        properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE);
+        properties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE);
         properties.setProperty("TEMPERATURE", "47.11");
         save(properties, DEFAULT_MS_INJECTION_PROPERTIES_FILE);
-        SampleTypePropertyType pt1 = createPropertyType(MZXML_FILENAME_KEY, true);
+        SampleTypePropertyType pt1 = createPropertyType(SAMPLE_CODE_KEY, true);
         SampleTypePropertyType pt2 = createPropertyType("VOLUME", false);
-        prepareTimeProviderAndGetSampleType(pt1, pt2);
+        prepareGetExperimentAndGetSampleType(false, pt1, pt2);
         context.checking(new Expectations()
             {
                 {
@@ -203,7 +228,7 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
                                         map.put(property.getPropertyType().getCode(), property);
                                     }
 
-                                    assertEquals(MZXML_FILENAME, map.get(MZXML_FILENAME_KEY).getValue());
+                                    assertEquals(SAMPLE_CODE, map.get(SAMPLE_CODE_KEY).getValue());
                                     assertEquals(1, map.size());
                                     return true;
                                 }
@@ -221,7 +246,7 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
         DataSetInformation info = extractor.getDataSetInformation(dataSet, service);
         
         assertEquals(GROUP_CODE, info.getGroupCode());
-        assertEquals(MZXML_FILENAME, info.getSampleCode());
+        assertEquals(SAMPLE_CODE, info.getSampleCode());
         assertEquals(null, info.getExperimentIdentifier());
         
         context.assertIsSatisfied();
@@ -232,12 +257,13 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
     {
         Properties properties = new Properties();
         properties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE);
-        properties.setProperty(MZXML_FILENAME_KEY, MZXML_FILENAME);
+        properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE);
+        properties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE);
         save(properties, DEFAULT_MS_INJECTION_PROPERTIES_FILE);
-        SampleTypePropertyType pt1 = createPropertyType(MZXML_FILENAME_KEY, true);
+        SampleTypePropertyType pt1 = createPropertyType(SAMPLE_CODE_KEY, true);
         SampleTypePropertyType pt2 = createPropertyType("VOLUME", true);
         SampleTypePropertyType pt3 = createPropertyType("TEMPERATURE", true);
-        prepareTimeProviderAndGetSampleType(pt1, pt2, pt3);
+        prepareGetExperimentAndGetSampleType(true, pt1, pt2, pt3);
         
         try
         {
@@ -252,14 +278,24 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
         context.assertIsSatisfied();
     }
 
-    private void prepareTimeProviderAndGetSampleType(
-            final SampleTypePropertyType... sampleTypePropertyTypes)
+    private void prepareGetExperimentAndGetSampleType(
+            final boolean experimentExists, final SampleTypePropertyType... sampleTypePropertyTypes)
     {
         context.checking(new Expectations()
             {
                 {
-                    one(timeProvider).getTimeInMilliseconds();
-                    will(returnValue(4711L * 4711 * 4711));
+                    ExperimentIdentifier identifier = new ExperimentIdentifier(null, GROUP_CODE, PROJECT_CODE,
+                            EXPERIMENT_CODE);
+                    one(service).tryToGetExperiment(identifier
+                            );
+                    will(returnValue(experimentExists ? new Experiment() : null));
+                    
+                    if (experimentExists == false)
+                    {
+                        one(service).registerExperiment(
+                                new NewExperiment(identifier.toString(), EXPERIMENT_TYPE_CODE));
+                    }
+                    
                     one(service).getSampleType(DataSetInfoExtractorForMSInjection.SAMPLE_TYPE_CODE);
                     SampleType sampleType = new SampleType();
                     sampleType.setSampleTypePropertyTypes(Arrays.asList(sampleTypePropertyTypes));