diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java
index 99f960194a431f3fd8e2109b89e49983482920bc..fffd685f2aa78663d8bdfd9a652bc68cbc05a84a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DefaultDynamicPropertyEvaluator.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -85,10 +86,10 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator
     // IDynamicPropertyEvaluator
     //
 
-    public final <T extends IEntityInformationWithPropertiesHolder> void doEvaluateProperties(
+    public final <T extends IEntityInformationWithPropertiesHolder> List<Long> doEvaluateProperties(
             final Session hibernateSession, final Class<T> clazz) throws DataAccessException
     {
-        operationLog.info(String.format("Evaluating dynamic properties for '%s'...",
+        operationLog.info(String.format("Evaluating dynamic properties for all %ss...",
                 clazz.getSimpleName()));
 
         Transaction transaction = null;
@@ -106,10 +107,10 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator
                     clazz.getSimpleName()));
             final int maxIndex = idsSize - 1;
             // need to increment last id because we use 'lt' condition
-            if (maxIndex > -1)
-            {
-                ids.set(maxIndex, ids.get(maxIndex) + 1);
-            }
+                if (maxIndex > -1)
+        {
+                     ids.set(maxIndex, ids.get(maxIndex) + 1);
+       }
             while (index < maxIndex)
             {
                 final int nextIndex = getNextIndex(index, maxIndex);
@@ -126,6 +127,7 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator
             operationLog.info(String.format(
                     "Evaluation of dynamic properties for '%s' is complete. "
                             + "%d entities have been updated.", clazz.getSimpleName(), index));
+            return ids;
         } catch (Exception e)
         {
             operationLog.error(e.getMessage());
@@ -134,39 +136,44 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator
                 transaction.rollback();
             }
         }
+        return new ArrayList<Long>();
     }
 
-    public <T extends IEntityInformationWithPropertiesHolder> void doEvaluateProperties(
+    public <T extends IEntityInformationWithPropertiesHolder> List<Long> doEvaluateProperties(
             final Session hibernateSession, final Class<T> clazz, final List<Long> ids)
             throws DataAccessException
     {
-        operationLog.info(String.format("Evaluating dynamic properties for %s %ss...", ids.size(),
+        operationLog.info(String.format("Evaluating dynamic properties for %ss...",
                 clazz.getSimpleName()));
 
         Transaction transaction = null;
         try
         {
             transaction = hibernateSession.beginTransaction();
-            retainDynamicIds(hibernateSession, clazz, ids);
+            List<Long> dynamicIds = new ArrayList<Long>(ids);
+            retainDynamicIds(hibernateSession, clazz, dynamicIds);
+            operationLog.info(String.format("... got %d '%s' ids...", dynamicIds.size(),
+                    clazz.getSimpleName()));
             // we index entities in batches loading them in groups by id
-            final int maxIndex = ids.size();
+            final int maxIndex = dynamicIds.size();
             int index = 0;
 
             while (index < maxIndex)
             {
                 final int nextIndex = getNextIndex(index, maxIndex);
-                List<Long> subList = ids.subList(index, nextIndex);
+                List<Long> subList = dynamicIds.subList(index, nextIndex);
                 final List<T> results =
                         listEntitiesWithRestrictedId(hibernateSession, clazz, subList);
                 evaluateProperties(hibernateSession, results, clazz);
                 index = nextIndex;
-                operationLog.info(String.format("%d/%d %ss have been updated...", index, maxIndex,
+                operationLog.info(String.format("%d/%d %ss have been updated...", index + 1, maxIndex + 1,
                         clazz.getSimpleName()));
             }
             transaction.commit();
             operationLog.info(String.format(
                     "Evaluation of dynamic properties for '%s' is complete. "
-                            + "%d entities have been updated.", clazz.getSimpleName(), index));
+                            + "%d entities have been updated.", clazz.getSimpleName(), index + 1));
+            return dynamicIds;
         } catch (Exception e)
         {
             operationLog.error(e.getMessage());
@@ -175,6 +182,7 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator
                 transaction.rollback();
             }
         }
+        return new ArrayList<Long>();
     }
 
     private int getNextIndex(int index, int maxIndex)
@@ -295,14 +303,14 @@ final class DefaultDynamicPropertyEvaluator implements IDynamicPropertyEvaluator
             EntityKind entityKind) throws DataAccessException
     {
         final String query =
-                String.format(
-                        "SELECT pv.entity.id FROM %s pa join pa.propertyValues pv WHERE pa.dynamic = true",
-                        entityKind.getEntityTypePropertyTypeAssignmentClass().getSimpleName());
+                String.format("SELECT DISTINCT pv.entity.id FROM %s pa join pa.propertyValues pv "
+                        + "WHERE pa.dynamic = true", entityKind
+                        .getEntityTypePropertyTypeAssignmentClass().getSimpleName());
         final List<Long> list = list(hibernateSession.createQuery(query));
 
-        if (operationLog.isInfoEnabled())
+        if (operationLog.isDebugEnabled())
         {
-            operationLog.info(String.format(
+            operationLog.debug(String.format(
                     "LIST: found %s ids of entities of class '%s' assigned to dynamic property.",
                     list.size(), entityKind.getEntityTypePropertyTypeAssignmentClass()
                             .getSimpleName()));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java
index ae6aa7427b900a3f39139d578e7813e0e813416f..53954d292f5d679e08a285d828840fc043e79ce2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/DynamicPropertyEvaluationRunnable.java
@@ -17,6 +17,8 @@
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.db.dynamic_property;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.commons.lang.time.StopWatch;
 import org.apache.log4j.Logger;
@@ -134,6 +136,7 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport
                 stopWatch.start();
                 Session session = null;
                 Class<IEntityInformationWithPropertiesHolder> clazz = null;
+                List<Long> modifiedIds = null;
                 try
                 {
                     clazz =
@@ -143,10 +146,13 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport
 
                     if (operation.getIds() == null)
                     {
-                        evaluator.doEvaluateProperties(session, clazz);
+                        modifiedIds = evaluator.doEvaluateProperties(session, clazz);
                     } else
                     {
-                        evaluator.doEvaluateProperties(session, clazz, operation.getIds());
+                        // new collection is passed because it can be modified inside
+                        modifiedIds =
+                                evaluator.doEvaluateProperties(session, clazz, new ArrayList<Long>(
+                                        operation.getIds()));
                     }
                     stopWatch.stop();
                 } catch (RuntimeException e)
@@ -161,14 +167,19 @@ public final class DynamicPropertyEvaluationRunnable extends HibernateDaoSupport
                     if (operationLog.isInfoEnabled())
                     {
                         operationLog.info("Update of "
-                                + (operation.getIds() == null ? "" : operation.getIds().size()
-                                        + " ") + operation.getClassName() + "s took " + stopWatch);
+                                + (modifiedIds == null ? "" : modifiedIds.size() + " ")
+                                + operation.getClassName() + "s took " + stopWatch);
                     }
                     if (clazz != null)
                     {
-                        IndexUpdateOperation indexUpdateOperation =
-                                IndexUpdateOperation.reindex(clazz, operation.getIds());
-                        fullTextIndexUpdateScheduler.scheduleUpdate(indexUpdateOperation);
+                        List<Long> ids =
+                                operation.getIds() == null ? modifiedIds : operation.getIds();
+                        if (ids.size() > 0)
+                        {
+                            IndexUpdateOperation indexUpdateOperation =
+                                    IndexUpdateOperation.reindex(clazz, ids);
+                            fullTextIndexUpdateScheduler.scheduleUpdate(indexUpdateOperation);
+                        }
                     }
                 }
                 evaluatorQueue.take();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java
index dc4b67c3359178fe56a34dd7aaba65f8fc9d653d..6b675bbcc65bdeeca29b1eecfadf90631ace0a11 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/dynamic_property/IDynamicPropertyEvaluator.java
@@ -35,15 +35,19 @@ public interface IDynamicPropertyEvaluator
     /**
      * Evaluates dynamic properties of all entities of given <var>clazz</var> using given
      * <i>Hibernate</i> session.
+     * 
+     * @return list of ids of entities with dynamic properties that have been evaluated
      */
-    public <T extends IEntityInformationWithPropertiesHolder> void doEvaluateProperties(
+    public <T extends IEntityInformationWithPropertiesHolder> List<Long> doEvaluateProperties(
             final Session hibernateSession, final Class<T> clazz) throws DataAccessException;
 
     /**
      * Evaluates dynamic properties of entities of given <var>clazz</var> with given <var>ids</var>
      * using given <i>Hibernate</i> session.
+     * 
+     * @return list of ids of entities with dynamic properties that have been evaluated
      */
-    public <T extends IEntityInformationWithPropertiesHolder> void doEvaluateProperties(
+    public <T extends IEntityInformationWithPropertiesHolder> List<Long> doEvaluateProperties(
             final Session hibernateSession, final Class<T> clazz, final List<Long> ids)
             throws DataAccessException;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java
index 2e1915e67707d748a5e6d53d3291bdd86c8d86b8..af997e48a87edc60a786f237c8a4d96906c2d9a7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java
@@ -101,13 +101,13 @@ final class DefaultFullTextIndexer implements IFullTextIndexer
                         listEntitiesWithRestrictedId(fullTextSession, clazz, minId, maxId);
                 indexEntities(fullTextSession, results, clazz);
                 index = nextIndex;
-                operationLog.info(String.format("%d/%d %ss have been indexed...", index, maxIndex,
-                        clazz.getSimpleName()));
+                operationLog.info(String.format("%d/%d %ss have been indexed...", index + 1,
+                        maxIndex + 1, clazz.getSimpleName()));
             }
             fullTextSession.getSearchFactory().optimize(clazz);
             transaction.commit();
             operationLog.info(String.format("'%s' index complete. %d entities have been indexed.",
-                    clazz.getSimpleName(), index));
+                    clazz.getSimpleName(), index + 1));
         } catch (Exception e)
         {
             operationLog.error(e.getMessage());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java
index 2b1cb2acd85cf42a1dc77aae509c64d5f36f5ef5..868fa6a0b23c40dc07accfbfbae5579121d7d4a8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/FullTextIndexUpdater.java
@@ -169,14 +169,8 @@ public final class FullTextIndexUpdater extends HibernateDaoSupport implements
                         switch (operation.getOperationKind())
                         {
                             case REINDEX:
-                                if (operation.getIds() == null)
-                                {
-                                    fullTextIndexer.doFullTextIndex(session, clazz);
-                                } else
-                                {
-                                    fullTextIndexer.doFullTextIndexUpdate(session, clazz,
-                                            operation.getIds());
-                                }
+                                fullTextIndexer.doFullTextIndexUpdate(session, clazz,
+                                        operation.getIds());
                                 break;
                             case REMOVE:
                                 fullTextIndexer.removeFromIndex(session, clazz, operation.getIds());
@@ -193,11 +187,9 @@ public final class FullTextIndexUpdater extends HibernateDaoSupport implements
                         }
                         if (operationLog.isInfoEnabled())
                         {
-                            operationLog.info(operation.getOperationKind()
-                                    + " of "
-                                    + (operation.getIds() == null ? "all" : operation.getIds()
-                                            .size()) + " " + operation.getClassName() + "s took "
-                                    + stopWatch);
+                            operationLog.info(operation.getOperationKind() + " of "
+                                    + operation.getIds().size() + " " + operation.getClassName()
+                                    + "s took " + stopWatch);
                         }
                     }
                     updaterQueue.take();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/IndexUpdateOperation.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/IndexUpdateOperation.java
index 66c8ac0e2f6ee734dc9236d9f7f1b582c11b6bd9..b198657e1b340c39bbf006005d3b918ea8820130 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/IndexUpdateOperation.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/IndexUpdateOperation.java
@@ -82,8 +82,6 @@ public class IndexUpdateOperation implements Serializable
     @Override
     public String toString()
     {
-        return operationKind + " " + className + ": "
-                + (ids == null ? "all" : CollectionUtils.abbreviate(ids, 10));
+        return operationKind + " " + className + ": " + CollectionUtils.abbreviate(ids, 10);
     }
-
 }