diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IdentifiedDataStrategy.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IdentifiedDataStrategy.java
index e748ef2b729db8ec2355016b41ba49461ad85299..8d6fdb752c416d0e26f0da2c914840204b60abab 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IdentifiedDataStrategy.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IdentifiedDataStrategy.java
@@ -40,7 +40,7 @@ public final class IdentifiedDataStrategy implements IDataStoreStrategy
 
     static final String STORAGE_LAYOUT_ERROR_MSG_PREFIX = "Serious error in data store layout: ";
 
-    IdentifiedDataStrategy()
+    public IdentifiedDataStrategy()
     {
 
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java
index 1a83fdee2e6d642842de30ceca99696cbdf13c21..6d4fbb11261da1b6a3ad4c4905dba4e6e5da8b5d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java
@@ -26,6 +26,7 @@ import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithm;
 import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithm.DataSetRegistrationAlgorithmState;
 import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithmRunner;
 import ch.systemsx.cisd.etlserver.IDataStoreStrategy;
+import ch.systemsx.cisd.etlserver.IdentifiedDataStrategy;
 import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState;
 import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetRegistrationTransaction;
@@ -213,6 +214,28 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements
         return algorithm;
     }
 
+    /**
+     * Create a storage algorithm for storing an individual data set, bypassing the detection of
+     * whether the data set's owner is in the db. This is used if the owner will be registered in
+     * the same transaction. This is internally used by transactions. Other clients may find it
+     * useful as well.
+     */
+    public DataSetStorageAlgorithm<T> createStorageAlgorithmWithIdentifiedStrategy(
+            File dataSetFile, DataSetRegistrationDetails<T> dataSetDetails)
+    {
+        TopLevelDataSetRegistratorGlobalState globalContext = registratorContext.getGlobalState();
+        T dataSetInformation = dataSetDetails.getDataSetInformation();
+        dataSetInformation.setShareId(globalContext.getShareId());
+        IDataStoreStrategy strategy = new IdentifiedDataStrategy();
+
+        DataSetStorageAlgorithm<T> algorithm =
+                new DataSetStorageAlgorithm<T>(dataSetFile, dataSetDetails, strategy,
+                        registratorContext.getStorageProcessor(),
+                        globalContext.getDataSetValidator(), globalContext.getDssCode(),
+                        registratorContext.getFileOperations(), globalContext.getMailClient());
+        return algorithm;
+    }
+
     public IEntityOperationService<T> getEntityRegistrationService()
     {
         return new DefaultEntityOperationService<T>(registrator);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
index f4675b3d48c50f6e49032890f09510ab421dfa52..695c75414b5de7c5c6e2618a51c6a61612c98ebb 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
@@ -260,7 +260,16 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
             {
                 File contents = dataSet.getDataSetContents();
                 DataSetRegistrationDetails<T> details = dataSet.getRegistrationDetails();
-                algorithms.add(registrationService.createStorageAlgorithm(contents, details));
+
+                // The experiment does not yet exist
+                if (experimentsToBeRegistered.contains(dataSet.getExperiment()))
+                {
+                    algorithms.add(registrationService
+                            .createStorageAlgorithmWithIdentifiedStrategy(contents, details));
+                } else
+                {
+                    algorithms.add(registrationService.createStorageAlgorithm(contents, details));
+                }
             }
 
             DataSetStorageAlgorithmRunner<T> runner =
@@ -306,20 +315,21 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
             List<NewSample> sampleRegistrations = convertSamplesToBeRegistered();
 
             // experiment updates not yet supported
-            List<ExperimentUpdatesDTO> experimentUpdates =
-                    new ArrayList<ExperimentUpdatesDTO>();
+            List<ExperimentUpdatesDTO> experimentUpdates = new ArrayList<ExperimentUpdatesDTO>();
 
             AtomicEntityOperationDetails<T> registrationDetails =
-                    new AtomicEntityOperationDetails<T>(experimentUpdates,
-                            experimentRegistrations, sampleUpdates, sampleRegistrations,
-                            dataSetRegistrations);
+                    new AtomicEntityOperationDetails<T>(experimentUpdates, experimentRegistrations,
+                            sampleUpdates, sampleRegistrations, dataSetRegistrations);
             return registrationDetails;
         }
 
-        private List<NewExperiment> convertExperimentsToBeRegistered() {
+        private List<NewExperiment> convertExperimentsToBeRegistered()
+        {
             List<NewExperiment> result = new ArrayList<NewExperiment>();
-            for (Experiment apiExperiment : experimentsToBeRegistered) {
-                ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experiment = apiExperiment.getExperiment();
+            for (Experiment apiExperiment : experimentsToBeRegistered)
+            {
+                ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment experiment =
+                        apiExperiment.getExperiment();
                 NewExperiment newExperiment = new NewExperiment();
                 newExperiment.setIdentifier(experiment.getIdentifier());
                 newExperiment.setPermID(experiment.getPermId());
@@ -349,12 +359,14 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
             return result;
         }
 
-        private List<SampleUpdatesDTO> convertSamplesToBeUpdated() {
+        private List<SampleUpdatesDTO> convertSamplesToBeUpdated()
+        {
             List<SampleUpdatesDTO> result = new ArrayList<SampleUpdatesDTO>();
-            for (Sample apiSample : samplesToBeRegistered) {
+            for (Sample apiSample : samplesToBeRegistered)
+            {
                 ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample =
-                    apiSample.getSample();
-                
+                        apiSample.getSample();
+
                 List<NewAttachment> attachments = Collections.emptyList();
                 SampleUpdatesDTO sampleUpdate = new SampleUpdatesDTO(TechId.create(sample), // db id
                         sample.getProperties(), // List<IEntityProperty>
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
index 07be4ab08e8b53aa8a994387a74c342615af890e..09f8eee2bed1948cecd2b8de4c230adf94bed6f1 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
@@ -359,11 +359,11 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         assertEquals(DATA_SET_TYPE, dataSet1.getDataSetType());
         File datasetLocation1 =
                 DatasetLocationUtil.getDatasetLocationPath(workingDirectory, DATA_SET_CODE + 1,
-                        ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, DATABASE_INSTANCE_UUID);
+                        ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
+                        DATABASE_INSTANCE_UUID);
         assertEquals(FileUtilities.getRelativeFile(new File(workingDirectory,
                 ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID),
-                datasetLocation1), dataSet1
-                .getLocation());
+                datasetLocation1), dataSet1.getLocation());
         assertEquals(datasetLocation1, MockStorageProcessor.instance.rootDirs.get(0));
         File incomingDir1 = MockStorageProcessor.instance.incomingDirs.get(0);
         assertEquals(new File(new File(stagingDir, DATA_SET_CODE + 1), "sub_data_set_1"),
@@ -376,11 +376,11 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         assertEquals(DATA_SET_TYPE, dataSet2.getDataSetType());
         File datasetLocation2 =
                 DatasetLocationUtil.getDatasetLocationPath(workingDirectory, DATA_SET_CODE + 2,
-                        ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, DATABASE_INSTANCE_UUID);
+                        ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
+                        DATABASE_INSTANCE_UUID);
         assertEquals(FileUtilities.getRelativeFile(new File(workingDirectory,
                 ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID),
-                datasetLocation2), dataSet2
-                .getLocation());
+                datasetLocation2), dataSet2.getLocation());
         assertEquals(datasetLocation2, MockStorageProcessor.instance.rootDirs.get(1));
         File incomingDir2 = MockStorageProcessor.instance.incomingDirs.get(1);
         assertEquals(new File(new File(stagingDir, DATA_SET_CODE + 2), "sub_data_set_2"),
@@ -416,8 +416,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
                 MockStorageProcessor.instance.dataSetInfoString);
     }
 
-    // TODO KE: 2011-02-11 Make this test run
-    //@Test
+    @Test
     public void testTransactionWithNewExperiment()
     {
         setUpHomeDataBaseExpectations();
@@ -427,8 +426,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath());
         createHandler(properties, false, true);
         createData();
-        final ExperimentIdentifier experimentIdentifier =
-                ExperimentIdentifierFactory.parse("/SPACE/PROJECT/EXP");
         final RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails> atomicatOperationDetails =
                 new RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails>();
         context.checking(new Expectations()
@@ -440,9 +437,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
                     one(openBisService).createDataSetCode();
                     will(returnValue(EXPERIMENT_PERM_ID));
 
-                    one(openBisService).tryToGetExperiment(experimentIdentifier);
-                    will(returnValue(null));
-
                     one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE,
                             new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1"));
                     one(openBisService).performEntityOperations(with(atomicatOperationDetails));
@@ -725,7 +719,8 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
                 new ThreadParameters(threadProperties, "jython-handler-test");
 
         TopLevelDataSetRegistratorGlobalState globalState =
-                new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
+                new TopLevelDataSetRegistratorGlobalState("dss",
+                        ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
                         workingDirectory, openBisService, mailClient, dataSetValidator, true,
                         threadParameters);
         return globalState;