diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToManyRelationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToManyRelationExecutor.java
index b371df0399d092f769c760a46627ec6e1c88b218..6a93ae57149b842e55a6b60a5a733281afb45918 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToManyRelationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractSetEntityToManyRelationExecutor.java
@@ -17,6 +17,7 @@
 package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.Map;
 
@@ -37,6 +38,8 @@ public abstract class AbstractSetEntityToManyRelationExecutor<ENTITY_CREATION, E
 
     public void set(IOperationContext context, Map<ENTITY_CREATION, ENTITY_PE> creationsMap, Map<RELATED_ID, RELATED_PE> relatedMap)
     {
+        Collection<RELATED_PE> allSet = new HashSet<RELATED_PE>();
+
         for (ENTITY_CREATION creation : creationsMap.keySet())
         {
             ENTITY_PE entity = creationsMap.get(creation);
@@ -54,9 +57,17 @@ public abstract class AbstractSetEntityToManyRelationExecutor<ENTITY_CREATION, E
                 if (false == related.isEmpty())
                 {
                     setRelated(context, entity, related);
+                    allSet.addAll(related);
                 }
             }
         }
+
+        postSet(context, allSet);
+    }
+
+    protected void postSet(IOperationContext context, Collection<RELATED_PE> allSet)
+    {
+        // by default do nothing
     }
 
     protected abstract Collection<? extends RELATED_ID> getRelatedIds(IOperationContext context, ENTITY_CREATION creation);
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToManyRelationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToManyRelationExecutor.java
index 07bbfbee4a65fc88311dadad64bc401d394f9fdb..51437f0c79b1cfa285d0e8248e343b4f4b4963a4 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToManyRelationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/AbstractUpdateEntityToManyRelationExecutor.java
@@ -48,6 +48,9 @@ public abstract class AbstractUpdateEntityToManyRelationExecutor<ENTITY_UPDATE,
     @Override
     public void update(IOperationContext context, Map<ENTITY_UPDATE, ENTITY_PE> entitiesMap, Map<RELATED_ID, RELATED_PE> relatedMap)
     {
+        Collection<RELATED_PE> allAdded = new HashSet<RELATED_PE>();
+        Collection<RELATED_PE> allRemoved = new HashSet<RELATED_PE>();
+
         for (ENTITY_UPDATE update : entitiesMap.keySet())
         {
             IdListUpdateValue<? extends RELATED_ID> listUpdate = getRelatedUpdate(context, update);
@@ -74,10 +77,10 @@ public abstract class AbstractUpdateEntityToManyRelationExecutor<ENTITY_UPDATE,
                         }
                         if (action instanceof ListUpdateActionSet<?>)
                         {
-                            set(context, entity, relatedCollection);
+                            set(context, entity, relatedCollection, allAdded, allRemoved);
                         } else
                         {
-                            add(context, entity, relatedCollection);
+                            add(context, entity, relatedCollection, allAdded);
                         }
                     } else if (action instanceof ListUpdateActionRemove<?>)
                     {
@@ -90,15 +93,23 @@ public abstract class AbstractUpdateEntityToManyRelationExecutor<ENTITY_UPDATE,
                                 check(context, entity, relatedId, related);
                             }
                         }
-                        remove(context, entity, relatedCollection);
+                        remove(context, entity, relatedCollection, allRemoved);
                     }
                 }
             }
-
         }
+
+        postUpdate(context, allAdded, allRemoved);
+
+    }
+
+    protected void postUpdate(IOperationContext context, Collection<RELATED_PE> allAdded, Collection<RELATED_PE> allRemoved)
+    {
+        // by default do nothing
     }
 
-    protected void set(IOperationContext context, ENTITY_PE entity, Collection<RELATED_PE> related)
+    protected void set(IOperationContext context, ENTITY_PE entity, Collection<RELATED_PE> related, Collection<RELATED_PE> allAdded,
+            Collection<RELATED_PE> allRemoved)
     {
         Set<RELATED_PE> existingRelated = new HashSet<RELATED_PE>(getCurrentlyRelated(entity));
         Set<RELATED_PE> newRelated = new HashSet<RELATED_PE>(related);
@@ -108,6 +119,7 @@ public abstract class AbstractUpdateEntityToManyRelationExecutor<ENTITY_UPDATE,
             if (false == newRelated.contains(anExistingRelated))
             {
                 remove(context, entity, anExistingRelated);
+                allRemoved.add(anExistingRelated);
             }
         }
 
@@ -116,11 +128,12 @@ public abstract class AbstractUpdateEntityToManyRelationExecutor<ENTITY_UPDATE,
             if (false == existingRelated.contains(aNewRelated))
             {
                 add(context, entity, aNewRelated);
+                allAdded.add(aNewRelated);
             }
         }
     }
 
-    protected void add(IOperationContext context, ENTITY_PE entity, Collection<RELATED_PE> related)
+    protected void add(IOperationContext context, ENTITY_PE entity, Collection<RELATED_PE> related, Collection<RELATED_PE> allAdded)
     {
         Set<RELATED_PE> existingRelated = new HashSet<RELATED_PE>(getCurrentlyRelated(entity));
 
@@ -129,11 +142,12 @@ public abstract class AbstractUpdateEntityToManyRelationExecutor<ENTITY_UPDATE,
             if (false == existingRelated.contains(aRelated))
             {
                 add(context, entity, aRelated);
+                allAdded.add(aRelated);
             }
         }
     }
 
-    protected void remove(IOperationContext context, ENTITY_PE entity, Collection<RELATED_PE> related)
+    protected void remove(IOperationContext context, ENTITY_PE entity, Collection<RELATED_PE> related, Collection<RELATED_PE> allRemoved)
     {
         Set<RELATED_PE> existingRelated = new HashSet<RELATED_PE>(getCurrentlyRelated(entity));
 
@@ -142,6 +156,7 @@ public abstract class AbstractUpdateEntityToManyRelationExecutor<ENTITY_UPDATE,
             if (existingRelated.contains(aRelated))
             {
                 remove(context, entity, aRelated);
+                allRemoved.add(aRelated);
             }
         }
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/common/IReindexObjectExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/IReindexEntityExecutor.java
similarity index 68%
rename from openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/common/IReindexObjectExecutor.java
rename to openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/IReindexEntityExecutor.java
index e79b86cb1b089b906a40e30b19d603503cd3b1e5..743691b1f0d263fe0682fb9e7ce06a5aecfd8182 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/common/IReindexObjectExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/IReindexEntityExecutor.java
@@ -14,19 +14,19 @@
  * limitations under the License.
  */
 
-package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common;
+package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity;
 
 import java.util.Collection;
 
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 
 /**
  * @author pkupczyk
  */
-public interface IReindexObjectExecutor
+public interface IReindexEntityExecutor
 {
 
-    <T extends IIdHolder> void reindex(IOperationContext context, Class<T> objectClass, Collection<T> objects);
+    <T extends IEntityInformationWithPropertiesHolder> void reindex(IOperationContext context, Class<T> objectClass, Collection<T> objects);
 
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/common/ReindexObjectExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/ReindexEntityExecutor.java
similarity index 64%
rename from openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/common/ReindexObjectExecutor.java
rename to openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/ReindexEntityExecutor.java
index dd3310461097253845f3988d9ee21fa078f9af1c..968ca40d7d2152b4e772aca42651773b2e426fdc 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/common/ReindexObjectExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/ReindexEntityExecutor.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common;
+package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -24,25 +24,26 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.DynamicPropertyEvaluationOperation;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
-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.IDynamicPropertyEvaluationScheduler;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 
 /**
  * @author pkupczyk
  */
 @Component
-public class ReindexObjectExecutor implements IReindexObjectExecutor
+public class ReindexEntityExecutor implements IReindexEntityExecutor
 {
 
     @Autowired
     private IDAOFactory daoFactory;
 
     @Override
-    public <T extends IIdHolder> void reindex(IOperationContext context, Class<T> objectClass, Collection<T> objects)
+    public <T extends IEntityInformationWithPropertiesHolder> void reindex(IOperationContext context, Class<T> objectClass, Collection<T> objects)
     {
-        IFullTextIndexUpdateScheduler indexUpdater = daoFactory.getPersistencyResources().getIndexUpdateScheduler();
+        IDynamicPropertyEvaluationScheduler indexUpdater = daoFactory.getPersistencyResources().getDynamicPropertyEvaluationScheduler();
         List<Long> objectIds = new ArrayList<Long>();
 
         for (IIdHolder object : objects)
@@ -55,7 +56,7 @@ public class ReindexObjectExecutor implements IReindexObjectExecutor
 
         if (false == objectIds.isEmpty())
         {
-            indexUpdater.scheduleUpdate(IndexUpdateOperation.reindex(objectClass, objectIds));
+            indexUpdater.scheduleUpdate(DynamicPropertyEvaluationOperation.evaluate(objectClass, objectIds));
         }
     }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleExperimentExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleExperimentExecutor.java
index b571e814469032e46142fadd9280cc95cdff57de..266300706c972830398acec082f1b083731b938b 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleExperimentExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/sample/UpdateSampleExperimentExecutor.java
@@ -32,7 +32,6 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.AbstractUpdat
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.experiment.IMapExperimentByIdExecutor;
 import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ExperimentByIdentiferValidator;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.NewDataSetToSampleExperimentAssignmentManager;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -52,9 +51,6 @@ public class UpdateSampleExperimentExecutor extends
     @Autowired
     private IVerifySampleDataSetsExecutor verifySampleDataSetsExecutor;
 
-    @Autowired
-    private IDAOFactory daoFactory;
-
     @Override
     protected IExperimentId getRelatedId(ExperimentPE related)
     {
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/DeleteTagExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/DeleteTagExecutor.java
index 5961d9701bccf2892360dad3948cc45078a8520a..95e2663af728a8c243132c3fb0877fc78d322684 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/DeleteTagExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/DeleteTagExecutor.java
@@ -17,8 +17,10 @@
 package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.tag;
 
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -27,10 +29,16 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.deletion.TagDeletionOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.id.ITagId;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.AbstractDeleteEntityExecutor;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.IReindexEntityExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.helper.tag.TagAuthorization;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IMetaprojectBO;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.id.metaproject.MetaprojectTechIdId;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.MaterialPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 
 /**
  * @author pkupczyk
@@ -43,6 +51,9 @@ public class DeleteTagExecutor extends AbstractDeleteEntityExecutor<Void, ITagId
     @Autowired
     private IMapTagByIdExecutor mapTagByIdExecutor;
 
+    @Autowired
+    private IReindexEntityExecutor reindexObjectExecutor;
+
     @Override
     protected Map<ITagId, MetaprojectPE> map(IOperationContext context, List<? extends ITagId> entityIds)
     {
@@ -64,12 +75,44 @@ public class DeleteTagExecutor extends AbstractDeleteEntityExecutor<Void, ITagId
     @Override
     protected Void delete(IOperationContext context, Collection<MetaprojectPE> tags, TagDeletionOptions deletionOptions)
     {
+        Collection<ExperimentPE> experiments = new HashSet<ExperimentPE>();
+        Collection<SamplePE> samples = new HashSet<SamplePE>();
+        Collection<DataPE> dataSets = new HashSet<DataPE>();
+        Collection<MaterialPE> materials = new HashSet<MaterialPE>();
+
         for (MetaprojectPE tag : tags)
         {
+            Set<MetaprojectAssignmentPE> assignments = tag.getAssignments();
+
+            if (assignments != null)
+            {
+                for (MetaprojectAssignmentPE assignment : assignments)
+                {
+                    if (assignment.getExperiment() != null)
+                    {
+                        experiments.add(assignment.getExperiment());
+                    } else if (assignment.getSample() != null)
+                    {
+                        samples.add(assignment.getSample());
+                    } else if (assignment.getDataSet() != null)
+                    {
+                        dataSets.add(assignment.getDataSet());
+                    } else if (assignment.getMaterial() != null)
+                    {
+                        materials.add(assignment.getMaterial());
+                    }
+                }
+            }
+
             IMetaprojectBO metaprojectBO = businessObjectFactory.createMetaprojectBO(context.getSession());
             metaprojectBO.deleteByMetaprojectId(new MetaprojectTechIdId(tag.getId()), deletionOptions.getReason());
         }
 
+        reindexObjectExecutor.reindex(context, ExperimentPE.class, experiments);
+        reindexObjectExecutor.reindex(context, SamplePE.class, samples);
+        reindexObjectExecutor.reindex(context, DataPE.class, dataSets);
+        reindexObjectExecutor.reindex(context, MaterialPE.class, materials);
+
         return null;
     }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/SetTagEntitiesWithCacheExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/SetTagEntitiesWithCacheExecutor.java
index 8c05dfef99fd016dad43828954883fff89099c3c..5db295fa76923f1eef1ea878b1cbfab95bc2b0dd 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/SetTagEntitiesWithCacheExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/SetTagEntitiesWithCacheExecutor.java
@@ -17,7 +17,6 @@
 package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.tag;
 
 import java.util.Collection;
-import java.util.Map;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -25,9 +24,9 @@ import org.springframework.stereotype.Component;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.IObjectId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.create.TagCreation;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.IReindexObjectExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.AbstractSetEntityToManyRelationExecutor;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.IReindexEntityExecutor;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityWithMetaprojects;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
 
@@ -35,26 +34,19 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
  * @author pkupczyk
  */
 @Component
-public abstract class SetTagEntitiesWithCacheExecutor<RELATED_ID extends IObjectId, RELATED_PE extends IEntityWithMetaprojects>
+public abstract class SetTagEntitiesWithCacheExecutor<RELATED_ID extends IObjectId, RELATED_PE extends IEntityWithMetaprojects & IEntityInformationWithPropertiesHolder>
         extends AbstractSetEntityToManyRelationExecutor<TagCreation, MetaprojectPE, RELATED_ID, RELATED_PE>
 {
 
     @Autowired
-    private IDAOFactory daoFactory;
-
-    @Autowired
-    private IReindexObjectExecutor reindexObjectExecutor;
+    private IReindexEntityExecutor reindexObjectExecutor;
 
     protected abstract Class<RELATED_PE> getRelatedClass();
 
     @Override
-    public void set(IOperationContext context, Map<TagCreation, MetaprojectPE> creationsMap, Map<RELATED_ID, RELATED_PE> relatedMap)
+    protected void postSet(IOperationContext context, Collection<RELATED_PE> allSet)
     {
-        super.set(context, creationsMap, relatedMap);
-
-        daoFactory.getSessionFactory().getCurrentSession().flush();
-
-        reindexObjectExecutor.reindex(context, getRelatedClass(), relatedMap.values());
+        reindexObjectExecutor.reindex(context, getRelatedClass(), allSet);
     }
 
     @Override
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/UpdateTagEntitiesWithCacheExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/UpdateTagEntitiesWithCacheExecutor.java
index 5a5680ce56388c65b40d86cdf4353cb9aefbd928..67b62520376b66602c19466755d72565ee0596c1 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/UpdateTagEntitiesWithCacheExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/UpdateTagEntitiesWithCacheExecutor.java
@@ -18,16 +18,16 @@ package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.tag;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.update.TagUpdate;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.IReindexObjectExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.AbstractUpdateEntityToManyRelationExecutor;
-import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.entity.IReindexEntityExecutor;
+import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityInformationWithPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IEntityWithMetaprojects;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectAssignmentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
@@ -35,28 +35,25 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
 /**
  * @author pkupczyk
  */
-public abstract class UpdateTagEntitiesWithCacheExecutor<RELATED_ID, RELATED_PE extends IEntityWithMetaprojects>
+public abstract class UpdateTagEntitiesWithCacheExecutor<RELATED_ID, RELATED_PE extends IEntityWithMetaprojects & IEntityInformationWithPropertiesHolder>
         extends AbstractUpdateEntityToManyRelationExecutor<TagUpdate, MetaprojectPE, RELATED_ID, RELATED_PE>
 {
 
     @Autowired
-    private IDAOFactory daoFactory;
-
-    @Autowired
-    private IReindexObjectExecutor reindexObjectExecutor;
+    private IReindexEntityExecutor reindexObjectExecutor;
 
     protected abstract Class<RELATED_PE> getRelatedClass();
 
     protected abstract RELATED_PE getCurrentlyRelated(MetaprojectAssignmentPE entity);
 
     @Override
-    public void update(IOperationContext context, Map<TagUpdate, MetaprojectPE> entitiesMap, Map<RELATED_ID, RELATED_PE> relatedMap)
+    protected void postUpdate(IOperationContext context, Collection<RELATED_PE> allAdded, Collection<RELATED_PE> allRemoved)
     {
-        super.update(context, entitiesMap, relatedMap);
-
-        daoFactory.getSessionFactory().getCurrentSession().flush();
+        Collection<RELATED_PE> entitiesToReindex = new HashSet<RELATED_PE>();
+        entitiesToReindex.addAll(allAdded);
+        entitiesToReindex.addAll(allRemoved);
 
-        reindexObjectExecutor.reindex(context, getRelatedClass(), relatedMap.values());
+        reindexObjectExecutor.reindex(context, getRelatedClass(), entitiesToReindex);
     }
 
     @Override