diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentTypePropertyTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentTypePropertyTypePE.java
index 6294f21b519a1924ab85b684ef90b2777bb58d6f..814217f6f21f278dfc21ea51a97b177e4ab71125 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentTypePropertyTypePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentTypePropertyTypePE.java
@@ -53,10 +53,6 @@ public class ExperimentTypePropertyTypePE extends EntityTypePropertyTypePE
     public static final ExperimentTypePropertyTypePE[] EMPTY_ARRAY =
             new ExperimentTypePropertyTypePE[0];
 
-    //
-    // EntityTypePropertyTypePE
-    //
-
     @NotNull(message = ValidationMessages.EXPERIMENT_TYPE_NOT_NULL_MESSAGE)
     @ManyToOne(fetch = FetchType.EAGER, targetEntity = ExperimentTypePE.class)
     @JoinColumn(name = ColumnNames.EXPERIMENT_TYPE_COLUMN)
@@ -65,10 +61,12 @@ public class ExperimentTypePropertyTypePE extends EntityTypePropertyTypePE
         return entityType;
     }
 
-    @SuppressWarnings("unused")
-    // for Hibernate only
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, mappedBy = "entityTypePropertyType", targetEntity = ExperimentPropertyPE.class)
-    private Set<EntityPropertyPE> getPropertyValues()
+    //
+    // EntityTypePropertyTypePE
+    //
+
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entityTypePropertyType", targetEntity = ExperimentPropertyPE.class)
+    public Set<EntityPropertyPE> getPropertyValues()
     {
         return propertyValues;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/IEntityTypePropertyType.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/IEntityTypePropertyType.java
index 9e9c4ba17a7b2fe6f3bee223c4d41fafb660002d..bb66570fcf4826187fa6eb57038793cb8eb872be 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/IEntityTypePropertyType.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/IEntityTypePropertyType.java
@@ -16,9 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.dto;
 
+import java.util.Set;
 
 /**
- * An entity property is composed of:
+ * An entity type property type is composed of:
  * <ol>
  * <li>{@link IIdHolder#getId()}</li>
  * <li>{@link #getEntityType()}</li>
@@ -33,4 +34,9 @@ public interface IEntityTypePropertyType extends IIdHolder
      * Returns the entity type for this entity type property type.
      */
     public EntityTypePE getEntityType();
+
+    /**
+     * Returns the set of {@link EntityPropertyPE} associated with this entity type property type.
+     */
+    public Set<EntityPropertyPE> getPropertyValues();
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialTypePropertyTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialTypePropertyTypePE.java
index 108bab4ba221171086ee8a5328060b31224c213f..7f4cac9b0fa84fc914a0fcfeee4b035378822770 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialTypePropertyTypePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialTypePropertyTypePE.java
@@ -57,10 +57,6 @@ public class MaterialTypePropertyTypePE extends EntityTypePropertyTypePE
     {
     }
 
-    //
-    // EntityTypePropertyTypePE
-    //
-
     @NotNull(message = ValidationMessages.MATERIAL_TYPE_NOT_NULL_MESSAGE)
     @ManyToOne(fetch = FetchType.EAGER, targetEntity = MaterialTypePE.class)
     @JoinColumn(name = ColumnNames.MATERIAL_TYPE_COLUMN)
@@ -69,10 +65,12 @@ public class MaterialTypePropertyTypePE extends EntityTypePropertyTypePE
         return entityType;
     }
 
-    @SuppressWarnings("unused")
-    // for Hibernate only
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, mappedBy = "entityTypePropertyType", targetEntity = MaterialPropertyPE.class)
-    private Set<EntityPropertyPE> getPropertyValues()
+    //
+    // EntityTypePropertyTypePE
+    //
+
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entityTypePropertyType", targetEntity = MaterialPropertyPE.class)
+    public Set<EntityPropertyPE> getPropertyValues()
     {
         return propertyValues;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
index 23b95fd225374a4a397e046d799048fcad358363..71e1e2be6c1d8ebb46d0d6d85d76630cec7b6b50 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java
@@ -43,6 +43,8 @@ import javax.persistence.Transient;
 import org.apache.commons.lang.builder.EqualsBuilder;
 import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.apache.commons.lang.builder.ToStringBuilder;
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
 import org.hibernate.annotations.Check;
 import org.hibernate.annotations.Generated;
 import org.hibernate.annotations.GenerationTime;
@@ -208,7 +210,7 @@ public class SamplePE implements IIdAndCodeHolder, Comparable<SamplePE>,
     }
 
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entity")
-    // @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
     @IndexedEmbedded
     private Set<SamplePropertyPE> getSampleProperties()
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePropertyPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePropertyPE.java
index 0db81baf7a4c70ffda2ca01cfa9132b1039009e3..5daa0847a98ac7ee3a4ec18de39b90e40fd937d9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePropertyPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePropertyPE.java
@@ -28,6 +28,8 @@ import javax.persistence.Table;
 import javax.persistence.Transient;
 import javax.persistence.UniqueConstraint;
 
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
 import org.hibernate.validator.NotNull;
 
 import ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants;
@@ -41,7 +43,7 @@ import ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants;
 @Table(name = TableNames.SAMPLE_PROPERTIES_TABLE, uniqueConstraints =
     { @UniqueConstraint(columnNames =
         { ColumnNames.SAMPLE_COLUMN, ColumnNames.SAMPLE_TYPE_PROPERTY_TYPE_COLUMN }) })
-// @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
 public class SamplePropertyPE extends EntityPropertyPE
 {
     private static final long serialVersionUID = GenericSharedConstants.VERSION;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePropertyTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePropertyTypePE.java
index a39a9780bbf9c6dcf311c7c88bf2c555e9655988..a0f6445c33e06204ad1f4783140dca34cc443643 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePropertyTypePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePropertyTypePE.java
@@ -65,10 +65,6 @@ public class SampleTypePropertyTypePE extends EntityTypePropertyTypePE
         this.displayed = displayed;
     }
 
-    //
-    // EntityTypePropertyTypePE
-    //
-
     @NotNull(message = ValidationMessages.SAMPLE_TYPE_NOT_NULL_MESSAGE)
     @ManyToOne(fetch = FetchType.EAGER, targetEntity = SampleTypePE.class)
     @JoinColumn(name = ColumnNames.SAMPLE_TYPE_COLUMN)
@@ -77,10 +73,12 @@ public class SampleTypePropertyTypePE extends EntityTypePropertyTypePE
         return entityType;
     }
 
-    @SuppressWarnings("unused")
-    // for Hibernate only
-    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, mappedBy = "entityTypePropertyType", targetEntity = SamplePropertyPE.class)
-    private Set<EntityPropertyPE> getPropertyValues()
+    //
+    // EntityTypePropertyTypePE
+    //
+
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entityTypePropertyType", targetEntity = SamplePropertyPE.class)
+    public Set<EntityPropertyPE> getPropertyValues()
     {
         return propertyValues;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/HibernateUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/HibernateUtils.java
index a10e6b6b30513252d1ba7f48539ddb056235659e..36e19322f9e80fcf1190d510e28549e2c786995c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/HibernateUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/HibernateUtils.java
@@ -66,10 +66,10 @@ public final class HibernateUtils
     }
 
     /**
-     * For given <i>idHolder</i> returns corresponding {@link Long} id.
+     * For given <var>idHolder</var> returns corresponding {@link Long} id.
      * <p>
-     * Do not use this method. It is a hack till we use full object instead of id in proxied objects
-     * for DAO requests.
+     * Internally checks whether given {@link IIdHolder} is a {@link HibernateProxy} and handles
+     * correspondingly.
      * </p>
      */
     public final static Long getId(final IIdHolder idHolder)