diff --git a/bds/source/java/ch/systemsx/cisd/bds/Constants.java b/bds/source/java/ch/systemsx/cisd/bds/Constants.java
index 0e720d6c2c9b940776461897e17a6e354b578fcd..d04d9fbf6641911b6cb4f35497a39477e9e1ad17 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/Constants.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/Constants.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.bds;
 
 import java.text.SimpleDateFormat;
+import java.util.regex.Pattern;
 
 import ch.systemsx.cisd.common.utilities.DateFormatThreadLocal;
 
@@ -38,6 +39,11 @@ public final class Constants
     public static final ThreadLocal<SimpleDateFormat> DATE_FORMAT =
             new DateFormatThreadLocal(DATE_FORMAT_PATTERN);
 
+    /** Regular expression pattern for <i>UUID</i>. */
+    public static final Pattern UUID_PATTERN =
+            Pattern.compile("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
+                    Pattern.CASE_INSENSITIVE);
+
     private Constants()
     {
         // Can not be instantiated.
diff --git a/bds/source/java/ch/systemsx/cisd/bds/DataSet.java b/bds/source/java/ch/systemsx/cisd/bds/DataSet.java
index a85cf46ffb19f1a891d3e67aa8d074ee44726442..29a5ebb65616e42e07c6325ce83e24c62c187330 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/DataSet.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/DataSet.java
@@ -172,7 +172,7 @@ public final class DataSet implements IStorable
         final String observableTypeCode = Utilities.getTrimmedString(idFolder, OBSERVABLE_TYPE);
         final Boolean isMeasured = Utilities.getBoolean(idFolder, IS_MEASURED);
         final Date productionTimestampOrNull =
-                Utilities.getDateOrNull(idFolder, PRODUCTION_TIMESTAMP);
+                Utilities.tryGetDate(idFolder, PRODUCTION_TIMESTAMP);
         final String producerCode = Utilities.getTrimmedString(idFolder, PRODUCER_CODE);
         final List<String> parentCodes = Utilities.getStringList(idFolder, PARENT_CODES);
         final String strIsComplete = Utilities.getTrimmedString(idFolder, IS_COMPLETE);
diff --git a/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java
index 5fb136cd34f5c5e662e9692b9fc3874e19bb74d8..0a9a55193f4d3886195020be5372471c2dac5eaa 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java
@@ -168,7 +168,7 @@ public class DataStructureV1_0 extends AbstractDataStructure implements IDataStr
      * @throws DataStructureException if the experiment identifier hasn't be loaded nor hasn't be
      *             set by {@link #setExperimentIdentifier(ExperimentIdentifier)}.
      */
-    public final ExperimentIdentifier getExperimentIdentifier()
+    public ExperimentIdentifier getExperimentIdentifier()
     {
         assertOpenOrCreated();
         return ExperimentIdentifier.loadFrom(getMetaDataDirectory());
@@ -177,7 +177,7 @@ public class DataStructureV1_0 extends AbstractDataStructure implements IDataStr
     /**
      * Sets the experiment identifier. Overwrites an already set or loaded value.
      */
-    public final void setExperimentIdentifier(final ExperimentIdentifier experimentIdentifier)
+    public void setExperimentIdentifier(final ExperimentIdentifier experimentIdentifier)
     {
         assert experimentIdentifier != null : "Unspecified experiment identifier";
         assertOpenOrCreated();
@@ -298,7 +298,7 @@ public class DataStructureV1_0 extends AbstractDataStructure implements IDataStr
         {
             throw new DataStructureException("Unspecified format.");
         }
-        if (metaDataDirectory.tryGetNode(ExperimentIdentifier.EXPERIMENT_IDENTIFIER) == null)
+        if (metaDataDirectory.tryGetNode(ExperimentIdentifier.FOLDER) == null)
         {
             throw new DataStructureException("Unspecified experiment identifier.");
         }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_1.java b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_1.java
index c6952bd48aefe55f300267f267f79f2dd3c8d1c5..e037aad5b9879efc3e926df4ee2a880f0a086918 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_1.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_1.java
@@ -54,6 +54,26 @@ public final class DataStructureV1_1 extends DataStructureV1_0
         return (SampleWithOwner) sample;
     }
 
+    /**
+     * Returns the experiment identifier with the database instance <i>UUID</i>.
+     * <p>
+     * This is only available in version 1.1. Using this method with data structure version 1.0
+     * throws an exception.
+     * </p>
+     * 
+     * @throws DataStructureException if trying to use this method with data structure of version
+     *             1.0.
+     */
+    public final ExperimentIdentifierWithUUID getExperimentIdentifierWithUUID()
+    {
+        final ExperimentIdentifier experimentIdentifier = getExperimentIdentifier();
+        if (experimentIdentifier instanceof ExperimentIdentifierWithUUID == false)
+        {
+            throw new DataStructureException("Can not be used in data structure v1.0.");
+        }
+        return (ExperimentIdentifierWithUUID) experimentIdentifier;
+    }
+
     //
     // DataStructureV1_0
     //
@@ -104,16 +124,61 @@ public final class DataStructureV1_1 extends DataStructureV1_0
         super.setSample(sample);
     }
 
+    /**
+     * Sets the experiment identifier. Overwrites an already set or loaded value.
+     * 
+     * @param experimentIdentifier Must be an instance of {@link ExperimentIdentifierWithUUID}.
+     */
     @Override
-    public final void performClosing()
+    public final void setExperimentIdentifier(final ExperimentIdentifier experimentIdentifier)
+    {
+        assert experimentIdentifier != null : "Unspecified experiment identifier.";
+        if (experimentIdentifier instanceof ExperimentIdentifierWithUUID == false)
+        {
+            throw new DataStructureException("Must be an instance of ExperimentIdentifierWithUUID.");
+        }
+        super.setExperimentIdentifier(experimentIdentifier);
+    }
+
+    /**
+     * Returns the experiment identifier.
+     * <p>
+     * For backward compatibility, loads a {@link ExperimentIdentifier} when no
+     * <code>ExperimentIdentifierWithUUID.INSTANCE_UUID</code> node could be found in experiment
+     * identifier directory.
+     * </p>
+     * 
+     * @throws DataStructureException if the experiment identifier hasn't be loaded nor hasn't be
+     *             set by {@link #setExperimentIdentifier(ExperimentIdentifier)}.
+     * @return a {@link Sample} or {@link SampleWithOwner} (if v1.1).
+     */
+    @Override
+    public final ExperimentIdentifier getExperimentIdentifier()
     {
-        if (getSample() instanceof SampleWithOwner)
+        assertOpenOrCreated();
+        final IDirectory metaDataDirectory = getMetaDataDirectory();
+        final IDirectory experimentIdentifierDirectory =
+                metaDataDirectory.tryGetNode(ExperimentIdentifier.FOLDER).tryAsDirectory();
+        if (experimentIdentifierDirectory.tryGetNode(ExperimentIdentifierWithUUID.INSTANCE_UUID) == null)
         {
-            super.performClosing();
-        } else
+            return ExperimentIdentifier.loadFrom(metaDataDirectory);
+        }
+        return ExperimentIdentifierWithUUID.loadFrom(metaDataDirectory);
+    }
+
+    @Override
+    public final void performClosing()
+    {
+        if (getSample() instanceof SampleWithOwner == false)
         {
             throw new DataStructureException(
                     "The owner (group or database instance) has not been set.");
         }
+        if (getExperimentIdentifier() instanceof ExperimentIdentifierWithUUID == false)
+        {
+            throw new DataStructureException(
+                    "Instance UUID not specified for exeperiment identifier.");
+        }
+        super.performClosing();
     }
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
index ebe4309a1ed3d5cdad0905dbee81fa11a6e4b73b..44dc99374281ba14b6980611b8c98e979929f8b5 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java
@@ -16,6 +16,9 @@
 
 package ch.systemsx.cisd.bds;
 
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
 import ch.systemsx.cisd.bds.exception.DataStructureException;
 import ch.systemsx.cisd.bds.storage.IDirectory;
 
@@ -27,12 +30,10 @@ import ch.systemsx.cisd.bds.storage.IDirectory;
  */
 public class ExperimentIdentifier implements IStorable
 {
-    static final String EXPERIMENT_IDENTIFIER = "experiment_identifier";
+    static final String FOLDER = "experiment_identifier";
 
     static final String INSTANCE_CODE = "instance_code";
 
-    static final String INSTANCE_UUID = "instance_uuid";
-
     static final String GROUP_CODE = "group_code";
 
     static final String PROJECT_CODE = "project_code";
@@ -44,9 +45,9 @@ public class ExperimentIdentifier implements IStorable
      * 
      * @throws DataStructureException if file missing.
      */
-    final static ExperimentIdentifier loadFrom(final IDirectory directory)
+    static ExperimentIdentifier loadFrom(final IDirectory directory)
     {
-        final IDirectory idFolder = Utilities.getSubDirectory(directory, EXPERIMENT_IDENTIFIER);
+        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);
@@ -63,7 +64,8 @@ public class ExperimentIdentifier implements IStorable
     private final String experimentCode;
 
     /**
-     * Creates an instance for the specified codes of group, project, and experiment.
+     * Creates an instance for the specified database instance and 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.
@@ -83,8 +85,38 @@ public class ExperimentIdentifier implements IStorable
         this.experimentCode = experimentCode;
     }
 
+    final ToStringBuilder createToStringBuilder()
+    {
+        final ToStringBuilder builder = new ToStringBuilder();
+        builder.append(INSTANCE_CODE, instanceCode);
+        builder.append(GROUP_CODE, groupCode);
+        builder.append(PROJECT_CODE, projectCode);
+        builder.append(EXPERIMENT_CODE, experimentCode);
+        return builder;
+    }
+
+    final EqualsBuilder createEqualsBuilder(final ExperimentIdentifier experimentIdentifier)
+    {
+        final EqualsBuilder builder = new EqualsBuilder();
+        builder.append(instanceCode, experimentIdentifier.instanceCode);
+        builder.append(groupCode, experimentIdentifier.groupCode);
+        builder.append(projectCode, experimentIdentifier.projectCode);
+        builder.append(experimentCode, experimentIdentifier.experimentCode);
+        return builder;
+    }
+
+    final HashCodeBuilder createHashCodeBuilder()
+    {
+        final HashCodeBuilder builder = new HashCodeBuilder();
+        builder.append(instanceCode);
+        builder.append(groupCode);
+        builder.append(projectCode);
+        builder.append(experimentCode);
+        return builder;
+    }
+
     /**
-     * Returns the instance code;
+     * Returns the instance code.
      */
     public final String getInstanceCode()
     {
@@ -92,7 +124,7 @@ public class ExperimentIdentifier implements IStorable
     }
 
     /**
-     * Returns the group code;
+     * Returns the group code.
      */
     public final String getGroupCode()
     {
@@ -100,7 +132,7 @@ public class ExperimentIdentifier implements IStorable
     }
 
     /**
-     * Returns the project code;
+     * Returns the project code.
      */
     public final String getProjectCode()
     {
@@ -108,7 +140,7 @@ public class ExperimentIdentifier implements IStorable
     }
 
     /**
-     * Returns the experiment code;
+     * Returns the experiment code.
      */
     public final String getExperimentCode()
     {
@@ -122,9 +154,9 @@ public class ExperimentIdentifier implements IStorable
     /**
      * Saves this instance to the specified directory.
      */
-    public final void saveTo(final IDirectory directory)
+    public void saveTo(final IDirectory directory)
     {
-        final IDirectory folder = directory.makeDirectory(EXPERIMENT_IDENTIFIER);
+        final IDirectory folder = directory.makeDirectory(FOLDER);
         folder.addKeyValuePair(INSTANCE_CODE, instanceCode);
         folder.addKeyValuePair(GROUP_CODE, groupCode);
         folder.addKeyValuePair(PROJECT_CODE, projectCode);
@@ -146,31 +178,19 @@ public class ExperimentIdentifier implements IStorable
         {
             return false;
         }
-        final ExperimentIdentifier id = (ExperimentIdentifier) obj;
-        return id.instanceCode.equals(instanceCode) && id.groupCode.equals(groupCode)
-                && id.projectCode.equals(projectCode) && id.experimentCode.equals(experimentCode);
+        return createEqualsBuilder((ExperimentIdentifier) obj).isEquals();
     }
 
     @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();
-        return result;
+        return createHashCodeBuilder().toHashCode();
     }
 
     @Override
     public final String toString()
     {
-        final ToStringBuilder builder = new ToStringBuilder();
-        builder.append(INSTANCE_CODE, instanceCode);
-        builder.append(GROUP_CODE, groupCode);
-        builder.append(PROJECT_CODE, projectCode);
-        builder.append(EXPERIMENT_CODE, experimentCode);
-        return builder.toString();
+        return createToStringBuilder().toString();
     }
 
 }
diff --git a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifierWithUUID.java b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifierWithUUID.java
new file mode 100644
index 0000000000000000000000000000000000000000..03692c237e6d0d9d948de945d28d74a36ae8d047
--- /dev/null
+++ b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifierWithUUID.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2008 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.bds;
+
+import ch.systemsx.cisd.bds.exception.DataStructureException;
+import ch.systemsx.cisd.bds.storage.IDirectory;
+
+/**
+ * A small {@link ExperimentIdentifier} extension which adds the reading/writing of database
+ * instance <i>UUID</i>.
+ * <p>
+ * Does not override {@link #equals(Object)} resp. {@link #hashCode()} methods as equality for this
+ * class is based on the same rules.
+ * </p>
+ * 
+ * @author Christian Ribeaud
+ */
+public final class ExperimentIdentifierWithUUID extends ExperimentIdentifier
+{
+    static final String INSTANCE_UUID = "instance_uuid";
+
+    private final String instanceUUID;
+
+    /**
+     * Creates an instance for the specified {@link ExperimentIdentifier} and given database
+     * instance <i>UUID</i>.
+     * 
+     * @param instanceUUID A non-empty string of the instance <i>UUID</i>.
+     * @param experimentIdentifier A non-<code>null</code> experiment identifier.
+     */
+    public ExperimentIdentifierWithUUID(final ExperimentIdentifier experimentIdentifier,
+            final String instanceUUID)
+    {
+        this(experimentIdentifier.getInstanceCode(), instanceUUID, experimentIdentifier
+                .getGroupCode(), experimentIdentifier.getProjectCode(), experimentIdentifier
+                .getExperimentCode());
+    }
+
+    /**
+     * Creates an instance for the specified database instance and codes of group, project and
+     * experiment.
+     * 
+     * @param instanceCode A non-empty string of the instance code.
+     * @param instanceUUID A non-empty string of the instance <i>UUID</i>.
+     * @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 ExperimentIdentifierWithUUID(final String instanceCode, final String instanceUUID,
+            final String groupCode, final String projectCode, final String experimentCode)
+    {
+        super(instanceCode, groupCode, projectCode, experimentCode);
+        assert StringUtils.isEmpty(instanceUUID) == false : "Undefined instance UUID";
+        this.instanceUUID = instanceUUID;
+    }
+
+    /**
+     * Returns the instance <i>UUID</i>.
+     */
+    public final String getInstanceUUID()
+    {
+        return instanceUUID;
+    }
+
+    //
+    // ExperimentIdentifier
+    //
+
+    /**
+     * Loads the experiment identifier from the specified directory.
+     * 
+     * @throws DataStructureException if file missing.
+     */
+    final static ExperimentIdentifierWithUUID 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);
+        final String instanceUUID =
+                Utilities.getTrimmedString(idFolder, ExperimentIdentifierWithUUID.INSTANCE_UUID);
+        return new ExperimentIdentifierWithUUID(instanceCode, instanceUUID, groupCode, projectCode,
+                experimentCode);
+
+    }
+
+    @Override
+    public final void saveTo(final IDirectory directory)
+    {
+        super.saveTo(directory);
+        final IDirectory folder = directory.makeDirectory(FOLDER);
+        folder.addKeyValuePair(ExperimentIdentifierWithUUID.INSTANCE_UUID, instanceUUID);
+    }
+}
diff --git a/bds/source/java/ch/systemsx/cisd/bds/ExperimentRegistrationTimestamp.java b/bds/source/java/ch/systemsx/cisd/bds/ExperimentRegistrationTimestamp.java
index 00b5ae18761efe9c4d0b133d11c3ed05ef49c4b4..57631b8a227abb249d912b836ed1ddbc69fa1ba1 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/ExperimentRegistrationTimestamp.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/ExperimentRegistrationTimestamp.java
@@ -39,7 +39,7 @@ public final class ExperimentRegistrationTimestamp implements IStorable
 
     final static ExperimentRegistrationTimestamp loadFrom(final IDirectory directory)
     {
-        return new ExperimentRegistrationTimestamp(Utilities.getDateOrNull(directory,
+        return new ExperimentRegistrationTimestamp(Utilities.tryGetDate(directory,
                 EXPERIMENT_REGISTRATION_TIMESTAMP));
     }
 
diff --git a/bds/source/java/ch/systemsx/cisd/bds/SampleWithOwner.java b/bds/source/java/ch/systemsx/cisd/bds/SampleWithOwner.java
index 410a2c29f12800ab38f4486156c4bdfbe7547e24..051e25b96a91e99ed73fb53f32c307ea5f5c3371 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/SampleWithOwner.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/SampleWithOwner.java
@@ -34,7 +34,7 @@ public final class SampleWithOwner extends Sample
 
     static final String INSTANCE_CODE = ExperimentIdentifier.INSTANCE_CODE;
 
-    static final String INSTANCE_UUID = ExperimentIdentifier.INSTANCE_UUID;
+    static final String INSTANCE_UUID = ExperimentIdentifierWithUUID.INSTANCE_UUID;
 
     private final String groupCode;
 
diff --git a/bds/source/java/ch/systemsx/cisd/bds/Utilities.java b/bds/source/java/ch/systemsx/cisd/bds/Utilities.java
index f99601db8498287d7f91e7b6ea9b6edcaeabd886..2bc4f3a28b10d1b92a2083b826f0472fb5ee5c62 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/Utilities.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/Utilities.java
@@ -196,7 +196,7 @@ public class Utilities
      * 
      * @return the parsed date or <code>null</code> if the value is empty.
      */
-    public final static Date getDateOrNull(final IDirectory directory, final String name)
+    public final static Date tryGetDate(final IDirectory directory, final String name)
             throws DataStructureException
     {
         // No assertion here as 'getString(IDirectory, String)' already does it.
diff --git a/bds/source/java/ch/systemsx/cisd/bds/check/AbstractChecker.java b/bds/source/java/ch/systemsx/cisd/bds/check/AbstractChecker.java
index aefb7f619be46096907d09339f3e712de4230d85..44e4c9bec41c4a41b27a9fc805a28f6e459a0f3e 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/check/AbstractChecker.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/check/AbstractChecker.java
@@ -200,6 +200,8 @@ public abstract class AbstractChecker
     private static final String IO_EXCEPTION_WHILE_COMPARING_FILES =
             "I/O Exception while comparing file '%s' with file '%s': %s";
 
+    public static final String MSG_WRONG_UUID = "Value '%s' found in file '%s' is not a UUID";
+
     protected static final String path(final String... args)
     {
         final String separator = "/";
diff --git a/bds/source/java/ch/systemsx/cisd/bds/check/StructureChecker.java b/bds/source/java/ch/systemsx/cisd/bds/check/StructureChecker.java
index 5ccb3ebb6340feecc498872230792d5815baee41..bfb8b4e94ac3df7a6a17fcdff5f4588b0afcd313 100644
--- a/bds/source/java/ch/systemsx/cisd/bds/check/StructureChecker.java
+++ b/bds/source/java/ch/systemsx/cisd/bds/check/StructureChecker.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.bds.check;
 
 import java.io.File;
 
+import ch.systemsx.cisd.bds.Constants;
 import ch.systemsx.cisd.bds.StringUtils;
 import ch.systemsx.cisd.bds.Utilities;
 import ch.systemsx.cisd.bds.exception.DataStructureException;
@@ -151,7 +152,7 @@ public final class StructureChecker extends AbstractChecker
             final IDirectory sample = Utilities.getSubDirectory(metadata, AbstractChecker.SAMPLE);
             checkFileNotEmptyAndTrimmed(sample, AbstractChecker.GROUP_CODE);
             checkFileNotEmptyAndTrimmed(sample, AbstractChecker.INSTANCE_CODE);
-            checkFileNotEmptyAndTrimmed(sample, AbstractChecker.INSTANCE_UUID);
+            checkFileContainsUUID(sample, AbstractChecker.INSTANCE_UUID);
             checkFileNotEmptyAndTrimmed(sample, AbstractChecker.TYPE_DESCRIPTION);
             checkFileNotEmptyAndTrimmed(sample, AbstractChecker.TYPE_CODE);
             checkFileNotEmptyAndTrimmed(sample, AbstractChecker.CODE);
@@ -188,6 +189,7 @@ public final class StructureChecker extends AbstractChecker
             final IDirectory experimentIdentifier =
                     Utilities.getSubDirectory(metadata, AbstractChecker.EXPERIMENT_IDENTIFIER);
             checkFileNotEmptyAndTrimmed(experimentIdentifier, AbstractChecker.INSTANCE_CODE);
+            checkFileContainsUUID(experimentIdentifier, AbstractChecker.INSTANCE_UUID);
             checkFileNotEmptyAndTrimmed(experimentIdentifier, AbstractChecker.GROUP_CODE);
             checkFileNotEmptyAndTrimmed(experimentIdentifier, AbstractChecker.PROJECT_CODE);
             checkFileNotEmptyAndTrimmed(experimentIdentifier, AbstractChecker.EXPERIMENT_CODE);
@@ -266,7 +268,7 @@ public final class StructureChecker extends AbstractChecker
         try
         {
             checkTrimmed(problemReport, dataDir, name);
-            if (Utilities.getDateOrNull(dataDir, name) == null)
+            if (Utilities.tryGetDate(dataDir, name) == null)
             {
                 throw new DataStructureException(String.format(
                         AbstractChecker.MSG_DOES_NOT_CONTAIN_TIMESTAMP, name));
@@ -277,7 +279,24 @@ public final class StructureChecker extends AbstractChecker
         }
     }
 
-    private void checkFileNotEmpty(final IDirectory dataDir, final String name,
+    private final void checkFileContainsUUID(final IDirectory directory, final String name)
+    {
+        try
+        {
+            checkTrimmed(problemReport, directory, name);
+            final String value = Utilities.getTrimmedString(directory, name);
+            if (Constants.UUID_PATTERN.matcher(value).matches() == false)
+            {
+                throw new DataStructureException(String.format(AbstractChecker.MSG_WRONG_UUID,
+                        value, name));
+            }
+        } catch (final Exception e)
+        {
+            problemReport.error(e.getMessage());
+        }
+    }
+
+    private final void checkFileNotEmpty(final IDirectory dataDir, final String name,
             final boolean mustBeTrimmed)
     {
         try
diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataSetFileSystemTestCase.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataSetFileSystemTestCase.java
index d5ae579f6a97747bd3199b4d0d312113c6f82ce6..d50db73393a764266a671b2699bb2c3c9c30dcc2 100644
--- a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataSetFileSystemTestCase.java
+++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataSetFileSystemTestCase.java
@@ -53,7 +53,7 @@ public final class DataSetFileSystemTestCase extends AbstractFileSystemTestCase
         assertEquals(0, Utilities.getStringList(folder, DataSet.PARENT_CODES).size());
         assertEquals(StringUtils.EMPTY_STRING, Utilities.getTrimmedString(folder,
                 DataSet.PRODUCER_CODE));
-        assertNull(Utilities.getDateOrNull(folder, DataSet.PRODUCTION_TIMESTAMP));
+        assertNull(Utilities.tryGetDate(folder, DataSet.PRODUCTION_TIMESTAMP));
         assertEquals(StringUtils.EMPTY_STRING, Utilities.getTrimmedString(folder,
                 DataSet.PRODUCTION_TIMESTAMP));
     }
@@ -82,7 +82,7 @@ public final class DataSetFileSystemTestCase extends AbstractFileSystemTestCase
         checkBasicDataSet(folder, dataSetCode, observableType, Boolean.TRUE);
         assertEquals(0, Utilities.getStringList(folder, DataSet.PARENT_CODES).size());
         assertEquals(producerCode, Utilities.getTrimmedString(folder, DataSet.PRODUCER_CODE));
-        assertEquals(productionTimestamp, Utilities.getDateOrNull(folder,
+        assertEquals(productionTimestamp, Utilities.tryGetDate(folder,
                 DataSet.PRODUCTION_TIMESTAMP));
     }
 
@@ -114,7 +114,7 @@ public final class DataSetFileSystemTestCase extends AbstractFileSystemTestCase
         assertEquals(parentCode, parentList.get(0));
         assertEquals(StringUtils.EMPTY_STRING, Utilities.getTrimmedString(folder,
                 DataSet.PRODUCER_CODE));
-        assertNull(Utilities.getDateOrNull(folder, DataSet.PRODUCTION_TIMESTAMP));
+        assertNull(Utilities.tryGetDate(folder, DataSet.PRODUCTION_TIMESTAMP));
         assertEquals(StringUtils.EMPTY_STRING, Utilities.getTrimmedString(folder,
                 DataSet.PRODUCTION_TIMESTAMP));
     }
diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_0Test.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_0Test.java
index 49cf8be238c5575ff31151ac4fbc4824869a6a84..ee4d83f580fc26176081960fa5d31c6bbd0c2d44 100644
--- a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_0Test.java
+++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_0Test.java
@@ -110,8 +110,7 @@ public final class DataStructureV1_0Test extends AbstractFileSystemTestCase
         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.EXPERIMENT_IDENTIFIER);
+        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));
@@ -127,8 +126,7 @@ public final class DataStructureV1_0Test extends AbstractFileSystemTestCase
         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.EXPERIMENT_IDENTIFIER);
+        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));
@@ -145,7 +143,7 @@ public final class DataStructureV1_0Test extends AbstractFileSystemTestCase
             fail("DataStructureException expected.");
         } catch (final DataStructureException e)
         {
-            assertPartOfString(ExperimentIdentifier.EXPERIMENT_IDENTIFIER, e.getMessage());
+            assertPartOfString(ExperimentIdentifier.FOLDER, e.getMessage());
         }
     }
 
diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_1Test.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_1Test.java
index 61a598b833b2e1d481a44af1af5ce7c714d24362..2ec7debc0b9ea531683f77198f83408b6e3eb2e9 100644
--- a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_1Test.java
+++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_1Test.java
@@ -40,10 +40,21 @@ public final class DataStructureV1_1Test extends AbstractFileSystemTestCase
 {
     private static final Sample SAMPLE = new Sample("a", "CELL_PLATE", "b");
 
+    private static final ExperimentIdentifier EXPERIMENT_IDENTIFIER =
+            new ExperimentIdentifier(SampleWithOwnerTest.INSTANCE_CODE,
+                    SampleWithOwnerTest.GROUP_CODE, ExperimentIdentifierTest.PROJECT_CODE,
+                    ExperimentIdentifierTest.EXPERMENT_CODE);
+
     private FileStorage storage;
 
     private DataStructureV1_1 dataStructure;
 
+    private final static SampleWithOwner createSampleWithOwner()
+    {
+        return new SampleWithOwner(SAMPLE, SampleWithOwnerTest.INSTANCE_UUID,
+                SampleWithOwnerTest.INSTANCE_CODE, "");
+    }
+
     //
     // AbstractFileSystemTestCase
     //
@@ -76,17 +87,14 @@ public final class DataStructureV1_1Test extends AbstractFileSystemTestCase
         {
             // Nothing to do here.
         }
-        dataStructure.setSample(new SampleWithOwner(SAMPLE,
-                SampleWithOwnerTest.INSTANCE_GLOBAL_CODE, SampleWithOwnerTest.INSTANCE_CODE, ""));
+        dataStructure.setSample(createSampleWithOwner());
     }
 
     @Test
     public final void testGetSample()
     {
         dataStructure.create();
-        final SampleWithOwner sampleWithOwner =
-                new SampleWithOwner(SAMPLE, SampleWithOwnerTest.INSTANCE_GLOBAL_CODE,
-                        SampleWithOwnerTest.INSTANCE_CODE, "");
+        final SampleWithOwner sampleWithOwner = createSampleWithOwner();
         dataStructure.setSample(sampleWithOwner);
         final Sample sample = dataStructure.getSample();
         assertTrue(sample instanceof SampleWithOwner);
@@ -96,7 +104,35 @@ public final class DataStructureV1_1Test extends AbstractFileSystemTestCase
     }
 
     @Test
-    public void testOpenVersionV1_0()
+    public final void testGetExperimentIdentifier()
+    {
+        dataStructure.create();
+        final ExperimentIdentifierWithUUID experimentIdentifierWithUUID =
+                ExperimentIdentifierWithUUIDTest.createExperimentIdentifierWithUUID();
+        dataStructure.setExperimentIdentifier(experimentIdentifierWithUUID);
+        final ExperimentIdentifier experimentIdentifier = dataStructure.getExperimentIdentifier();
+        assertTrue(experimentIdentifier instanceof ExperimentIdentifierWithUUID);
+        assertEquals(SampleWithOwnerTest.INSTANCE_UUID,
+                ((ExperimentIdentifierWithUUID) experimentIdentifier).getInstanceUUID());
+    }
+
+    @Test
+    public final void testSetExperimentIdentifier()
+    {
+        dataStructure.create();
+        try
+        {
+            dataStructure.setExperimentIdentifier(EXPERIMENT_IDENTIFIER);
+            fail();
+        } catch (final DataStructureException ex)
+        {
+            // Nothing to do here.
+        }
+        dataStructure.setExperimentIdentifier(ExperimentIdentifierWithUUIDTest.createExperimentIdentifierWithUUID());
+    }
+
+    @Test
+    public final void testOpenVersionV1_0()
     {
         DataStructureV1_0Test.createExampleDataStructure(storage, new Version(1, 0));
         storage.mount();
@@ -136,10 +172,8 @@ public final class DataStructureV1_1Test extends AbstractFileSystemTestCase
         {
             // Nothing to do here.
         }
-        final SampleWithOwner sampleWithOwner =
-                new SampleWithOwner(SAMPLE, SampleWithOwnerTest.INSTANCE_GLOBAL_CODE,
-                        SampleWithOwnerTest.INSTANCE_CODE, "");
-        dataStructure.setSample(sampleWithOwner);
+        dataStructure.setSample(createSampleWithOwner());
+        dataStructure.setExperimentIdentifier(ExperimentIdentifierWithUUIDTest.createExperimentIdentifierWithUUID());
         dataStructure.close();
     }
 }
diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierTest.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierTest.java
index e9c27283f176ac6b70830e5e7449e893a314ceb8..e64ceab7faba1657752bca5d0b5a3ac73ec40e82 100644
--- a/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierTest.java
+++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierTest.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.bds;
 
+import static org.testng.AssertJUnit.assertFalse;
+
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.test.EqualsHashCodeTestCase;
@@ -29,6 +31,35 @@ import ch.systemsx.cisd.common.test.EqualsHashCodeTestCase;
 public final class ExperimentIdentifierTest extends EqualsHashCodeTestCase<ExperimentIdentifier>
 {
 
+    static final String EXPERMENT_CODE = "EXP1";
+
+    static final String PROJECT_CODE = "PROJ1";
+
+    @Test
+    public final void testConstructor()
+    {
+        boolean fail = true;
+        try
+        {
+            new ExperimentIdentifier(SampleWithOwner.INSTANCE_CODE, SampleWithOwner.GROUP_CODE,
+                    null, null);
+        } catch (final AssertionError ex)
+        {
+            fail = false;
+        }
+        assertFalse(fail);
+        fail = true;
+        try
+        {
+            new ExperimentIdentifier(SampleWithOwner.INSTANCE_CODE, SampleWithOwner.GROUP_CODE,
+                    PROJECT_CODE, "");
+        } catch (final AssertionError ex)
+        {
+            fail = false;
+        }
+        assertFalse(fail);
+    }
+
     //
     // EqualsHashCodeTestCase
     //
diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierWithUUIDTest.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierWithUUIDTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..facb3f431dfe48b874c4d56ab27b48595f10afcf
--- /dev/null
+++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/ExperimentIdentifierWithUUIDTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2008 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.bds;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertNotNull;
+
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.bds.storage.IDirectory;
+import ch.systemsx.cisd.bds.storage.filesystem.NodeFactory;
+import ch.systemsx.cisd.common.filesystem.AbstractFileSystemTestCase;
+
+/**
+ * Test cases for corresponding {@link ExperimentIdentifierWithUUID} class.
+ * 
+ * @author Christian Ribeaud
+ */
+public final class ExperimentIdentifierWithUUIDTest extends AbstractFileSystemTestCase
+{
+    final static ExperimentIdentifierWithUUID createExperimentIdentifierWithUUID()
+    {
+        return new ExperimentIdentifierWithUUID(SampleWithOwnerTest.INSTANCE_CODE,
+                SampleWithOwnerTest.INSTANCE_UUID, SampleWithOwnerTest.GROUP_CODE,
+                ExperimentIdentifierTest.PROJECT_CODE, ExperimentIdentifierTest.EXPERMENT_CODE);
+    }
+
+    @Test
+    public final void testConstructor()
+    {
+        boolean fail = true;
+        try
+        {
+            new ExperimentIdentifierWithUUID(SampleWithOwner.INSTANCE_CODE, null,
+                    SampleWithOwner.GROUP_CODE, ExperimentIdentifierTest.PROJECT_CODE,
+                    ExperimentIdentifierTest.EXPERMENT_CODE);
+        } catch (final AssertionError ex)
+        {
+            fail = false;
+        }
+        assertFalse(fail);
+        fail = true;
+        try
+        {
+            new ExperimentIdentifierWithUUID(SampleWithOwner.INSTANCE_CODE, "",
+                    SampleWithOwner.GROUP_CODE, ExperimentIdentifierTest.PROJECT_CODE,
+                    ExperimentIdentifierTest.EXPERMENT_CODE);
+        } catch (final AssertionError ex)
+        {
+            fail = false;
+        }
+        assertFalse(fail);
+        new ExperimentIdentifierWithUUID(SampleWithOwner.INSTANCE_CODE,
+                SampleWithOwner.INSTANCE_UUID, SampleWithOwner.GROUP_CODE,
+                ExperimentIdentifierTest.PROJECT_CODE, ExperimentIdentifierTest.EXPERMENT_CODE);
+    }
+
+    @Test
+    public final void testLoadFrom()
+    {
+        final IDirectory directory = NodeFactory.createDirectoryNode(workingDirectory);
+        final ExperimentIdentifierWithUUID experimentIdentifier =
+                createExperimentIdentifierWithUUID();
+        experimentIdentifier.saveTo(directory);
+        final ExperimentIdentifierWithUUID loaded =
+                ExperimentIdentifierWithUUID.loadFrom(directory);
+        assertEquals(experimentIdentifier, loaded);
+        assertNotNull(loaded.getInstanceUUID());
+        assertEquals(experimentIdentifier.getInstanceUUID(), loaded.getInstanceUUID());
+    }
+}
diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/SampleWithOwnerTest.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/SampleWithOwnerTest.java
index b5c5fa753ed543dccde726577afe5c6ac76e14ce..d5fb6de16ebcc9ea953d0d5a2718bf48ad4ca69d 100644
--- a/bds/sourceTest/java/ch/systemsx/cisd/bds/SampleWithOwnerTest.java
+++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/SampleWithOwnerTest.java
@@ -42,7 +42,7 @@ public final class SampleWithOwnerTest extends AbstractFileSystemTestCase
 
     static final String INSTANCE_CODE = "DB1";
 
-    static final String INSTANCE_GLOBAL_CODE = "111-222";
+    static final String INSTANCE_UUID = "111-222";
 
     static final String GROUP_CODE = "G1";
 
@@ -89,8 +89,8 @@ public final class SampleWithOwnerTest extends AbstractFileSystemTestCase
     {
         return new Object[][]
             {
-                { INSTANCE_GLOBAL_CODE, INSTANCE_CODE, GROUP_CODE },
-                { INSTANCE_GLOBAL_CODE, INSTANCE_CODE, "" }, };
+                { INSTANCE_UUID, INSTANCE_CODE, GROUP_CODE },
+                { INSTANCE_UUID, INSTANCE_CODE, "" }, };
     }
 
     @Test(dataProvider = "getSampleData")
@@ -107,12 +107,12 @@ public final class SampleWithOwnerTest extends AbstractFileSystemTestCase
         {
             assertEquals(GROUP_CODE, newSample.getGroupCode());
             assertEquals(INSTANCE_CODE, newSample.getInstanceCode());
-            assertEquals(INSTANCE_GLOBAL_CODE, newSample.getInstanceUUID());
+            assertEquals(INSTANCE_UUID, newSample.getInstanceUUID());
         } else
         {
             assertEquals("", newSample.getGroupCode());
             assertEquals(INSTANCE_CODE, newSample.getInstanceCode());
-            assertEquals(INSTANCE_GLOBAL_CODE, newSample.getInstanceUUID());
+            assertEquals(INSTANCE_UUID, newSample.getInstanceUUID());
         }
     }
 }
diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/check/StructureCheckerTest.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/check/StructureCheckerTest.java
index 91aba071c6fd9905cf2033e8dabb9e2feb55c5bc..63063122f1018b9d4110a58619373662aa4d3c05 100644
--- a/bds/sourceTest/java/ch/systemsx/cisd/bds/check/StructureCheckerTest.java
+++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/check/StructureCheckerTest.java
@@ -69,16 +69,17 @@ public class StructureCheckerTest extends AbstractCheckerTest
     @Test
     public final void testMissingFiles()
     {
-
-        assertEquals(new StructureChecker(verbose).getStructureConsistencyReport(
-                new File("testdata/bds_missing_files")).numberOfProblems(), 22);
+        final ProblemReport report =
+                new StructureChecker(verbose).getStructureConsistencyReport(new File(
+                        "testdata/bds_missing_files"));
+        assertEquals(report.numberOfProblems(), 23);
     }
 
     @Test
     public final void testEmptyFiles()
     {
         assertEquals(new StructureChecker(verbose).getStructureConsistencyReport(
-                new File("testdata/bds_empty_files")).numberOfProblems(), 26);
+                new File("testdata/bds_empty_files")).numberOfProblems(), 27);
     }
 
     @Test
@@ -87,7 +88,7 @@ public class StructureCheckerTest extends AbstractCheckerTest
         final ProblemReport structureConsistencyReport =
                 new StructureChecker(verbose).getStructureConsistencyReport(new File(
                         "testdata/bds_wrong_values"));
-        assertEquals(structureConsistencyReport.numberOfProblems(), 10);
+        assertEquals(structureConsistencyReport.numberOfProblems(), 11);
     }
 
     @Test
@@ -96,38 +97,32 @@ public class StructureCheckerTest extends AbstractCheckerTest
         final File dir = new File("testdata/bds_new_lines");
         final String path = dir.getAbsolutePath();
 
-        assertEquals(new StructureChecker(verbose).getStructureConsistencyReport(dir).toString(),
-                errorFoundNotTrimmed(path, "major", "/version")
-                        + errorFoundNotTrimmed(path, "minor", "/version")
-                        + errorFoundNotTrimmed(path, "code", "/metadata/data_set")
-                        + errorFoundNotTrimmed(path, "production_timestamp", "/metadata/data_set")
-                        + errorFoundNotTrimmed(path, "producer_code", "/metadata/data_set")
-                        + errorFoundNotTrimmed(path, "observable_type", "/metadata/data_set")
-                        + errorFoundNotTrimmed(path, "is_measured", "/metadata/data_set")
-                        + errorFoundNotTrimmed(path, "is_complete", "/metadata/data_set")
-                        + errorFoundNotTrimmed(path, "major", "/metadata/format/version")
-                        + errorFoundNotTrimmed(path, "minor", "/metadata/format/version")
-                        + errorFoundNotTrimmed(path, "code", "/metadata/format")
-                        + errorFoundNotTrimmed(path, "instance_code",
-                                "/metadata/experiment_identifier")
-                        + errorFoundNotTrimmed(path, "group_code",
-                                "/metadata/experiment_identifier")
-                        + errorFoundNotTrimmed(path, "project_code",
-                                "/metadata/experiment_identifier")
-                        + errorFoundNotTrimmed(path, "experiment_code",
-                                "/metadata/experiment_identifier")
-                        + errorFoundNotTrimmed(path, "experiment_registration_timestamp",
-                                "/metadata")
-                        + errorFoundNotTrimmed(path, "first_name",
-                                "/metadata/experiment_registrator")
-                        + errorFoundNotTrimmed(path, "last_name",
-                                "/metadata/experiment_registrator")
-                        + errorFoundNotTrimmed(path, "email", "/metadata/experiment_registrator")
-                        + errorFoundNotTrimmed(path, "group_code", "/metadata/sample")
-                        + errorFoundNotTrimmed(path, "instance_code", "/metadata/sample")
-                        + errorFoundNotTrimmed(path, "instance_uuid", "/metadata/sample")
-                        + errorFoundNotTrimmed(path, "type_description", "/metadata/sample")
-                        + errorFoundNotTrimmed(path, "type_code", "/metadata/sample")
-                        + errorFoundNotTrimmed(path, "code", "/metadata/sample"));
+        assertEquals(errorFoundNotTrimmed(path, "major", "/version")
+                + errorFoundNotTrimmed(path, "minor", "/version")
+                + errorFoundNotTrimmed(path, "code", "/metadata/data_set")
+                + errorFoundNotTrimmed(path, "production_timestamp", "/metadata/data_set")
+                + errorFoundNotTrimmed(path, "producer_code", "/metadata/data_set")
+                + errorFoundNotTrimmed(path, "observable_type", "/metadata/data_set")
+                + errorFoundNotTrimmed(path, "is_measured", "/metadata/data_set")
+                + errorFoundNotTrimmed(path, "is_complete", "/metadata/data_set")
+                + errorFoundNotTrimmed(path, "major", "/metadata/format/version")
+                + errorFoundNotTrimmed(path, "minor", "/metadata/format/version")
+                + errorFoundNotTrimmed(path, "code", "/metadata/format")
+                + errorFoundNotTrimmed(path, "instance_code", "/metadata/experiment_identifier")
+                + errorFoundNotTrimmed(path, "instance_uuid", "/metadata/experiment_identifier")
+                + errorFoundNotTrimmed(path, "group_code", "/metadata/experiment_identifier")
+                + errorFoundNotTrimmed(path, "project_code", "/metadata/experiment_identifier")
+                + errorFoundNotTrimmed(path, "experiment_code", "/metadata/experiment_identifier")
+                + errorFoundNotTrimmed(path, "experiment_registration_timestamp", "/metadata")
+                + errorFoundNotTrimmed(path, "first_name", "/metadata/experiment_registrator")
+                + errorFoundNotTrimmed(path, "last_name", "/metadata/experiment_registrator")
+                + errorFoundNotTrimmed(path, "email", "/metadata/experiment_registrator")
+                + errorFoundNotTrimmed(path, "group_code", "/metadata/sample")
+                + errorFoundNotTrimmed(path, "instance_code", "/metadata/sample")
+                + errorFoundNotTrimmed(path, "instance_uuid", "/metadata/sample")
+                + errorFoundNotTrimmed(path, "type_description", "/metadata/sample")
+                + errorFoundNotTrimmed(path, "type_code", "/metadata/sample")
+                + errorFoundNotTrimmed(path, "code", "/metadata/sample"), new StructureChecker(
+                verbose).getStructureConsistencyReport(dir).toString());
     }
 }
diff --git a/bds/testdata/bds_empty_files/metadata/experiment_identifier/instance_uuid b/bds/testdata/bds_empty_files/metadata/experiment_identifier/instance_uuid
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/bds/testdata/bds_new_lines/metadata/experiment_identifier/instance_uuid b/bds/testdata/bds_new_lines/metadata/experiment_identifier/instance_uuid
new file mode 100644
index 0000000000000000000000000000000000000000..8d3164211f85087e9c63112efd0edf098a9b30c9
--- /dev/null
+++ b/bds/testdata/bds_new_lines/metadata/experiment_identifier/instance_uuid
@@ -0,0 +1,2 @@
+
+550E8400-E29B-41E4-A716-446655440000
diff --git a/bds/testdata/bds_new_lines/metadata/sample/instance_uuid b/bds/testdata/bds_new_lines/metadata/sample/instance_uuid
index df2eecf1f87a6e653d9687a0c6248ef1341e57a4..8d3164211f85087e9c63112efd0edf098a9b30c9 100644
--- a/bds/testdata/bds_new_lines/metadata/sample/instance_uuid
+++ b/bds/testdata/bds_new_lines/metadata/sample/instance_uuid
@@ -1,2 +1,2 @@
 
-3VCP1
+550E8400-E29B-41E4-A716-446655440000
diff --git a/bds/testdata/bds_ok/metadata/experiment_identifier/instance_uuid b/bds/testdata/bds_ok/metadata/experiment_identifier/instance_uuid
new file mode 100644
index 0000000000000000000000000000000000000000..f4b5f296ddffcccbdbc8d2b1aeca929e174a38d6
--- /dev/null
+++ b/bds/testdata/bds_ok/metadata/experiment_identifier/instance_uuid
@@ -0,0 +1 @@
+550E8400-E29B-41E4-A716-446655440000
\ No newline at end of file
diff --git a/bds/testdata/bds_ok/metadata/sample/instance_uuid b/bds/testdata/bds_ok/metadata/sample/instance_uuid
index d04cb00f615f617e91c77f5faa20858c4f7183e5..f4b5f296ddffcccbdbc8d2b1aeca929e174a38d6 100644
--- a/bds/testdata/bds_ok/metadata/sample/instance_uuid
+++ b/bds/testdata/bds_ok/metadata/sample/instance_uuid
@@ -1 +1 @@
-3VCP1
\ No newline at end of file
+550E8400-E29B-41E4-A716-446655440000
\ No newline at end of file
diff --git a/integration-tests/run.sh b/integration-tests/run.sh
index f8126a218a7cfae640ab0145e1f391d423c0cc7f..69b072637770575710547214135f1c43eb44ff22 100755
--- a/integration-tests/run.sh
+++ b/integration-tests/run.sh
@@ -663,6 +663,7 @@ function assert_correct_content_of_plate_3VCP1_in_store {
     assert_equals_as_in_file CISD $metadata_dir/experiment_identifier/group_code
     assert_equals_as_in_file NEMO $metadata_dir/experiment_identifier/project_code
     assert_equals_as_in_file EXP1 $metadata_dir/experiment_identifier/experiment_code
+    assert_file_exists $metadata_dir/experiment_identifier/instance_uuid
     # Experiment registration
     assert_file_exists $metadata_dir/experiment_registration_timestamp
     assert_file_exists $metadata_dir/experiment_registrator/email