diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java
index 3fb1f4e46e8825c01c6c60981375f38b8e031acf..e2839af531f096d6947ac919a70d5fc0f16741be 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java
@@ -123,6 +123,12 @@ public class DataSetRegistrationTransactionV2Delegate implements IDataSetRegistr
         return transaction.createNewSampleWithGeneratedCode(spaceCode, sampleTypeCode);
     }
 
+    @Override
+    public ISample createNewProjectSampleWithGeneratedCode(String projectIdentifier, String sampleTypeCode)
+    {
+        return transaction.createNewProjectSampleWithGeneratedCode(projectIdentifier, sampleTypeCode);
+    }
+
     @Override
     public IExperimentImmutable getExperiment(String experimentIdentifierString)
     {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
index f75287037a2a85e06b1b517a340f6e163dd01fa5..ff06e7c0559139ffa65c87a8399e2c3524023cd6 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
@@ -123,6 +123,14 @@ public interface IDataSetRegistrationTransactionV2
      */
     ISample createNewSampleWithGeneratedCode(String spaceCode, String sampleTypeCode);
 
+    /**
+     * Create a new project sample to register with the openBIS AS. The sample will have a permId and automatically created identifier.
+     * 
+     * @param projectIdentifier The project in which to create the sample identifier for the new sample
+     * @param sampleTypeCode The code of the type for the new sample
+     */
+    ISample createNewProjectSampleWithGeneratedCode(String projectIdentifier, String sampleTypeCode);
+    
     /**
      * Get an experiment from the openBIS AS.
      * 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
index 9dc41318633f751bc7645f9d50163289fb11febf..3b2e1dcaa58e6cee7fc427c8a7e3456a67a9f2e8 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
@@ -602,39 +602,38 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
 
         public ISample createNewSampleWithGeneratedCode(String spaceCode, String sampleTypeCode)
         {
-            String permId = generatePermId();
             SampleType sampleType = getSampleType(sampleTypeCode);
 
-            String sampleIdentifierString;
-            if (spaceCode == null || spaceCode.length() == 0)
-            {
-                sampleIdentifierString =
-                        "/"
-                                + openBisService.generateCodes(sampleType.getGeneratedCodePrefix(),
-                                        EntityKind.SAMPLE, 1).get(0);
-            } else
+            String sampleIdentifierString = "/" + createSampleCode(sampleType);
+            if (spaceCode != null && spaceCode.length() > 0)
             {
-                sampleIdentifierString =
-                        "/"
-                                + spaceCode
-                                + "/"
-                                + openBisService.generateCodes(sampleType.getGeneratedCodePrefix(),
-                                        EntityKind.SAMPLE, 1).get(0);
+                sampleIdentifierString = "/" + spaceCode + sampleIdentifierString;
             }
 
-            Sample sample = new Sample(sampleIdentifierString, permId);
-            sample.setSampleType(sampleTypeCode);
-            samplesToBeRegistered.add(sample);
-            addIdentifier(sampleIdentifierString, "Sample");
-            return sample;
+            return createNewSample(sampleIdentifierString, sampleTypeCode);
         }
 
+        public ISample createNewProjectSampleWithGeneratedCode(String projectIdentifier, String sampleTypeCode)
+        {
+            SampleType sampleType = getSampleType(sampleTypeCode);
+            String sampleIdentifierString = projectIdentifier + "/" + createSampleCode(sampleType);
+            return createNewSample(sampleIdentifierString, sampleTypeCode);
+        }
+
+        private String createSampleCode(SampleType sampleType)
+        {
+            return openBisService.generateCodes(sampleType.getGeneratedCodePrefix(), EntityKind.SAMPLE, 1).get(0);
+        }
+        
         /// Asserts that given entity hasn't been yet created within this transaction
         private void addIdentifier(String identifier, String entityKind)
         {
             String updatedId = entityKind + identifier.trim().toUpperCase();
             if (registeredIdentifiers.contains(updatedId))
-                throw new IllegalArgumentException(entityKind + " with identifier " + identifier + " has already been created in this transaction");
+            {
+                throw new IllegalArgumentException(entityKind + " with identifier " + identifier 
+                        + " has already been created in this transaction");
+            }
             registeredIdentifiers.add(updatedId);
         }
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetRegistrationTransaction.java
index c778d0dd37cd390331e29a43a1ab89081c697e99..8a3822776d21d3342893d4b82bd366cda49a58ab 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetRegistrationTransaction.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetRegistrationTransaction.java
@@ -354,6 +354,12 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem
         return getStateAsLiveState().createNewSampleWithGeneratedCode(spaceCode, sampleTypeCode);
     }
 
+    @Override
+    public ISample createNewProjectSampleWithGeneratedCode(String projectIdentifier, String sampleTypeCode)
+    {
+        return getStateAsLiveState().createNewProjectSampleWithGeneratedCode(projectIdentifier, sampleTypeCode);
+    }
+
     @Override
     public IExperimentImmutable getExperiment(String experimentIdentifierString)
     {