diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java
index 747f82c45f89b03ffb9573b8ad8e1ef82e7dc460..179af15ada8fd4567b5792595cec8d4fce5685ae 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/VocabularyBO.java
@@ -630,10 +630,40 @@ public class VocabularyBO extends AbstractBusinessObject implements IVocabularyB
         {
             for (Map.Entry<Class<? extends IEntityInformationWithPropertiesHolder>, List<Long>> entry : changedEntitiesMap.entrySet())
             {
+                Class<? extends IEntityInformationWithPropertiesHolder> key = entry.getKey();
+                // update modification timestamps of the entities
+                EntityKind entityKind = getEntityKind(key.getClass());
+                IEntityPropertyTypeDAO entityPropertyTypeDAO = getEntityPropertyTypeDAO(entityKind);
+                entityPropertyTypeDAO.updateEntityModificationTimestamps(entry.getValue());
+
                 getPersistencyResources().getDynamicPropertyEvaluationScheduler()
                         .scheduleUpdate(DynamicPropertyEvaluationOperation.evaluate(entry.getKey(), entry.getValue()));
             }
         }
     }
 
+    @SuppressWarnings("rawtypes")
+    private EntityKind getEntityKind(Class clazz)
+    {
+        if (clazz.isInstance(ExperimentPE.class))
+        {
+            return EntityKind.EXPERIMENT;
+        }
+        else if (clazz.isInstance(SamplePE.class))
+        {
+            return EntityKind.SAMPLE;
+        }
+        else if (clazz.isInstance(DataPE.class))
+        {
+            return EntityKind.DATA_SET;
+        }
+        else if (clazz.isInstance(MaterialPE.class))
+        {
+            return EntityKind.DATA_SET;
+        } else
+        {
+            throw new IllegalArgumentException("Unsupported entity class: " + clazz);
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationChangingServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationChangingServiceTest.java
index b6c09d897f45ba1bd6fdb0bd85d084f837c504f2..fc2594cb6059e3b8f20641e7a0382d9716d13d7a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationChangingServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationChangingServiceTest.java
@@ -22,6 +22,7 @@ import static org.testng.AssertJUnit.assertNotNull;
 import static org.testng.AssertJUnit.assertNull;
 import static org.testng.AssertJUnit.assertTrue;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -50,6 +51,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.dataset.DataSetCodeId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.experiment.ExperimentIdentifierId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.material.MaterialCodeAndTypeCodeId;
@@ -60,6 +62,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTermReplacement;
 import ch.systemsx.cisd.openbis.systemtest.PropertyHistory;
 import ch.systemsx.cisd.openbis.systemtest.SystemTestCase;
 import ch.systemsx.cisd.openbis.util.GeneralInformationServiceUtil;
@@ -125,6 +129,63 @@ public class GeneralInformationChangingServiceTest extends SystemTestCase
                 history.toString());
     }
 
+    @Test
+    public void testVocabularyAdditionAndReplacement()
+    {
+        TechId id = new TechId(1043L);
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sampleBefore = localCommonServer.getSampleInfo(sessionToken, id).getParent();
+        assertProperties("[ANY_MATERIAL: 2 (GENE), BACTERIUM: BACTERIUM-Y (BACTERIUM), "
+                + "COMMENT: extremely simple stuff, ORGANISM: GORILLA, SIZE: 321]",
+                sampleBefore);
+        NewETPTAssignment newETPTAssignment = new NewETPTAssignment();
+        newETPTAssignment.setEntityKind(EntityKind.SAMPLE);
+        newETPTAssignment.setDynamic(false);
+        newETPTAssignment.setMandatory(true);
+        newETPTAssignment.setDefaultValue("FEMALE");
+        newETPTAssignment.setPropertyTypeCode("GENDER");
+        newETPTAssignment.setOrdinal(1L);
+        newETPTAssignment.setEntityTypeCode("CELL_PLATE");
+        newETPTAssignment.setShownInEditView(true);
+        newETPTAssignment.setShowRawValue(true);
+        localCommonServer.assignPropertyType(sessionToken, newETPTAssignment);
+
+        Session hibernateSession = getHibernateSession();
+        hibernateSession.clear();
+        assertProperties("[ANY_MATERIAL: 2 (GENE), BACTERIUM: BACTERIUM-Y (BACTERIUM), "
+                + "COMMENT: extremely simple stuff, GENDER: FEMALE, ORGANISM: GORILLA, SIZE: 321]",
+                localCommonServer.getSampleInfo(sessionToken, id).getParent());
+
+        List<Vocabulary> listVocabularies = generalInformationService.listVocabularies(sessionToken);
+        Vocabulary genderVocab = null;
+        for (Vocabulary vocabulary : listVocabularies)
+        {
+            if (vocabulary.getCode().equals("GENDER"))
+            {
+                genderVocab = vocabulary;
+            }
+        }
+        assertNotNull(genderVocab);
+
+        VocabularyTermReplacement replacement = new VocabularyTermReplacement();
+        VocabularyTerm vocabularyTerm = new VocabularyTerm();
+        vocabularyTerm.setCode("FEMALE");
+        vocabularyTerm.setOrdinal(1L);
+        replacement.setTerm(vocabularyTerm);
+        replacement.setReplacementCode("MALE");
+
+        localCommonServer.deleteVocabularyTerms(sessionToken, new TechId(genderVocab.getId()),
+                Collections.<VocabularyTerm> emptyList(), Arrays.asList(replacement));
+
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sampleAfter = localCommonServer.getSampleInfo(sessionToken, id)
+                .getParent();
+        assertProperties("[ANY_MATERIAL: 2 (GENE), BACTERIUM: BACTERIUM-Y (BACTERIUM), "
+                + "COMMENT: extremely simple stuff, GENDER: MALE, ORGANISM: GORILLA, SIZE: 321]", sampleAfter);
+
+        hibernateSession.clear();
+
+        assertFalse(sampleBefore.getModificationDate().equals(sampleAfter.getModificationDate()));
+    }
+
     @Test
     public void testAssignMandatoryProperty()
     {