diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultDataSetInfoExtractor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultDataSetInfoExtractor.java
index 60c64cee464953adce9056f7cc25e9f95a9412fc..686d9db7bdf13915d05a407a994e7f5566eb4c21 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultDataSetInfoExtractor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DefaultDataSetInfoExtractor.java
@@ -323,7 +323,7 @@ public class DefaultDataSetInfoExtractor extends AbstractDataSetInfoExtractor
         dataSetInformation.setExperimentIdentifier(experimentIdentifier);
         if (experimentIdentifier == null)
         {
-            dataSetInformation.setSampleCode(entitiesProvider.getEntity(indexOfSampleCode));
+            dataSetInformation.setSampleCode(extractSampleCode(entitiesProvider));
         }
         dataSetInformation.setParentDataSetCodes(getParentDataSetCodes(entitiesProvider));
         dataSetInformation.setProducerCode(tryGetDataProducerCode(entitiesProvider));
@@ -358,6 +358,14 @@ public class DefaultDataSetInfoExtractor extends AbstractDataSetInfoExtractor
         return identifier;
     }
 
+    private String extractSampleCode(final DataSetNameEntitiesProvider entitiesProvider)
+    {
+        // subEntitySeparator can be used instead of ':' for contained sample code
+        // (':' is not an allowed char some OS and it is not achievable in Mac OS Finder)
+        String sampleCode = entitiesProvider.getEntity(indexOfSampleCode);
+        return sampleCode.replace(subEntitySeparator, ':');
+    }
+
     private List<String> getParentDataSetCodes(final DataSetNameEntitiesProvider entitiesProvider)
     {
         if (indexOfParentDataSetCodes.isUndefined())
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DefaultDataSetInfoExtractorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DefaultDataSetInfoExtractorTest.java
index 7e84f0db77e1e788df3afb8a87e8c1d0ef1a672b..cb485f04cc46d243f7cb2de60668844bcf9f0835 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DefaultDataSetInfoExtractorTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/DefaultDataSetInfoExtractorTest.java
@@ -54,6 +54,24 @@ public final class DefaultDataSetInfoExtractorTest extends CodeExtractortTestCas
         assertTrue(WORKING_DIRECTORY.mkdirs());
     }
 
+    @Test
+    public void testExtractContainedSampleIdentifier()
+    {
+        Properties properties = new Properties();
+        properties.setProperty(asPropertyName(GROUP_CODE), "my-group");
+        final IDataSetInfoExtractor extractor = new DefaultDataSetInfoExtractor(properties);
+
+        final DataSetInformation dsInfo1 =
+                extractor.getDataSetInformation(new File("BOX_1&S_1"), null);
+        final DataSetInformation dsInfo2 =
+                extractor.getDataSetInformation(new File("BOX_1:S_1"), null);
+
+        assertEquals("BOX_1:S_1", dsInfo1.getSampleIdentifier().getSampleCode());
+        assertEquals("S_1", dsInfo1.getSampleIdentifier().getSampleSubCode());
+        assertEquals("BOX_1:S_1", dsInfo2.getSampleIdentifier().getSampleCode());
+        assertEquals("S_1", dsInfo2.getSampleIdentifier().getSampleSubCode());
+    }
+
     @Test
     public void testExtractExperimentIdentifierWithoutGroup()
     {
@@ -70,32 +88,32 @@ public final class DefaultDataSetInfoExtractorTest extends CodeExtractortTestCas
         assertEquals("123", dsInfo.getExperimentIdentifier().getExperimentCode());
         assertEquals(null, dsInfo.getSampleIdentifier());
     }
-    
+
     @Test
     public void testExtractExperimentIdentifierWithGroup()
     {
         Properties properties = new Properties();
         properties.setProperty(INDEX_OF_EXPERIMENT_IDENTIFIER, "1");
         final IDataSetInfoExtractor extractor = new DefaultDataSetInfoExtractor(properties);
-        
+
         final DataSetInformation dsInfo =
-            extractor.getDataSetInformation(new File("bla.abc&xy&123.bla"), null);
-        
+                extractor.getDataSetInformation(new File("bla.abc&xy&123.bla"), null);
+
         assertEquals("ABC", dsInfo.getExperimentIdentifier().getSpaceCode());
         assertEquals("XY", dsInfo.getExperimentIdentifier().getProjectCode());
         assertEquals("123", dsInfo.getExperimentIdentifier().getExperimentCode());
         assertEquals(null, dsInfo.getSampleIdentifier());
     }
-    
+
     @Test
     public void testHappyCaseWithDefaultProperties()
     {
         final String barcode = "XYZ123";
         final IDataSetInfoExtractor extractor = new DefaultDataSetInfoExtractor(new Properties());
-        
+
         final DataSetInformation dsInfo =
-            extractor.getDataSetInformation(new File("bla.bla." + barcode), null);
-        
+                extractor.getDataSetInformation(new File("bla.bla." + barcode), null);
+
         assertNull(dsInfo.getExperimentIdentifier());
         assertEquals(barcode, dsInfo.getSampleIdentifier().getSampleCode());
         assertEquals(0, dsInfo.getParentDataSetCodes().size());
@@ -186,7 +204,7 @@ public final class DefaultDataSetInfoExtractorTest extends CodeExtractortTestCas
         final Properties properties = new Properties();
         final String separator = "=";
         properties.setProperty(ENTITY_SEPARATOR, separator);
-        String subSeparator = "%"; 
+        String subSeparator = "%";
         properties.setProperty(SUB_ENTITY_SEPARATOR, subSeparator);
         properties.setProperty(INDEX_OF_SAMPLE_CODE, "0");
         properties.setProperty(INDEX_OF_PARENT_DATA_SET_CODE, "1");