diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java
index 04bcbfd5a4b0a9abb8b47af74dd3ddeb1f7e868b..24da4bc5010e329b1e5484cff04bf317c8b51fda 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java
@@ -75,6 +75,8 @@ public class GeneralInformationChangingService extends
     public void updateSampleProperties(String sessionToken, long sampleID,
             Map<String, String> properties)
     {
+        checkSession(sessionToken);
+        
         TechId id = new TechId(sampleID);
         Sample sample = server.getSampleInfo(sessionToken, id).getParent();
         for (Entry<String, String> entry : properties.entrySet())
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f3050f188bcba9d72d6f83dcbc3e554f8799d5d0
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingServiceTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2011 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.api.v1;
+
+import java.util.Date;
+import java.util.HashMap;
+
+import org.jmock.Expectations;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.common.test.RecordingMatcher;
+import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase;
+import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.MaterialBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.VocabularyTermBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+//PLEASE, if you add here a new test add also a system test to
+//ch.systemsx.cisd.openbis.systemtest.api.v1.GeneralInformationChangingServiceTest
+public class GeneralInformationChangingServiceTest extends AbstractServerTestCase
+{
+    private static final long SAMPLE_ID = 137;
+
+    private GeneralInformationChangingService service;
+
+    private ICommonServer commonServer;
+
+    @Override
+    @BeforeMethod
+    public final void setUp()
+    {
+        super.setUp();
+        commonServer = context.mock(ICommonServer.class);
+        service =
+                new GeneralInformationChangingService(sessionManager, daoFactory,
+                        propertiesBatchManager, commonServer);
+    }
+
+    @Test
+    public void testUpdateSampleProperties()
+    {
+        prepareGetSession();
+        final RecordingMatcher<SampleUpdatesDTO> updateMatcher = new RecordingMatcher<SampleUpdatesDTO>();
+        context.checking(new Expectations()
+            {
+                {
+                    one(commonServer).getSampleInfo(SESSION_TOKEN, new TechId(SAMPLE_ID));
+                    SampleBuilder sample =
+                            new SampleBuilder("/P/S1:A03")
+                                    .experiment(
+                                            new ExperimentBuilder().identifier("/S/P/E")
+                                                    .getExperiment())
+                                    .partOf(new SampleBuilder("/P/S1").getSample())
+                                    .modificationDate(new Date(1234567890))
+                                    .property("name", "Albert").property("age", "42");
+                    sample.property("material").type(DataTypeCode.MATERIAL)
+                            .value(new MaterialBuilder().code("A").type("Fluid"));
+                    sample.property("level").type(DataTypeCode.CONTROLLEDVOCABULARY)
+                            .value(new VocabularyTermBuilder("LOW").getTerm());
+                    SampleParentWithDerived sampleParentWithDerived = new SampleParentWithDerived();
+                    sampleParentWithDerived.setParent(sample.getSample());
+                    will(returnValue(sampleParentWithDerived));
+                    
+                    one(commonServer).updateSample(with(SESSION_TOKEN), with(updateMatcher));
+                }
+            });
+        HashMap<String, String> properties = new HashMap<String, String>();
+        properties.put("age", "76");
+        properties.put("greetings", "hello");
+        properties.put("material", "B (Fluid)");
+        
+        service.updateSampleProperties(SESSION_TOKEN, SAMPLE_ID, properties);
+
+        SampleUpdatesDTO updatesDTO = updateMatcher.recordedObject();
+        assertEquals(SAMPLE_ID, updatesDTO.getSampleIdOrNull().getId().longValue());
+        assertEquals(1234567890L, updatesDTO.getVersion().getTime());
+        assertEquals("[name: Albert, age: 76, material: B (Fluid), level: LOW, greetings: hello]",
+                updatesDTO.getProperties().toString());
+        assertEquals("/P/S1:A03", updatesDTO.getSampleIdentifier().toString());
+        assertEquals("/S/P/E", updatesDTO.getExperimentIdentifierOrNull().toString());
+        assertEquals("/P/S1", updatesDTO.getContainerIdentifierOrNull().toString());
+        assertEquals(0, updatesDTO.getAttachments().size());
+        context.assertIsSatisfied();
+    }
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/SampleBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/SampleBuilder.java
index 29aaf284aba2380d188a69529c2f07cade314f4b..828cbeb1ddecaa1fc2bd03e866c22827aae256f3 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/SampleBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/SampleBuilder.java
@@ -123,6 +123,12 @@ public class SampleBuilder
         return this;
     }
     
+    public SampleBuilder modificationDate(Date date)
+    {
+        sample.setModificationDate(date);
+        return this;
+    }
+    
     public SampleBuilder experiment(Experiment experiment)
     {
         sample.setExperiment(experiment);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/VocabularyTermBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/VocabularyTermBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..493852e792a90520fdfad4f1b65992e0960da2bc
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/VocabularyTermBuilder.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2011 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.shared.basic.dto.builders;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
+
+/**
+ * Builder for {@link VocabularyTerm} instance.
+ *
+ * @author Franz-Josef Elmer
+ */
+public class VocabularyTermBuilder
+{
+    private final VocabularyTerm term = new VocabularyTerm();
+    
+    public VocabularyTermBuilder(String code)
+    {
+        term.setCode(code);
+    }
+
+    public VocabularyTerm getTerm()
+    {
+        return term;
+    }
+    
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
index eb5baeeac15a2c53641c80ac0f95905f07319a0d..423dda0aebd144e64229f096e7c88e04276839b5 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
@@ -16,7 +16,11 @@
 
 package ch.systemsx.cisd.openbis.systemtest;
 
+import static org.testng.AssertJUnit.assertEquals;
+
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import javax.servlet.http.HttpSession;
@@ -181,6 +185,19 @@ public abstract class SystemTestCase extends AbstractTransactionalTestNGSpringCo
         AssertJUnit.fail("No row with code " + code + " found in " + codes);
         return null;
     }
+    
+    protected void assertProperties(String expectedProperties, IEntityPropertiesHolder propertiesHolder)
+    {
+        List<IEntityProperty> properties = new ArrayList<IEntityProperty>(propertiesHolder.getProperties());
+        Collections.sort(properties, new Comparator<IEntityProperty>()
+            {
+                public int compare(IEntityProperty p1, IEntityProperty p2)
+                {
+                    return p1.getPropertyType().getCode().compareTo(p2.getPropertyType().getCode());
+                }
+            });
+        assertEquals(expectedProperties, properties.toString());
+    }
 
     protected void assertProperty(IEntityPropertiesHolder propertiesHolder, String key, String value)
     {
@@ -191,7 +208,7 @@ public abstract class SystemTestCase extends AbstractTransactionalTestNGSpringCo
             String code = property.getPropertyType().getCode();
             if (code.equals(key))
             {
-                AssertJUnit.assertEquals("Property " + key, value, property.tryGetAsString());
+                assertEquals("Property " + key, value, property.tryGetAsString());
                 return;
             }
             propertyCodes.add(code);
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
new file mode 100644
index 0000000000000000000000000000000000000000..507ec7655d28002cd0263f0ef35cedc6b06920ed
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationChangingServiceTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2011 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.systemtest.api.v1;
+
+import java.util.HashMap;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationChangingService;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
+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.NewETPTAssignment;
+import ch.systemsx.cisd.openbis.systemtest.SystemTestCase;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+@Test(groups = "system test")
+public class GeneralInformationChangingServiceTest extends SystemTestCase
+{
+    @Autowired
+    private ICommonServer commonServer;
+    
+    @Autowired
+    private IGeneralInformationService generalInformationService;
+
+    @Autowired
+    private IGeneralInformationChangingService generalInformationChangingService;
+    
+    private String sessionToken;
+
+    @BeforeMethod
+    public void beforeMethod()
+    {
+        sessionToken = generalInformationService.tryToAuthenticateForAllServices("test", "a");
+    }
+
+    @AfterMethod
+    public void afterMethod()
+    {
+        generalInformationService.logout(sessionToken);
+    }
+
+    @Test
+    public void testUpdateSampleProperties()
+    {
+        TechId id = new TechId(1043L);
+        commonServer.assignPropertyType(sessionToken, new NewETPTAssignment(EntityKind.SAMPLE,
+                "DESCRIPTION", "CELL_PLATE", false, null, null, 1L, false, false, null));
+        commonServer.assignPropertyType(sessionToken, new NewETPTAssignment(EntityKind.SAMPLE,
+                "GENDER", "CELL_PLATE", false, null, null, 1L, false, false, null));
+        assertProperties("[ANY_MATERIAL: 2 (GENE), BACTERIUM: BACTERIUM-Y (BACTERIUM), "
+                + "COMMENT: extremely simple stuff, ORGANISM: GORILLA, SIZE: 321]", commonServer
+                .getSampleInfo(sessionToken, id).getParent());
+        HashMap<String, String> properties = new HashMap<String, String>();
+        properties.put("SIZE", "42");
+        properties.put("any_material", "1 (GENE)");
+        properties.put("Organism", "DOG");
+        properties.put("DESCRIPTION", "hello example");
+        properties.put("gender", "FEMALE");
+        
+        generalInformationChangingService.updateSampleProperties(sessionToken, id.getId(), properties);
+        
+        assertProperties("[ANY_MATERIAL: 1 (GENE), BACTERIUM: BACTERIUM-Y (BACTERIUM), "
+                + "COMMENT: extremely simple stuff, DESCRIPTION: hello example, GENDER: FEMALE, "
+                + "ORGANISM: DOG, SIZE: 42]", commonServer.getSampleInfo(sessionToken, id)
+                .getParent());
+    }
+}