diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PersistencyResources.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PersistencyResources.java
index 6549701bdcdd0951de97611e59e79c153d121ecb..ae3a93615fd0ad7a9ce6c36f8c96c3ab50f6ece9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PersistencyResources.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/PersistencyResources.java
@@ -19,22 +19,33 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess;
 import org.hibernate.SessionFactory;
 
 import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler;
 
 /**
  * Resources needed to create DAO's.
- *
- * @author     Franz-Josef Elmer
+ * 
+ * @author Franz-Josef Elmer
  */
 public final class PersistencyResources
 {
     private final DatabaseConfigurationContext contextOrNull;
+
     private final SessionFactory sessionFactoryOrNull;
 
+    private final IFullTextIndexUpdateScheduler indexUpdateScheduler;
+
+    private final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler;
+
     public PersistencyResources(DatabaseConfigurationContext contextOrNull,
-            SessionFactory sessionFactoryOrNull)
+            SessionFactory sessionFactoryOrNull,
+            IFullTextIndexUpdateScheduler indexUpdateScheduler,
+            IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler)
     {
         this.contextOrNull = contextOrNull;
         this.sessionFactoryOrNull = sessionFactoryOrNull;
+        this.indexUpdateScheduler = indexUpdateScheduler;
+        this.dynamicPropertyEvaluationScheduler = dynamicPropertyEvaluationScheduler;
     }
 
     public final DatabaseConfigurationContext getContextOrNull()
@@ -46,5 +57,15 @@ public final class PersistencyResources
     {
         return sessionFactoryOrNull;
     }
-    
+
+    public IFullTextIndexUpdateScheduler getIndexUpdateScheduler()
+    {
+        return indexUpdateScheduler;
+    }
+
+    public IDynamicPropertyEvaluationScheduler getDynamicPropertyEvaluationScheduler()
+    {
+        return dynamicPropertyEvaluationScheduler;
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f1fc5d3575657ac829ab74ea0ea61a01fddf58a
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractGenericEntityWithPropertiesDAO.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2007 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.openbis.generic.server.dataaccess.db;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.springframework.dao.DataAccessException;
+
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IndexUpdateOperation;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
+
+/**
+ * Abstract super class of DAOs for entities that are indexed and contain properties.
+ * 
+ * @author Piotr Buczek
+ */
+public abstract class AbstractGenericEntityWithPropertiesDAO<T extends IEntityInformationWithPropertiesHolder>
+        extends AbstractGenericEntityDAO<T>
+{
+    private final PersistencyResources persistencyResources;
+
+    protected AbstractGenericEntityWithPropertiesDAO(
+            final PersistencyResources persistencyResources,
+            final DatabaseInstancePE databaseInstance, final Class<T> entityClass)
+    {
+        super(persistencyResources.getSessionFactoryOrNull(), databaseInstance, entityClass);
+        this.persistencyResources = persistencyResources;
+    }
+
+    protected IFullTextIndexUpdateScheduler getIndexUpdateScheduler()
+    {
+        return persistencyResources.getIndexUpdateScheduler();
+    }
+
+    protected IDynamicPropertyEvaluationScheduler getDynamicPropertyEvaluatorScheduler()
+    {
+        return persistencyResources.getDynamicPropertyEvaluationScheduler();
+    }
+
+    @Override
+    public void delete(T entity) throws DataAccessException
+    {
+        super.delete(entity);
+        scheduleRemoveFromFullTextIndex(Collections.singletonList(entity.getId()));
+    }
+
+    protected void scheduleRemoveFromFullTextIndex(List<Long> ids)
+    {
+        getIndexUpdateScheduler().scheduleUpdate(IndexUpdateOperation.remove(getClass(), ids));
+    }
+
+    protected void scheduleFullTextIndexUpdate(List<Long> ids)
+    {
+        getIndexUpdateScheduler().scheduleUpdate(IndexUpdateOperation.reindex(getClass(), ids));
+    }
+
+    protected void scheduleDynamicPropertiesEvaluation(List<T> entities)
+    {
+        scheduleDynamicPropertiesEvaluation(getDynamicPropertyEvaluatorScheduler(),
+                getEntityClass(), entities);
+    }
+
+    protected void scheduleDynamicPropertiesEvaluationByIds(List<Long> ids)
+    {
+        scheduleDynamicPropertiesEvaluationForIds(getDynamicPropertyEvaluatorScheduler(),
+                getEntityClass(), ids);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AuthorizationDAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AuthorizationDAOFactory.java
index 8ae73c48d67b97f4dfbdf2afa4ef608f01c4ce46..133e68470cf07d9b46ea547a40965f00a5ad2720 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AuthorizationDAOFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AuthorizationDAOFactory.java
@@ -90,22 +90,18 @@ public class AuthorizationDAOFactory implements IAuthorizationDAOFactory
             final IFullTextIndexUpdateScheduler indexUpdateScheduler,
             final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler)
     {
-        persistencyResources = new PersistencyResources(context, sessionFactory);
+        persistencyResources =
+                new PersistencyResources(context, sessionFactory, indexUpdateScheduler,
+                        dynamicPropertyEvaluationScheduler);
         databaseInstancesDAO = new DatabaseInstanceDAO(sessionFactory);
         homeDatabaseInstance = getDatabaseInstanceId(context.getDatabaseInstance());
         personDAO = new PersonDAO(sessionFactory, homeDatabaseInstance);
         groupDAO = new GroupDAO(sessionFactory, homeDatabaseInstance);
         roleAssignmentDAO = new RoleAssignmentDAO(sessionFactory, homeDatabaseInstance);
-        externalDataDAO =
-                new ExternalDataDAO(sessionFactory, homeDatabaseInstance,
-                        dynamicPropertyEvaluationScheduler);
-        experimentDAO =
-                new ExperimentDAO(sessionFactory, homeDatabaseInstance,
-                        dynamicPropertyEvaluationScheduler);
+        externalDataDAO = new ExternalDataDAO(persistencyResources, homeDatabaseInstance);
+        experimentDAO = new ExperimentDAO(persistencyResources, homeDatabaseInstance);
         projectDAO = new ProjectDAO(sessionFactory, homeDatabaseInstance);
-        sampleDAO =
-                new SampleDAO(sessionFactory, homeDatabaseInstance, indexUpdateScheduler,
-                        dynamicPropertyEvaluationScheduler);
+        sampleDAO = new SampleDAO(persistencyResources, homeDatabaseInstance);
         gridCustomFilterDAO = new GridCustomFilterDAO(sessionFactory, homeDatabaseInstance);
         gridCustomColumnDAO = new GridCustomColumnDAO(sessionFactory, homeDatabaseInstance);
         queryDAO = new QueryDAO(sessionFactory, homeDatabaseInstance);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
index b8908166c16f67e4cf81f83bb6410659688cc566..acd3b911185afac4578f77822cebee33b3400ab0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
@@ -117,9 +117,7 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
         dataSetTypeDAO = new DataSetTypeDAO(sessionFactory, databaseInstance);
         fileFormatTypeDAO = new FileFormatTypeDAO(sessionFactory, databaseInstance);
         locatorTypeDAO = new LocatorTypeDAO(sessionFactory, databaseInstance);
-        materialDAO =
-                new MaterialDAO(sessionFactory, databaseInstance,
-                        dynamicPropertyEvaluationScheduler);
+        materialDAO = new MaterialDAO(getPersistencyResources(), databaseInstance);
         codeSequenceDAO = new CodeSequenceDAO(sessionFactory, databaseInstance);
         dataStoreDAO = new DataStoreDAO(sessionFactory, databaseInstance);
         permIdDAO = new PermIdDAO(sessionFactory, databaseInstance);
@@ -133,8 +131,7 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
                     new EntityTypeDAO(entityKind, sessionFactory, databaseInstance);
             entityTypeDAOs.put(entityKind, dao);
             entityPropertyTypeDAOs.put(entityKind, new EntityPropertyTypeDAO(entityKind,
-                    sessionFactory, databaseInstance, fullTextIndexUpdateScheduler,
-                    dynamicPropertyEvaluationScheduler));
+                    getPersistencyResources(), databaseInstance));
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java
index e57cff59eae6759fc2d89e22361089401ac00530..e42c2a642044538e4f1230ea34c1d414c7277b3f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/EntityPropertyTypeDAO.java
@@ -24,7 +24,6 @@ import java.util.Map;
 import org.apache.log4j.Logger;
 import org.hibernate.Criteria;
 import org.hibernate.SQLQuery;
-import org.hibernate.SessionFactory;
 import org.hibernate.StatelessSession;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.ProjectionList;
@@ -36,6 +35,7 @@ import org.springframework.orm.hibernate3.HibernateTemplate;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IEntityPropertyTypeDAO;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IndexUpdateOperation;
@@ -73,15 +73,15 @@ final class EntityPropertyTypeDAO extends AbstractDAO implements IEntityProperty
 
     private final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler;
 
-    public EntityPropertyTypeDAO(final EntityKind entityKind, final SessionFactory sessionFactory,
-            final DatabaseInstancePE databaseInstance,
-            final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler,
-            final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler)
+    public EntityPropertyTypeDAO(final EntityKind entityKind,
+            final PersistencyResources persistencyResources,
+            final DatabaseInstancePE databaseInstance)
     {
-        super(sessionFactory, databaseInstance);
+        super(persistencyResources.getSessionFactoryOrNull(), databaseInstance);
         this.entityKind = entityKind;
-        this.fullTextIndexUpdateScheduler = fullTextIndexUpdateScheduler;
-        this.dynamicPropertyEvaluationScheduler = dynamicPropertyEvaluationScheduler;
+        this.fullTextIndexUpdateScheduler = persistencyResources.getIndexUpdateScheduler();
+        this.dynamicPropertyEvaluationScheduler =
+                persistencyResources.getDynamicPropertyEvaluationScheduler();
     }
 
     private final <T extends EntityTypePropertyTypePE> Class<T> getEntityTypePropertyTypeAssignmentClass()
@@ -294,9 +294,8 @@ final class EntityPropertyTypeDAO extends AbstractDAO implements IEntityProperty
             operationLog.info(String.format("Created %s %s properties : %s", entityIds.size(),
                     entityKind.getLabel(), property));
         }
-        // index will not be updated automatically by Hibernate because we use native SQL queries
-        scheduleFullTextIndexUpdate(entityIds);
 
+        scheduleFullTextIndexUpdate(entityIds);
         if (property.getEntityTypePropertyType().isDynamic())
         {
             scheduleDynamicPropertiesEvaluation(entityIds);
@@ -439,8 +438,6 @@ final class EntityPropertyTypeDAO extends AbstractDAO implements IEntityProperty
         template.clear();
         template.delete(assignment);
 
-        // index will not be updated automatically by Hibernate
-        // because we use bulk update and don't touch entities
         scheduleFullTextIndexUpdate(entityIds);
 
         if (operationLog.isInfoEnabled())
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
index a176873400ad3814a0745c1fc13264849967e59a..fa14e1ed2edc471c7ec85f333892f2453a3a35da 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExperimentDAO.java
@@ -24,7 +24,6 @@ import java.util.Set;
 import org.apache.log4j.Logger;
 import org.hibernate.Criteria;
 import org.hibernate.FetchMode;
-import org.hibernate.SessionFactory;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.dao.DataAccessException;
@@ -34,7 +33,7 @@ import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.utilities.MethodUtils;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExperimentDAO;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
 import ch.systemsx.cisd.openbis.generic.shared.dto.CodeConverter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
@@ -47,20 +46,17 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
  * 
  * @author Izabela Adamczyk
  */
-public class ExperimentDAO extends AbstractGenericEntityDAO<ExperimentPE> implements IExperimentDAO
+public class ExperimentDAO extends AbstractGenericEntityWithPropertiesDAO<ExperimentPE> implements
+        IExperimentDAO
 {
 
     private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
             ExperimentDAO.class);
 
-    private final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler;
-
-    protected ExperimentDAO(final SessionFactory sessionFactory,
-            final DatabaseInstancePE databaseInstance,
-            final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler)
+    protected ExperimentDAO(final PersistencyResources persistencyResources,
+            final DatabaseInstancePE databaseInstance)
     {
-        super(sessionFactory, databaseInstance, ExperimentPE.class);
-        this.dynamicPropertyEvaluationScheduler = dynamicPropertyEvaluationScheduler;
+        super(persistencyResources, databaseInstance, ExperimentPE.class);
     }
 
     public List<ExperimentPE> listExperimentsWithProperties(final ProjectPE projectOrNull)
@@ -235,10 +231,4 @@ public class ExperimentDAO extends AbstractGenericEntityDAO<ExperimentPE> implem
         return list;
     }
 
-    private void scheduleDynamicPropertiesEvaluation(List<ExperimentPE> experiments)
-    {
-        scheduleDynamicPropertiesEvaluation(dynamicPropertyEvaluationScheduler, ExperimentPE.class,
-                experiments);
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java
index 9c488f1f11f45467b2db955d254967c32ec25507..c12f158902c93a5f1620af6e288802404d8235c4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java
@@ -30,7 +30,6 @@ import org.hibernate.FetchMode;
 import org.hibernate.HibernateException;
 import org.hibernate.LockMode;
 import org.hibernate.Session;
-import org.hibernate.SessionFactory;
 import org.hibernate.criterion.Criterion;
 import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.Projections;
@@ -45,7 +44,7 @@ import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.utilities.MethodUtils;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IExternalDataDAO;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
@@ -64,8 +63,8 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
  * 
  * @author Christian Ribeaud
  */
-final class ExternalDataDAO extends AbstractGenericEntityDAO<ExternalDataPE> implements
-        IExternalDataDAO
+final class ExternalDataDAO extends AbstractGenericEntityWithPropertiesDAO<ExternalDataPE>
+        implements IExternalDataDAO
 {
     private final static Class<ExternalDataPE> ENTITY_CLASS = ExternalDataPE.class;
 
@@ -76,13 +75,10 @@ final class ExternalDataDAO extends AbstractGenericEntityDAO<ExternalDataPE> imp
 
     private static final String TABLE_NAME = ENTITY_CLASS.getSimpleName();
 
-    private final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler;
-
-    ExternalDataDAO(final SessionFactory sessionFactory, final DatabaseInstancePE databaseInstance,
-            final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler)
+    ExternalDataDAO(final PersistencyResources persistencyResources,
+            final DatabaseInstancePE databaseInstance)
     {
-        super(sessionFactory, databaseInstance, ENTITY_CLASS);
-        this.dynamicPropertyEvaluationScheduler = dynamicPropertyEvaluationScheduler;
+        super(persistencyResources, databaseInstance, ENTITY_CLASS);
     }
 
     //
@@ -474,10 +470,4 @@ final class ExternalDataDAO extends AbstractGenericEntityDAO<ExternalDataPE> imp
         scheduleDynamicPropertiesEvaluation(Arrays.asList(entity));
     }
 
-    private void scheduleDynamicPropertiesEvaluation(List<ExternalDataPE> externalData)
-    {
-        scheduleDynamicPropertiesEvaluation(dynamicPropertyEvaluationScheduler,
-                ExternalDataPE.class, externalData);
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MaterialDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MaterialDAO.java
index 5911fdd93f10d87562dc7914d2b5e86e6d8c2372..eab465d52259d6890477c129d56b4590ee9a4376 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MaterialDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/MaterialDAO.java
@@ -21,7 +21,6 @@ import java.util.List;
 import org.apache.log4j.Logger;
 import org.hibernate.Criteria;
 import org.hibernate.FetchMode;
-import org.hibernate.SessionFactory;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.dao.DataAccessException;
 import org.springframework.orm.hibernate3.HibernateTemplate;
@@ -29,7 +28,7 @@ import org.springframework.orm.hibernate3.HibernateTemplate;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IMaterialDAO;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.CodeConverter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
@@ -41,7 +40,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialTypePE;
  * 
  * @author Izabela Adamczyk
  */
-public class MaterialDAO extends AbstractGenericEntityDAO<MaterialPE> implements IMaterialDAO
+public class MaterialDAO extends AbstractGenericEntityWithPropertiesDAO<MaterialPE> implements
+        IMaterialDAO
 {
 
     private static final Class<MaterialPE> ENTITY_CLASS = MaterialPE.class;
@@ -49,15 +49,10 @@ public class MaterialDAO extends AbstractGenericEntityDAO<MaterialPE> implements
     private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
             MaterialDAO.class);
 
-    private final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler;
-
-    protected MaterialDAO(final SessionFactory sessionFactory,
-            final DatabaseInstancePE databaseInstance,
-            final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler)
-
+    protected MaterialDAO(final PersistencyResources persistencyResources,
+            final DatabaseInstancePE databaseInstance)
     {
-        super(sessionFactory, databaseInstance, ENTITY_CLASS);
-        this.dynamicPropertyEvaluationScheduler = dynamicPropertyEvaluationScheduler;
+        super(persistencyResources, databaseInstance, ENTITY_CLASS);
     }
 
     public List<MaterialPE> listMaterialsWithProperties(final MaterialTypePE materialType)
@@ -135,9 +130,4 @@ public class MaterialDAO extends AbstractGenericEntityDAO<MaterialPE> implements
         return material;
     }
 
-    private void scheduleDynamicPropertiesEvaluation(List<MaterialPE> materials)
-    {
-        scheduleDynamicPropertiesEvaluation(dynamicPropertyEvaluationScheduler, MaterialPE.class,
-                materials);
-    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
index 35b83e406292df81cf0d688a1b5d748d5a8ef48a..3bd5fd9dc4757cd88e86911e7aa3038798ccaa4b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/SampleDAO.java
@@ -27,7 +27,6 @@ import org.hibernate.Criteria;
 import org.hibernate.FetchMode;
 import org.hibernate.SQLQuery;
 import org.hibernate.Session;
-import org.hibernate.SessionFactory;
 import org.hibernate.StatelessSession;
 import org.hibernate.criterion.Criterion;
 import org.hibernate.criterion.DetachedCriteria;
@@ -41,9 +40,7 @@ import org.springframework.orm.hibernate3.HibernateTemplate;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property.IDynamicPropertyEvaluationScheduler;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IFullTextIndexUpdateScheduler;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.IndexUpdateOperation;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.PersistencyResources;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.CodeConverter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
@@ -62,7 +59,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
  * 
  * @author Tomasz Pylak
  */
-public class SampleDAO extends AbstractGenericEntityDAO<SamplePE> implements ISampleDAO
+public class SampleDAO extends AbstractGenericEntityWithPropertiesDAO<SamplePE> implements
+        ISampleDAO
 {
     private final static Class<SamplePE> ENTITY_CLASS = SamplePE.class;
 
@@ -73,17 +71,10 @@ public class SampleDAO extends AbstractGenericEntityDAO<SamplePE> implements ISa
     private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
             SampleDAO.class);
 
-    private final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler;
-
-    private final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler;
-
-    SampleDAO(final SessionFactory sessionFactory, final DatabaseInstancePE databaseInstance,
-            final IFullTextIndexUpdateScheduler fullTextIndexUpdateScheduler,
-            final IDynamicPropertyEvaluationScheduler dynamicPropertyEvaluationScheduler)
+    SampleDAO(final PersistencyResources persistencyResources,
+            final DatabaseInstancePE databaseInstance)
     {
-        super(sessionFactory, databaseInstance, SamplePE.class);
-        this.fullTextIndexUpdateScheduler = fullTextIndexUpdateScheduler;
-        this.dynamicPropertyEvaluationScheduler = dynamicPropertyEvaluationScheduler;
+        super(persistencyResources, databaseInstance, SamplePE.class);
     }
 
     // LockSampleModificationsInterceptor automatically obtains lock
@@ -403,21 +394,8 @@ public class SampleDAO extends AbstractGenericEntityDAO<SamplePE> implements ISa
                 }
             });
 
-        // index will not be updated automatically by Hibernate because we use native SQL queries
-        scheduleRemoveFromFullTextIndex(sampleIds);
-    }
-
-    private void scheduleRemoveFromFullTextIndex(List<TechId> sampleIds)
-    {
         List<Long> ids = transformTechIds2Longs(sampleIds);
-        fullTextIndexUpdateScheduler.scheduleUpdate(IndexUpdateOperation
-                .remove(SamplePE.class, ids));
-    }
-
-    private void scheduleDynamicPropertiesEvaluation(List<SamplePE> samples)
-    {
-        scheduleDynamicPropertiesEvaluation(dynamicPropertyEvaluationScheduler, SamplePE.class,
-                samples);
+        scheduleRemoveFromFullTextIndex(ids);
     }
 
     @SuppressWarnings("unchecked")