diff --git a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
index 21d9891ede79c5978590c29befaaa92f3299bcd2..ceba29c4e851041479af3dbb9c7b3a15c37533f5 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
@@ -28,6 +28,8 @@ import ch.systemsx.cisd.bds.storage.IDirectory;
 public class ExperimentIdentifier implements IStorable
 {
     static final String FOLDER = "experiment_identifier";
+    
+    static final String INSTANCE_CODE = "instance_code";
 
     static final String GROUP_CODE = "group_code";
 
@@ -43,12 +45,15 @@ public class ExperimentIdentifier implements IStorable
     final static ExperimentIdentifier loadFrom(final IDirectory directory)
     {
         final IDirectory idFolder = Utilities.getSubDirectory(directory, FOLDER);
+        final String instanceCode = Utilities.getTrimmedString(idFolder, INSTANCE_CODE);
         final String groupCode = Utilities.getTrimmedString(idFolder, GROUP_CODE);
         final String projectCode = Utilities.getTrimmedString(idFolder, PROJECT_CODE);
         final String experimentCode = Utilities.getTrimmedString(idFolder, EXPERIMENT_CODE);
-        return new ExperimentIdentifier(groupCode, projectCode, experimentCode);
+        return new ExperimentIdentifier(instanceCode, groupCode, projectCode, experimentCode);
     }
 
+    private final String instanceCode;
+    
     private final String groupCode;
 
     private final String projectCode;
@@ -58,13 +63,16 @@ public class ExperimentIdentifier implements IStorable
     /**
      * Creates an instance for the specified codes of group, project, and experiment.
      * 
+     * @param instanceCode A non-empty string of the instance code.
      * @param groupCode A non-empty string of the group code.
      * @param projectCode A non-empty string of the project code.
      * @param experimentCode A non-empty string of the experiment code.
      */
-    public ExperimentIdentifier(final String groupCode, final String projectCode,
+    public ExperimentIdentifier(final String instanceCode, final String groupCode, final String projectCode,
             final String experimentCode)
     {
+        assert StringUtils.isEmpty(instanceCode) == false : "Undefined instance code";
+        this.instanceCode = instanceCode;
         assert StringUtils.isEmpty(groupCode) == false : "Undefined group code";
         this.groupCode = groupCode;
         assert StringUtils.isEmpty(projectCode) == false : "Undefined project code";
@@ -73,6 +81,14 @@ public class ExperimentIdentifier implements IStorable
         this.experimentCode = experimentCode;
     }
 
+    /**
+     * Returns the instance code;
+     */
+    public final String getInstanceCode()
+    {
+        return instanceCode;
+    }
+
     /**
      * Returns the group code;
      */
@@ -107,6 +123,7 @@ public class ExperimentIdentifier implements IStorable
     public final void saveTo(final IDirectory directory)
     {
         final IDirectory folder = directory.makeDirectory(FOLDER);
+        folder.addKeyValuePair(INSTANCE_CODE, instanceCode);
         folder.addKeyValuePair(GROUP_CODE, groupCode);
         folder.addKeyValuePair(PROJECT_CODE, projectCode);
         folder.addKeyValuePair(EXPERIMENT_CODE, experimentCode);
@@ -128,14 +145,15 @@ public class ExperimentIdentifier implements IStorable
             return false;
         }
         final ExperimentIdentifier id = (ExperimentIdentifier) obj;
-        return id.groupCode.equals(groupCode) && id.projectCode.equals(projectCode)
-                && id.experimentCode.equals(experimentCode);
+        return id.instanceCode.equals(instanceCode) && id.groupCode.equals(groupCode)
+                && id.projectCode.equals(projectCode) && id.experimentCode.equals(experimentCode);
     }
 
     @Override
     public final int hashCode()
     {
         int result = 17;
+        result = 37 * result + instanceCode.hashCode();
         result = 37 * result + groupCode.hashCode();
         result = 37 * result + projectCode.hashCode();
         result = 37 * result + experimentCode.hashCode();
@@ -145,8 +163,8 @@ public class ExperimentIdentifier implements IStorable
     @Override
     public final String toString()
     {
-        return "[group:" + groupCode + ",project:" + projectCode + ",experiment:" + experimentCode
-                + "]";
+        return "[instance:" + instanceCode + ",group:" + groupCode + ",project:" + projectCode
+                + ",experiment:" + experimentCode + "]";
     }
 
 }
diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureLoaderTest.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureLoaderTest.java
index ba55003bd89f77f91fdde5dad67ddd708b331992..76d668be6320e4f707f2a20d3c3b541a2b6d49e4 100644
--- a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureLoaderTest.java
+++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureLoaderTest.java
@@ -45,7 +45,7 @@ public final class DataStructureLoaderTest extends AbstractFileSystemTestCase
         dataStructure.create();
         dataStructure.getOriginalData().addKeyValuePair("answer", "42");
         dataStructure.setFormat(UnknownFormatV1_0.UNKNOWN_1_0);
-        final ExperimentIdentifier experimentIdentifier = new ExperimentIdentifier("g", "p", "e");
+        final ExperimentIdentifier experimentIdentifier = new ExperimentIdentifier("i", "g", "p", "e");
         dataStructure.setExperimentIdentifier(experimentIdentifier);
         final ExperimentRegistrator experimentRegistrator =
                 new ExperimentRegistrator("john", "doe", "j@doe");
diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureTestV1_0.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureTestV1_0.java
index fe21f45bfeb575fcccaa3f61e641e5aa99ca50b3..7476aa9148602cd63f4fe927e8d8991efa9ca097 100644
--- a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureTestV1_0.java
+++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureTestV1_0.java
@@ -106,11 +106,12 @@ public final class DataStructureTestV1_0 extends AbstractFileSystemTestCase
     public void testSetExperimentIdentifier()
     {
         dataStructure.create();
-        final ExperimentIdentifier id = new ExperimentIdentifier("g", "p", "e");
+        final ExperimentIdentifier id = new ExperimentIdentifier("i", "g", "p", "e");
         dataStructure.setExperimentIdentifier(id);
         final IDirectory root = storage.getRoot();
         final IDirectory metaData = Utilities.getSubDirectory(root, DataStructureV1_0.DIR_METADATA);
         final IDirectory idDir = Utilities.getSubDirectory(metaData, ExperimentIdentifier.FOLDER);
+        assertEquals("i\n", Utilities.getString(idDir, ExperimentIdentifier.INSTANCE_CODE));
         assertEquals("g\n", Utilities.getString(idDir, ExperimentIdentifier.GROUP_CODE));
         assertEquals("p\n", Utilities.getString(idDir, ExperimentIdentifier.PROJECT_CODE));
         assertEquals("e\n", Utilities.getString(idDir, ExperimentIdentifier.EXPERIMENT_CODE));
@@ -120,12 +121,13 @@ public final class DataStructureTestV1_0 extends AbstractFileSystemTestCase
     public void testSetExperimentIdentifierTwice()
     {
         dataStructure.create();
-        dataStructure.setExperimentIdentifier(new ExperimentIdentifier("a", "b", "c"));
-        final ExperimentIdentifier id = new ExperimentIdentifier("g", "p", "e");
+        dataStructure.setExperimentIdentifier(new ExperimentIdentifier("0", "a", "b", "c"));
+        final ExperimentIdentifier id = new ExperimentIdentifier("i", "g", "p", "e");
         dataStructure.setExperimentIdentifier(id);
         final IDirectory root = storage.getRoot();
         final IDirectory metaData = Utilities.getSubDirectory(root, DataStructureV1_0.DIR_METADATA);
         final IDirectory idDir = Utilities.getSubDirectory(metaData, ExperimentIdentifier.FOLDER);
+        assertEquals("i\n", Utilities.getString(idDir, ExperimentIdentifier.INSTANCE_CODE));
         assertEquals("g\n", Utilities.getString(idDir, ExperimentIdentifier.GROUP_CODE));
         assertEquals("p\n", Utilities.getString(idDir, ExperimentIdentifier.PROJECT_CODE));
         assertEquals("e\n", Utilities.getString(idDir, ExperimentIdentifier.EXPERIMENT_CODE));
@@ -149,7 +151,7 @@ public final class DataStructureTestV1_0 extends AbstractFileSystemTestCase
     public void testGetExperimentIdentifier()
     {
         dataStructure.create();
-        final ExperimentIdentifier id = new ExperimentIdentifier("g", "p", "e");
+        final ExperimentIdentifier id = new ExperimentIdentifier("i", "g", "p", "e");
         dataStructure.setExperimentIdentifier(id);
         assertEquals(id, dataStructure.getExperimentIdentifier());
     }
@@ -240,7 +242,7 @@ public final class DataStructureTestV1_0 extends AbstractFileSystemTestCase
         dataStructure.create();
         dataStructure.getOriginalData().addKeyValuePair("answer", "42");
         dataStructure.setFormat(UnknownFormatV1_0.UNKNOWN_1_0);
-        dataStructure.setExperimentIdentifier(new ExperimentIdentifier("g", "p", "e"));
+        dataStructure.setExperimentIdentifier(new ExperimentIdentifier("i", "g", "p", "e"));
         dataStructure.setExperimentRegistrationTimestamp(new ExperimentRegistrationTimestamp(
                 new Date(0)));
         try
@@ -259,7 +261,7 @@ public final class DataStructureTestV1_0 extends AbstractFileSystemTestCase
         dataStructure.create();
         dataStructure.getOriginalData().addKeyValuePair("answer", "42");
         dataStructure.setFormat(UnknownFormatV1_0.UNKNOWN_1_0);
-        dataStructure.setExperimentIdentifier(new ExperimentIdentifier("g", "p", "e"));
+        dataStructure.setExperimentIdentifier(new ExperimentIdentifier("i", "g", "p", "e"));
         dataStructure.setExperimentRegistrator(new ExperimentRegistrator("g", "p", "g@p"));
         try
         {
@@ -277,7 +279,7 @@ public final class DataStructureTestV1_0 extends AbstractFileSystemTestCase
         dataStructure.create();
         dataStructure.getOriginalData().addKeyValuePair("answer", "42");
         dataStructure.setFormat(UnknownFormatV1_0.UNKNOWN_1_0);
-        dataStructure.setExperimentIdentifier(new ExperimentIdentifier("g", "p", "e"));
+        dataStructure.setExperimentIdentifier(new ExperimentIdentifier("i", "g", "p", "e"));
         dataStructure.setExperimentRegistrator(new ExperimentRegistrator("g", "p", "g@p"));
         dataStructure.setExperimentRegistrationTimestamp(new ExperimentRegistrationTimestamp(
                 new Date(0)));
@@ -297,7 +299,7 @@ public final class DataStructureTestV1_0 extends AbstractFileSystemTestCase
         dataStructure.create();
         dataStructure.getOriginalData().addKeyValuePair("answer", "42");
         dataStructure.setFormat(UnknownFormatV1_0.UNKNOWN_1_0);
-        final ExperimentIdentifier experimentIdentifier = new ExperimentIdentifier("g", "p", "e");
+        final ExperimentIdentifier experimentIdentifier = new ExperimentIdentifier("i", "g", "p", "e");
         dataStructure.setExperimentIdentifier(experimentIdentifier);
         final ExperimentRegistrationTimestamp experimentRegistratorDate =
                 new ExperimentRegistrationTimestamp(new Date(4711L * 4711000L));
@@ -486,7 +488,7 @@ public final class DataStructureTestV1_0 extends AbstractFileSystemTestCase
         final IDirectory metaData = root.makeDirectory(DataStructureV1_0.DIR_METADATA);
         new Format(UnknownFormatV1_0.UNKNOWN_1_0.getCode(), new Version(2, 0), null)
                 .saveTo(metaData);
-        new ExperimentIdentifier("g", "p", "e").saveTo(metaData);
+        new ExperimentIdentifier("i", "g", "p", "e").saveTo(metaData);
         new ExperimentRegistrationTimestamp(new Date(0)).saveTo(metaData);
         new ExperimentRegistrator("john", "doe", "j@doe").saveTo(metaData);
         new Sample("a", "CELL_PLATE", "b").saveTo(metaData);
diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierTest.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierTest.java
index 4de2c95582b2faf973693c79d1d18dbf13aa5770..8189071b9b78b3d2bc67e106a75eafbb99fea25c 100644
--- a/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierTest.java
+++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierTest.java
@@ -33,12 +33,12 @@ public final class ExperimentIdentifierTest extends EqualsHashCodeTestCase<Exper
     @Override
     protected final ExperimentIdentifier createInstance() throws Exception
     {
-        return new ExperimentIdentifier("group", "project", "experiment1");
+        return new ExperimentIdentifier("instance", "group", "project", "experiment1");
     }
 
     @Override
     protected final ExperimentIdentifier createNotEqualInstance() throws Exception
     {
-        return new ExperimentIdentifier("group", "project", "experiment2");
+        return new ExperimentIdentifier("instance", "group", "project", "experiment2");
     }
 }