diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java
index 3957ca09d83dfb6fad1fad446ebf8a3a2fbcab89..6d5a2c885e6832baf29fb927a53fb179219ff822 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java
@@ -39,10 +39,15 @@ public interface IDataSetRegistrationTransaction
     IDataSet createNewDataSet();
 
     /**
-     * Create a new data set with the specified code.
+     * Create a new data set with the specified type.
      */
     IDataSet createNewDataSet(String dataSetType);
 
+    /**
+     * Create a new data set with the specified type and code.
+     */
+    IDataSet createNewDataSet(String dataSetType, String dataSetCode);
+
     /**
      * Get a sample from the openBIS AS. Returns null if the sample does not exist.
      * 
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 56bf8f96f49626ba8d32123a38df021ed2f5f121..c572f792f8dddf166dde74d190055cbde7b65791 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
@@ -151,15 +151,36 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
             return createNewDataSet(registrationDetails);
         }
 
+        public IDataSet createNewDataSet(String dataSetType, String dataSetCode)
+        {
+            // Create registration details for the new data set
+            DataSetRegistrationDetails<T> registrationDetails =
+                    registrationDetailsFactory.createDataSetRegistrationDetails();
+            registrationDetails.setDataSetType(dataSetType);
+
+            return createNewDataSet(registrationDetails, dataSetCode);
+        }
+
         public IDataSet createNewDataSet(DataSetRegistrationDetails<T> registrationDetails)
         {
             // Request a code, so we can keep the staging file name and the data set code in sync
-            String dataSetCode = registrationDetails.getDataSetInformation().getDataSetCode();
-            if (null == dataSetCode)
+            return createNewDataSet(registrationDetails, registrationDetails
+                    .getDataSetInformation().getDataSetCode());
+        }
+
+        public IDataSet createNewDataSet(DataSetRegistrationDetails<T> registrationDetails,
+                String specifiedCode)
+        {
+            final String dataSetCode;
+            if (null == specifiedCode)
             {
                 dataSetCode = generateDataSetCode(registrationDetails);
                 registrationDetails.getDataSetInformation().setDataSetCode(dataSetCode);
+            } else
+            {
+                dataSetCode = specifiedCode.toUpperCase();
             }
+            registrationDetails.getDataSetInformation().setDataSetCode(dataSetCode);
 
             // Create a directory for the data set
             File stagingFolder = new File(stagingDirectory, dataSetCode);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
index e4506c519ac9b4879be2bffcc72b1bcffcd693b5..e31481806c8ff08ba9766612746066b255ddedee 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
@@ -192,6 +192,11 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem
         return getStateAsLiveState().createNewDataSet(dataSetType);
     }
 
+    public IDataSet createNewDataSet(String dataSetType, String dataSetCode)
+    {
+        return getStateAsLiveState().createNewDataSet(dataSetType, dataSetCode);
+    }
+
     public IDataSet createNewDataSet(DataSetRegistrationDetails<T> registrationDetails)
     {
         return getStateAsLiveState().createNewDataSet(registrationDetails);
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java
index 30281aecaad832915fa9f0fdcb3b184e460737a3..b5e052a70797ff9810c21a9fcdaab0eed73ad3da 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java
@@ -69,7 +69,7 @@ public class DataSetRegistrationTransactionTest extends AbstractFileSystemTestCa
 {
     private static final String EXPERIMENT_IDENTIFIER = "/SPACE/PROJECT/EXP-CODE";
 
-    private static final String DATA_SET_CODE = "data-set-code";
+    private static final String DATA_SET_CODE = "data-set-code".toUpperCase();
 
     private static final String DATABASE_INSTANCE_UUID = "db-uuid";
 
@@ -164,6 +164,42 @@ public class DataSetRegistrationTransactionTest extends AbstractFileSystemTestCa
         context.assertIsSatisfied();
     }
 
+    @Test
+    public void testCommitSpecifyingDataSetCode()
+    {
+        setUpOpenBisExpectations(true, false);
+        setUpDataSetValidatorExpectations("my-data-set-code");
+        createTransaction();
+
+        IDataSet newDataSet = tr.createNewDataSet("UNKNOWN", "my-data-set-code");
+        String dst = tr.moveFile(srcFile.getAbsolutePath(), newDataSet);
+        IExperimentImmutable experiment = tr.getExperiment(EXPERIMENT_IDENTIFIER);
+        newDataSet.setExperiment(experiment);
+        newDataSet.setDataSetType(DATA_SET_TYPE.getCode());
+
+        checkContentsOfFile(new File(dst));
+
+        File[] rollbackQueueFiles = listRollbackQueueFiles();
+        assertEquals(2, rollbackQueueFiles.length);
+
+        tr.commit();
+
+        System.out.println(logAppender.getLogContent());
+
+        assertTrue(logAppender.getLogContent().length() > 0);
+        // Skip this for the moment
+        // new LogMatcher(logAppender,
+        // "Identified that database knows experiment '/SPACE/PROJECT/EXP-CODE'.*",
+        // "Start storing data set for experiment '/SPACE/PROJECT/EXP-CODE'.*",
+        // "Finished storing data set for experiment '/SPACE/PROJECT/EXP-CODE', took .*",
+        // "Successfully registered data set: .+").assertMatches();
+
+        rollbackQueueFiles = listRollbackQueueFiles();
+        assertEquals(0, rollbackQueueFiles.length);
+
+        context.assertIsSatisfied();
+    }
+
     @Test
     public void testCommitContainerDataSet()
     {
@@ -404,13 +440,22 @@ public class DataSetRegistrationTransactionTest extends AbstractFileSystemTestCa
     }
 
     private void setUpOpenBisExpectations(final boolean willRegister)
+    {
+        setUpOpenBisExpectations(willRegister, true);
+    }
+
+    private void setUpOpenBisExpectations(final boolean willRegister,
+            final boolean createDataSetCode)
     {
         setUpHomeDataBaseExpectations();
         context.checking(new Expectations()
             {
                 {
-                    oneOf(openBisService).createDataSetCode();
-                    will(returnValue(DATA_SET_CODE + 1));
+                    if (createDataSetCode)
+                    {
+                        oneOf(openBisService).createDataSetCode();
+                        will(returnValue(DATA_SET_CODE + 1));
+                    }
 
                     if (willRegister)
                     {
@@ -446,7 +491,13 @@ public class DataSetRegistrationTransactionTest extends AbstractFileSystemTestCa
 
     private void setUpDataSetValidatorExpectations()
     {
-        File dataSetDir = new File(stagingDirectory, DATA_SET_CODE + "1");
+        setUpDataSetValidatorExpectations(DATA_SET_CODE + "1");
+
+    }
+
+    private void setUpDataSetValidatorExpectations(String dataSetCode)
+    {
+        File dataSetDir = new File(stagingDirectory, dataSetCode.toUpperCase());
         final File dataSetFile = new File(dataSetDir, srcFile.getName());
         context.checking(new Expectations()
             {