diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java
index 57cf8f448efbdd5d52250096e6bdae573ebdb063..2c2b0134845b3cf8fc63a66cf692ebc8794b95d9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/AttachmentPE.java
@@ -30,6 +30,7 @@ import javax.persistence.ManyToOne;
 import javax.persistence.OneToOne;
 import javax.persistence.SequenceGenerator;
 import javax.persistence.Table;
+import javax.persistence.Transient;
 import javax.persistence.UniqueConstraint;
 
 import org.apache.commons.lang.builder.EqualsBuilder;
@@ -113,19 +114,30 @@ public class AttachmentPE extends HibernateAbstractRegistrationHolder implements
         this.id = id;
     }
 
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    @ManyToOne(fetch = FetchType.LAZY)
     @NotNull(message = ValidationMessages.EXPERIMENT_NOT_NULL_MESSAGE)
     @JoinColumn(name = ColumnNames.EXPERIMENT_COLUMN, updatable = false)
-    public ExperimentPE getParent()
+    private ExperimentPE getParentInternal()
     {
         return parent;
     }
 
-    public void setParent(final ExperimentPE parent)
+    void setParentInternal(final ExperimentPE parent)
     {
         this.parent = parent;
     }
 
+    @Transient
+    public ExperimentPE getParent()
+    {
+        return getParentInternal();
+    }
+
+    public void setParent(final ExperimentPE parent)
+    {
+        parent.addAttachment(this);
+    }
+
     @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
     @NotNull(message = ValidationMessages.ATTACHMENT_CONTENT_NOT_NULL_MESSAGE)
     @JoinColumn(name = ColumnNames.EXPERIMENT_ATTACHMENT_CONTENT_COLUMN, updatable = false)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
index 8c8c894c0547967e354049a9e88eaf09fec49042..195750604fe2e62b5ba00bb50beed9b7a8566a79 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java
@@ -65,6 +65,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.util.EqualsHashUtils;
+import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
  * Persistence Entity representing experiment.
@@ -281,15 +282,18 @@ public class ExperimentPE implements IEntityPropertiesHolder<ExperimentPropertyP
         getExperimentProperties().add(property);
     }
 
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "parent")
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "parentInternal")
     @IndexedEmbedded
     @Private
+    // for Hibernate and bean conversion only
     public Set<AttachmentPE> getExperimentAttachments()
     {
         return attachments;
     }
 
+    @SuppressWarnings("unused")
     @Private
+    // for Hibernate and bean conversion only
     public void setExperimentAttachments(final Set<AttachmentPE> attachments)
     {
         this.attachments = attachments;
@@ -315,11 +319,29 @@ public class ExperimentPE implements IEntityPropertiesHolder<ExperimentPropertyP
     // Package visibility to avoid bean conversion which will call an uninitialized field.
     final void setAttachments(final Set<AttachmentPE> attachments)
     {
-        for (final AttachmentPE experimentAttachment : attachments)
+        getExperimentAttachments().clear();
+        for (final AttachmentPE attachment : attachments)
+        {
+            addAttachment(attachment);
+        }
+    }
+
+    public void addAttachment(final AttachmentPE child)
+    {
+        final ExperimentPE parent = child.getParent();
+        if (parent != null)
+        {
+            parent.getExperimentAttachments().remove(child);
+        }
+        child.setParentInternal(this);
+        // ensure that the collection is of the proper type - bean populator could set it to
+        // unmuttable empty list
+        if (getExperimentAttachments().size() == 0
+                && getExperimentAttachments() instanceof HashSet == false)
         {
-            experimentAttachment.setParent(this);
+            setExperimentAttachments(new HashSet<AttachmentPE>());
         }
-        setExperimentAttachments(attachments);
+        getExperimentAttachments().add(child);
     }
 
     @Transient
@@ -503,4 +525,9 @@ public class ExperimentPE implements IEntityPropertiesHolder<ExperimentPropertyP
     {
         return EntityKind.EXPERIMENT;
     }
+
+    public void ensureAttachmentsLoaded()
+    {
+        HibernateUtils.initialize(getExperimentAttachments());
+    }
 }