diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
index 1bee35cdcb0c545f1933cefd64197e0582af6f6b..c5a05cbfc77015b23ab6a1bdd30766a9083020e2 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.api.v1;
 
+import java.util.Arrays;
 import java.util.Date;
 import java.util.EnumSet;
 import java.util.HashMap;
@@ -25,8 +26,10 @@ import org.testng.AssertJUnit;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Attachment;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.experiment.ExperimentPermIdId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -38,6 +41,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuil
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.LinkDataSetBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleTypeBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 
 /**
  * @author Franz-Josef Elmer
@@ -236,6 +242,85 @@ public class TranslatorTest extends AssertJUnit
         assertEquals(edms, translated.getExternalDataManagementSystem());
     }
 
+    @Test
+    public void testTranslateAttachmentsWithAllVersions()
+    {
+        AttachmentPE a1 = attachment("test.txt", 1);
+        AttachmentPE a2 = attachment("test.txt", 2);
+        ExperimentPE attachmentHolder = new ExperimentPE();
+        attachmentHolder.setId(1234L);
+
+        List<Attachment> attachments =
+                Translator.translateAttachments("st-1", new ExperimentPermIdId("perm1"),
+                        attachmentHolder, Arrays.asList(a1, a2), true);
+
+        assertEquals("[Attachment [fileName=test.txt, version=2, title=Title, "
+                + "description=File:test.txt, version:2, "
+                + "registrationDate=Thu Jan 01 01:00:04 CET 1970, "
+                + "userFirstName=Albert, userLastName=Einstein, "
+                + "userEmail=ae@ae.ch, userId=ae, "
+                + "downloadLink=/openbis/attachment-download?sessionID=st-1&"
+                + "attachmentHolder=EXPERIMENT&id=1234&fileName=test.txt&version=2], "
+                + "Attachment [fileName=test.txt, version=1, title=Title, "
+                + "description=File:test.txt, version:1, "
+                + "registrationDate=Thu Jan 01 01:00:04 CET 1970, "
+                + "userFirstName=Albert, userLastName=Einstein, userEmail=ae@ae.ch, userId=ae, "
+                + "downloadLink=/openbis/attachment-download?sessionID=st-1&"
+                + "attachmentHolder=EXPERIMENT&id=1234&fileName=test.txt&version=1]]",
+                attachments.toString());
+        assertEquals(2, attachments.size());
+    }
+
+    @Test
+    public void testTranslateAttachmentsWithLatestVersions()
+    {
+        AttachmentPE a1 = attachment("test.txt", 1);
+        AttachmentPE a2 = attachment("greetings.txt", 1);
+        AttachmentPE a3 = attachment("greetings.txt", 2);
+        AttachmentPE a4 = attachment("test.txt", 2);
+        AttachmentPE a5 = attachment("test.txt", 3);
+        ExperimentPE attachmentHolder = new ExperimentPE();
+        attachmentHolder.setId(1234L);
+
+        List<Attachment> attachments =
+                Translator.translateAttachments("st-1", new ExperimentPermIdId("perm1"),
+                        attachmentHolder, Arrays.asList(a1, a2, a3, a4, a5), false);
+
+        assertEquals("[Attachment [fileName=greetings.txt, version=2, title=Title, "
+                + "description=File:greetings.txt, version:2, "
+                + "registrationDate=Thu Jan 01 01:00:04 CET 1970, "
+                + "userFirstName=Albert, userLastName=Einstein, "
+                + "userEmail=ae@ae.ch, userId=ae, "
+                + "downloadLink=/openbis/attachment-download?sessionID=st-1&"
+                + "attachmentHolder=EXPERIMENT&id=1234&fileName=greetings.txt&version=2], "
+                + "Attachment [fileName=test.txt, version=3, title=Title, "
+                + "description=File:test.txt, version:3, "
+                + "registrationDate=Thu Jan 01 01:00:04 CET 1970, "
+                + "userFirstName=Albert, userLastName=Einstein, userEmail=ae@ae.ch, userId=ae, "
+                + "downloadLink=/openbis/attachment-download?sessionID=st-1&"
+                + "attachmentHolder=EXPERIMENT&id=1234&fileName=test.txt&version=3]]",
+                attachments.toString());
+        assertEquals(2, attachments.size());
+
+    }
+
+    private AttachmentPE attachment(String fileName, int version)
+    {
+        AttachmentPE attachment = new AttachmentPE();
+        attachment.setFileName(fileName);
+        attachment.setVersion(version);
+        attachment.setTitle("Title");
+        attachment.setDescription("File:" + fileName + ", version:" + version);
+        PersonPE registrator = new PersonPE();
+        registrator.setUserId("ae");
+        registrator.setFirstName("Albert");
+        registrator.setLastName("Einstein");
+        registrator.setEmail("ae@ae.ch");
+        attachment.setRegistrator(registrator);
+        attachment.setRegistrationDate(new Date(4711));
+        return attachment;
+    }
+
     private void assertBasicAttributes(
             ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData originalDataSet,
             DataSet translatedDataSet)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
index c46048cf353c0f0d07c6bf69c33d9036a2ce2d65..fb05bb00546f66abe46937e0c84a961417d0a12f 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
@@ -22,10 +22,13 @@ import static org.testng.AssertJUnit.assertTrue;
 import static org.testng.AssertJUnit.fail;
 
 import java.net.MalformedURLException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
@@ -36,9 +39,11 @@ import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.string.ToStringComparator;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationChangingService;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Attachment;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
@@ -54,7 +59,15 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchCl
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SpaceWithProjectsAndRoleAssignments;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Vocabulary;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.experiment.ExperimentIdentifierId;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.experiment.ExperimentPermIdId;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.experiment.ExperimentTechIdId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.metaproject.MetaprojectIdentifierId;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.project.ProjectIdentifierId;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.project.ProjectPermIdId;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.sample.SampleIdentifierId;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.sample.SamplePermIdId;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.sample.SampleTechIdId;
 import ch.systemsx.cisd.openbis.remoteapitest.RemoteApiTestCase;
 
 /**
@@ -783,171 +796,173 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase
         return null;
     }
 
-    // @Test
-    // public void testListAttachmentsForExperimentAllVersions()
-    // {
-    // final List<Experiment> experiments =
-    // generalInformationService.listExperiments(sessionToken,
-    // Collections.singletonList("/CISD/NEMO/EXP1"));
-    // assertEquals(1, experiments.size());
-    //
-    // final List<Attachment> attachments =
-    // generalInformationService.listAttachmentsForExperiment(sessionToken,
-    // ExperimentIdentifier.createFromEntity(experiments.get(0)),
-    // true);
-    // assertEquals(4, attachments.size());
-    // int version = 4;
-    // for (Attachment a : attachments)
-    // {
-    // assertEquals("exampleExperiments.txt", a.getFileName());
-    // assertEquals(version, a.getVersion());
-    // assertEquals("", a.getTitle());
-    // assertEquals("", a.getDescription());
-    // assertTrue(a.getRegistrationDate().getTime() > 0);
-    // assertEquals("test", a.getUserId());
-    // assertEquals("franz-josef.elmer@systemsx.ch", a.getUserEmail());
-    // assertNotNull(a.getUserFirstName());
-    // assertNotNull(a.getUserLastName());
-    // assertEquals(
-    // String.format(
-    // "http://localhost/openbis/index.html?viewMode=SIMPLE#action=DOWNLOAD_ATTACHMENT&file=exampleExperiments.txt&version=%d&entity=EXPERIMENT&permId=200811050951882-1028",
-    // version),
-    // a.getPermLink());
-    // --version;
-    // }
-    // }
-    //
-    // @Test
-    // public void testListAttachmentsForExperimentLatestVersion()
-    // {
-    // final List<Experiment> experiments =
-    // generalInformationService.listExperiments(sessionToken,
-    // Collections.singletonList("/CISD/NEMO/EXP1"));
-    // assertEquals(1, experiments.size());
-    //
-    // final List<Attachment> attachments =
-    // generalInformationService.listAttachmentsForExperiment(sessionToken,
-    // ExperimentIdentifier.createFromEntity(experiments.get(0)), false);
-    // assertEquals(1, attachments.size());
-    // final Attachment a = attachments.get(0);
-    // assertEquals("exampleExperiments.txt", a.getFileName());
-    // assertEquals(4, a.getVersion());
-    // assertEquals("", a.getTitle());
-    // assertEquals("", a.getDescription());
-    // assertTrue(a.getRegistrationDate().getTime() > 0);
-    // assertEquals("test", a.getUserId());
-    // assertEquals("franz-josef.elmer@systemsx.ch", a.getUserEmail());
-    // assertNotNull(a.getUserFirstName());
-    // assertNotNull(a.getUserLastName());
-    // assertEquals(
-    // "http://localhost/openbis/index.html?viewMode=SIMPLE#action=DOWNLOAD_ATTACHMENT&file=exampleExperiments.txt&version=4&entity=EXPERIMENT&permId=200811050951882-1028",
-    // a.getPermLink());
-    //
-    // final List<Attachment> attachments2 =
-    // generalInformationService.listAttachmentsForExperiment(sessionToken,
-    // ExperimentIdentifier.createFromAugmentedCode("/CISD/NEMO/EXP1"), false);
-    //
-    // assertEquals(1, attachments2.size());
-    //
-    // final Attachment a2 = attachments2.get(0);
-    // assertEquals(a, a2);
-    // }
-    //
-    // @Test
-    // public void testListAttachmentsForSample()
-    // {
-    // SearchCriteria searchCriteria = new SearchCriteria();
-    // searchCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
-    // "3VCP6"));
-    //
-    // final List<Sample> samples =
-    // generalInformationService.searchForSamples(sessionToken, searchCriteria);
-    // assertEquals(1, samples.size());
-    //
-    // final List<Attachment> attachments =
-    // generalInformationService.listAttachmentsForSample(sessionToken,
-    // SampleIdentifier.createFromEntity(samples.get(0)),
-    // true);
-    // assertEquals(1, attachments.size());
-    //
-    // final Attachment a = attachments.get(0);
-    // assertEquals("sampleHistory.txt", a.getFileName());
-    // assertEquals("", a.getTitle());
-    // assertEquals("", a.getDescription());
-    // assertEquals(1, a.getVersion());
-    // assertTrue(a.getRegistrationDate().getTime() > 0);
-    // assertEquals("test", a.getUserId());
-    // assertEquals("franz-josef.elmer@systemsx.ch", a.getUserEmail());
-    // assertNotNull(a.getUserFirstName());
-    // assertNotNull(a.getUserLastName());
-    // assertEquals(
-    // "http://localhost/openbis/index.html?viewMode=SIMPLE#action=DOWNLOAD_ATTACHMENT&file=sampleHistory.txt&version=1&entity=SAMPLE&permId=200811050946559-980",
-    // a.getPermLink());
-    //
-    // final List<Attachment> attachments2 =
-    // generalInformationService.listAttachmentsForSample(sessionToken,
-    // SampleIdentifier.createFromPermId("200811050946559-980"), true);
-    //
-    // assertEquals(1, attachments2.size());
-    //
-    // final Attachment a2 = attachments2.get(0);
-    // assertEquals(a, a2);
-    //
-    // final List<Attachment> attachments3 =
-    // generalInformationService.listAttachmentsForSample(sessionToken,
-    // SampleIdentifier.createFromAugmentedCode("/CISD/3VCP6"), true);
-    //
-    // assertEquals(1, attachments3.size());
-    //
-    // final Attachment a3 = attachments3.get(0);
-    // assertEquals(a, a3);
-    // }
-    //
-    // @Test
-    // public void testListAttachmentsForProjectNoAttachment()
-    // {
-    // final List<Attachment> attachments =
-    // generalInformationService.listAttachmentsForProject(sessionToken,
-    // ProjectIdentifier.createFromAugmentedCode("/CISD/DEFAULT"), true);
-    //
-    // assertEquals(0, attachments.size());
-    // }
-    //
-    // @Test
-    // public void testListAttachmentsForProjectNonExisting()
-    // {
-    // final List<Attachment> attachments =
-    // generalInformationService.listAttachmentsForProject(sessionToken,
-    // ProjectIdentifier.createFromAugmentedCode("/NONE/EXISTENT"), true);
-    //
-    // assertEquals(0, attachments.size());
-    // }
-    //
-    // @Test
-    // public void testListAttachmentsForProjects() throws ParseException
-    // {
-    // final List<Attachment> attachments =
-    // generalInformationService.listAttachmentsForProject(sessionToken,
-    // ProjectIdentifier.createFromPermId("20120814110011738-103"), true);
-    //
-    // assertEquals(1, attachments.size());
-    //
-    // final Attachment a = attachments.get(0);
-    // assertEquals("projectDescription.txt", a.getFileName());
-    // assertEquals("The Project", a.getTitle());
-    // assertEquals("All about it.", a.getDescription());
-    // assertEquals(1, a.getVersion());
-    // final Date date =
-    // new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z")
-    // .parse("2012-01-03 08:27:57.123 +0100");
-    // assertEquals(date, a.getRegistrationDate());
-    // assertEquals("test", a.getUserId());
-    // assertEquals("franz-josef.elmer@systemsx.ch", a.getUserEmail());
-    // assertNotNull(a.getUserFirstName());
-    // assertNotNull(a.getUserLastName());
-    // assertEquals(
-    // "http://localhost/openbis/index.html?viewMode=SIMPLE#action=DOWNLOAD_ATTACHMENT&file=projectDescription.txt&version=1&entity=PROJECT&code=NEMO&space=CISD",
-    // a.getPermLink());
-    // }
+    @Test
+    public void testListAttachmentsForExperimentAllVersions()
+    {
+        final List<Experiment> experiments =
+                generalInformationService.listExperiments(sessionToken,
+                        Collections.singletonList("/CISD/NEMO/EXP1"));
+        assertEquals(1, experiments.size());
+
+        final List<Attachment> attachments =
+                generalInformationService.listAttachmentsForExperiment(sessionToken,
+                        new ExperimentTechIdId(experiments.get(0).getId()), true);
+        assertEquals(4, attachments.size());
+        int version = 4;
+        for (Attachment a : attachments)
+        {
+            assertEquals("exampleExperiments.txt", a.getFileName());
+            assertEquals(version, a.getVersion());
+            assertEquals("", a.getTitle());
+            assertEquals("", a.getDescription());
+            assertTrue(a.getRegistrationDetails().getRegistrationDate().getTime() > 0);
+            assertEquals("test", a.getRegistrationDetails().getUserId());
+            assertEquals("franz-josef.elmer@systemsx.ch", a.getRegistrationDetails().getUserEmail());
+            assertNotNull(a.getRegistrationDetails().getUserFirstName());
+            assertNotNull(a.getRegistrationDetails().getUserLastName());
+            assertEquals("/openbis/attachment-download?sessionID=" + sessionToken
+                    + "&attachmentHolder=EXPERIMENT&id=2&fileName=exampleExperiments.txt&version="
+                    + version, a.getDownloadLink());
+            --version;
+        }
+    }
+
+    @Test
+    public void testListAttachmentsForExperimentLatestVersion() throws ParseException
+    {
+        final List<Experiment> experiments =
+                generalInformationService.listExperiments(sessionToken,
+                        Collections.singletonList("/CISD/NEMO/EXP1"));
+        assertEquals(1, experiments.size());
+
+        final List<Attachment> attachments =
+                generalInformationService.listAttachmentsForExperiment(sessionToken,
+                        new ExperimentPermIdId(experiments.get(0).getPermId()), false);
+        assertEquals(1, attachments.size());
+        final Attachment a = attachments.get(0);
+        assertEquals("exampleExperiments.txt", a.getFileName());
+        assertEquals(4, a.getVersion());
+        assertEquals("", a.getTitle());
+        assertEquals("", a.getDescription());
+        final Date date =
+                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z")
+                        .parse("2008-12-10 13:49:27.901 +0100");
+        assertEquals(date, a.getRegistrationDetails().getRegistrationDate());
+        assertEquals("test", a.getRegistrationDetails().getUserId());
+        assertEquals("franz-josef.elmer@systemsx.ch", a.getRegistrationDetails().getUserEmail());
+        assertNotNull(a.getRegistrationDetails().getUserFirstName());
+        assertNotNull(a.getRegistrationDetails().getUserLastName());
+        assertEquals("/openbis/attachment-download?sessionID=" + sessionToken
+                + "&attachmentHolder=EXPERIMENT&id=2&fileName=exampleExperiments.txt&version=4",
+                a.getDownloadLink());
+
+        final List<Attachment> attachments2 =
+                generalInformationService.listAttachmentsForExperiment(sessionToken,
+                        new ExperimentIdentifierId("/CISD/NEMO/EXP1"), false);
+
+        assertEquals(1, attachments2.size());
+
+        final Attachment a2 = attachments2.get(0);
+        assertEquals(a, a2);
+    }
+
+    @Test
+    public void testListAttachmentsForSample()
+    {
+        SearchCriteria searchCriteria = new SearchCriteria();
+        searchCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
+                "3VCP6"));
+
+        final List<Sample> samples =
+                generalInformationService.searchForSamples(sessionToken, searchCriteria);
+        assertEquals(1, samples.size());
+
+        final List<Attachment> attachments =
+                generalInformationService.listAttachmentsForSample(sessionToken,
+                        new SampleTechIdId(samples.get(0).getId()), true);
+        assertEquals(1, attachments.size());
+
+        final Attachment a = attachments.get(0);
+        assertEquals("sampleHistory.txt", a.getFileName());
+        assertEquals("", a.getTitle());
+        assertEquals("", a.getDescription());
+        assertEquals(1, a.getVersion());
+        assertTrue(a.getRegistrationDetails().getRegistrationDate().getTime() > 0);
+        assertEquals("test", a.getRegistrationDetails().getUserId());
+        assertEquals("franz-josef.elmer@systemsx.ch", a.getRegistrationDetails().getUserEmail());
+        assertNotNull(a.getRegistrationDetails().getUserFirstName());
+        assertNotNull(a.getRegistrationDetails().getUserLastName());
+        assertEquals("/openbis/attachment-download?sessionID=" + sessionToken
+                + "&attachmentHolder=SAMPLE&id=987&fileName=sampleHistory.txt&version=1",
+                a.getDownloadLink());
+
+        final List<Attachment> attachments2 =
+                generalInformationService.listAttachmentsForSample(sessionToken,
+                        new SamplePermIdId("200811050946559-980"), true);
+
+        assertEquals(1, attachments2.size());
+
+        final Attachment a2 = attachments2.get(0);
+        assertEquals(a, a2);
+
+        final List<Attachment> attachments3 =
+                generalInformationService.listAttachmentsForSample(sessionToken,
+                        new SampleIdentifierId("/CISD/3VCP6"), true);
+
+        assertEquals(1, attachments3.size());
+
+        final Attachment a3 = attachments3.get(0);
+        assertEquals(a, a3);
+    }
+
+    @Test
+    public void testListAttachmentsForProjectNoAttachment()
+    {
+        final List<Attachment> attachments =
+                generalInformationService.listAttachmentsForProject(sessionToken,
+                        new ProjectIdentifierId("/CISD/DEFAULT"), true);
+
+        assertEquals(0, attachments.size());
+    }
+
+    @Test
+    public void testListAttachmentsForProjectNonExisting()
+    {
+        try
+        {
+            generalInformationService.listAttachmentsForProject(sessionToken,
+                    new ProjectIdentifierId("/NONE/EXISTENT"), true);
+        } catch (UserFailureException ex)
+        {
+            assertEquals("No project found for id '/NONE/EXISTENT'.", ex.getMessage());
+        }
+    }
+
+    @Test
+    public void testListAttachmentsForProjects() throws ParseException
+    {
+        final List<Attachment> attachments =
+                generalInformationService.listAttachmentsForProject(sessionToken,
+                        new ProjectPermIdId("20120814110011738-103"), true);
+
+        assertEquals(1, attachments.size());
+
+        final Attachment a = attachments.get(0);
+        assertEquals("projectDescription.txt", a.getFileName());
+        assertEquals("The Project", a.getTitle());
+        assertEquals("All about it.", a.getDescription());
+        assertEquals(1, a.getVersion());
+        final Date date =
+                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z")
+                        .parse("2012-01-03 08:27:57.123 +0100");
+        assertEquals(date, a.getRegistrationDetails().getRegistrationDate());
+        assertEquals("test", a.getRegistrationDetails().getUserId());
+        assertEquals("franz-josef.elmer@systemsx.ch", a.getRegistrationDetails().getUserEmail());
+        assertNotNull(a.getRegistrationDetails().getUserFirstName());
+        assertNotNull(a.getRegistrationDetails().getUserLastName());
+        assertEquals("/openbis/attachment-download?sessionID=" + sessionToken
+                + "&attachmentHolder=PROJECT&id=3&fileName=projectDescription.txt&version=1",
+                a.getDownloadLink());
+    }
 
 }