diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAOTest.java
index 8354703c459725b35cd3829f372f0e8ad20a51cf..6b4f027fa2f68d9974a6a4dbd85febe4defd78ee 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAOTest.java
@@ -16,15 +16,40 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 
-import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertNotNull;
+import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.AssertJUnit.fail;
+
+import java.util.List;
 
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.common.types.BooleanOrUnknown;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataSetTypeDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExternalDataDAO;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IFileFormatTypeDAO;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.ILocatorTypeDAO;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.FileFormatTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.HierarchyType;
+import ch.systemsx.cisd.openbis.generic.shared.dto.LocatorTypePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SourceType;
+import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat;
+import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyTermPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.types.DataSetTypeCode;
 
 /**
  * Test cases for corresponding {@link ExternalDataDAO} class.
- * 
+ *
  * @author Christian Ribeaud
  */
 @Test(groups =
@@ -32,21 +57,155 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExternalDataDAO;
 public final class ExternalDataDAOTest extends AbstractDAOTest
 {
 
+    @Test
+    public final void testCreateDataSetCode()
+    {
+        IExternalDataDAO externalDataDAO = daoFactory.getExternalDataDAO();
+        String code = externalDataDAO.createDataSetCode();
+        String[] tokens = code.split("-");
+        assertEquals(2, tokens.length);
+        int id = Integer.parseInt(tokens[1]) + 1;
+
+        code = externalDataDAO.createDataSetCode();
+        assertTrue("Expected id " + id + " at the end of code " + code, code.endsWith("-" + id));
+    }
+
     @Test
     public final void testListExternalData()
     {
-        // TODO 2008-10-28, Christian Ribeaud: Complete this test once we have added the possibility
-        // to create external data in the database.
+        testCreateDataSet();
         final IExternalDataDAO externalDataDAO = daoFactory.getExternalDataDAO();
-        boolean fail = true;
-        try
-        {
-            externalDataDAO.listExternalData(null, null);
-        } catch (final AssertionError e)
+        List<ExternalDataPE> list = externalDataDAO.listExternalData(pickASample(), SourceType.MEASUREMENT);
+
+        assertEquals(1, list.size());
+        ExternalDataPE dataSet = list.get(0);
+        assertEquals("abcd", dataSet.getLocation());
+        assertEquals(BooleanOrUnknown.U, dataSet.getComplete());
+    }
+
+    @Test
+    public void testCreateDataSet()
+    {
+        IExternalDataDAO externalDataDAO = daoFactory.getExternalDataDAO();
+        ExternalDataPE externalData = new ExternalDataPE();
+        String dataSetCode = daoFactory.getExternalDataDAO().createDataSetCode();
+        externalData.setCode(dataSetCode);
+        externalData.setDataSetType(getDataSetType(DataSetTypeCode.UNKNOWN));
+        externalData.setProcedure(pickAProcedure());
+        externalData.setSampleAcquiredFrom(pickASample());
+        externalData.setFileFormatType(pickAFileFormatType());
+        externalData.setLocatorType(pickALocatorType());
+        externalData.setLocation("abcd");
+        externalData.setComplete(BooleanOrUnknown.U);
+        externalData.setStorageFormatVocabularyTerm(pickAStorageFormatVocabularyTerm());
+        externalData.setPlaceholder(true);
+        daoFactory.getExternalDataDAO().createDataSet(externalData);
+
+        ExternalDataPE dataSet = (ExternalDataPE) externalDataDAO.tryToFindDataSetByCode(dataSetCode);
+        assertEquals(externalData.getCode(), dataSet.getCode());
+        assertEquals(externalData.getDataSetType(), dataSet.getDataSetType());
+        assertEquals(externalData.getProcedure(), dataSet.getProcedure());
+        assertEquals(externalData.getFileFormatType(), dataSet.getFileFormatType());
+        assertEquals(externalData.getLocatorType(), dataSet.getLocatorType());
+        assertEquals(externalData.getLocation(), dataSet.getLocation());
+        assertEquals(externalData.getComplete(), dataSet.getComplete());
+        assertEquals(externalData.getStorageFormat(), dataSet.getStorageFormat());
+        assertEquals(externalData.isPlaceholder(), dataSet.isPlaceholder());
+    }
+
+    @Test
+    public void testUpdateDataSet()
+    {
+        IExternalDataDAO externalDataDAO = daoFactory.getExternalDataDAO();
+        DataPE data = new DataPE();
+        String dataSetCode = externalDataDAO.createDataSetCode();
+        data.setCode(dataSetCode);
+        data.setDataSetType(getDataSetType(DataSetTypeCode.UNKNOWN));
+        data.setProcedure(pickAProcedure());
+        data.setSampleDerivedFrom(pickASample());
+        data.setPlaceholder(true);
+        externalDataDAO.createDataSet(data);
+
+        ExternalDataPE externalData = new ExternalDataPE();
+        externalData.setId(externalDataDAO.tryToFindDataSetByCode(dataSetCode).getId());
+        externalData.setCode(dataSetCode);
+        externalData.setDataSetType(getDataSetType(DataSetTypeCode.HCS_IMAGE));
+        externalData.setProcedure(pickAProcedure());
+        externalData.setSampleAcquiredFrom(pickASample());
+        externalData.setFileFormatType(pickAFileFormatType());
+        externalData.setLocatorType(pickALocatorType());
+        externalData.setLocation("abcd");
+        externalData.setComplete(BooleanOrUnknown.U);
+        externalData.setStorageFormatVocabularyTerm(pickAStorageFormatVocabularyTerm());
+        externalData.setPlaceholder(true);
+        externalDataDAO.updateDataSet(externalData);
+
+        ExternalDataPE dataSet = (ExternalDataPE) externalDataDAO.tryToFindDataSetByCode(dataSetCode);
+        assertEquals(externalData.getCode(), dataSet.getCode());
+        assertEquals(externalData.getDataSetType(), dataSet.getDataSetType());
+        assertEquals(externalData.getProcedure(), dataSet.getProcedure());
+        assertEquals(externalData.getFileFormatType(), dataSet.getFileFormatType());
+        assertEquals(externalData.getLocatorType(), dataSet.getLocatorType());
+        assertEquals(externalData.getLocation(), dataSet.getLocation());
+        assertEquals(externalData.getComplete(), dataSet.getComplete());
+        assertEquals(externalData.getStorageFormat(), dataSet.getStorageFormat());
+        assertEquals(externalData.isPlaceholder(), dataSet.isPlaceholder());
+    }
+
+    protected VocabularyTermPE pickAStorageFormatVocabularyTerm()
+    {
+        String code = StorageFormat.VOCABULARY_CODE;
+        VocabularyPE vocabulary = daoFactory.getVocabularyDAO().tryFindVocabularyByCode(code);
+        assertNotNull(vocabulary);
+        return vocabulary.getTerms().iterator().next();
+    }
+
+    protected FileFormatTypePE pickAFileFormatType()
+    {
+        IFileFormatTypeDAO fileFormatTypeDAO = daoFactory.getFileFormatTypeDAO();
+        FileFormatTypePE fileFormatType = fileFormatTypeDAO.tryToFindFileFormatTypeByCode("TIFF");
+        assertNotNull(fileFormatType);
+        return fileFormatType;
+    }
+
+    protected LocatorTypePE pickALocatorType()
+    {
+        ILocatorTypeDAO locatorTypeDAO = daoFactory.getLocatorTypeDAO();
+        LocatorTypePE locatorType = locatorTypeDAO.tryToFindLocatorTypeByCode("RELATIVE_LOCATION");
+        assertNotNull(locatorType);
+        return locatorType;
+    }
+
+    protected SamplePE pickASample()
+    {
+        ISampleDAO sampleDAO = daoFactory.getSampleDAO();
+        DatabaseInstancePE dbInstance = daoFactory.getHomeDatabaseInstance();
+        SamplePE sample = sampleDAO.tryFindByCodeAndDatabaseInstance("MP", dbInstance, HierarchyType.CHILD);
+        assertNotNull(sample);
+        return sample;
+    }
+
+    protected DataSetTypePE getDataSetType(DataSetTypeCode type)
+    {
+        IDataSetTypeDAO dataSetTypeDAO = daoFactory.getDataSetTypeDAO();
+        String code = type.getCode();
+        DataSetTypePE dataSetType = dataSetTypeDAO.tryToFindDataSetTypeByCode(code);
+        assertNotNull(dataSetType);
+        return dataSetType;
+    }
+
+    protected ProcedurePE pickAProcedure()
+    {
+        List<ExperimentPE> experiments = daoFactory.getExperimentDAO().listExperiments();
+        for (ExperimentPE experimentPE : experiments)
         {
-            fail = false;
+            List<ProcedurePE> procedures = experimentPE.getProcedures();
+            if (procedures.isEmpty() == false)
+            {
+                return procedures.get(0);
+            }
         }
-        assertFalse(fail);
-
+        fail("No experiment with a procedure found.");
+        return null; // to make the compiler happy
     }
 }