diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/main.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/main.js
index b2dd49456e407ca084e592ac5df4ec3b1bc71828..3eb92302d604483ae24d4da6bdee7afb6552eee1 100644
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/main.js
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/main.js
@@ -1,7 +1,9 @@
 define([
          'test/test-login',
          'test/test-jsVSjava',
-         'test/test-create', 'test/test-update', 'test/test-search',
+         'test/test-create',
+         'test/test-update',
+         'test/test-search',
 
          'test/test-freezing',
          'test/test-get',
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-create.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-create.js
index ac42300ab7c9f905515435103b1119f28ad04683..bba5587fe768cccaa6b522bff2d6479b90aef043 100644
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-create.js
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-create.js
@@ -199,11 +199,99 @@ define(
 						c.assertEqual(experiment.getProject().getSpace().getCode(), "TEST", "Space code");
 						c.assertEqual(experiment.getProperties()[propertyTypeCodeSample], "20130412140147735-20", "Sample property id");
 						c.assertEqual(experiment.getProperties()[propertyTypeCodeDate], "2013-04-12", "Date property");
-						c.assertEqual(experiment.getSampleProperties()[propertyTypeCodeSample].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-1", "Sample property");
+						c.assertEqual(experiment.getSampleProperties()[propertyTypeCodeSample][0].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-1", "Sample property");
 					}
 					
 					testCreate(c, fCreate, c.findExperiment, fCheck);
 				});
+
+				QUnit.test("createExperiment() with multi-value property of type SAMPLE", function(assert) {
+                    var c = new common(assert, openbis);
+                    var propertyTypeCodeSample = c.generateId("PROPERTY_TYPE");
+
+                    var experimentTypeCode = c.generateId("EXPERIMENT_TYPE");
+                    var code = c.generateId("EXPERIMENT");
+
+                    var fCreate = function(facade) {
+                        var propertyTypeCreation1 = new c.PropertyTypeCreation();
+                        propertyTypeCreation1.setCode(propertyTypeCodeSample);
+                        propertyTypeCreation1.setDescription("hello");
+                        propertyTypeCreation1.setDataType(c.DataType.SAMPLE);
+                        propertyTypeCreation1.setLabel("Test Property Type");
+                        propertyTypeCreation1.setMultiValue(true);
+                        return facade.createPropertyTypes([ propertyTypeCreation1 ]).then(function(results) {
+                            var assignmentCreation1 = new c.PropertyAssignmentCreation();
+                            assignmentCreation1.setPropertyTypeId(new c.PropertyTypePermId(propertyTypeCodeSample));
+                            var experimentTypeCreation = new c.ExperimentTypeCreation();
+                            experimentTypeCreation.setCode(experimentTypeCode);
+                            experimentTypeCreation.setPropertyAssignments([ assignmentCreation1 ]);
+                            return facade.createExperimentTypes([ experimentTypeCreation ]).then(function(results) {
+                                var creation = new c.ExperimentCreation();
+                                creation.setTypeId(new c.EntityTypePermId(experimentTypeCode));
+                                creation.setCode(code);
+                                creation.setProjectId(new c.ProjectIdentifier("/TEST/TEST-PROJECT"));
+                                creation.setProperty(propertyTypeCodeSample, ["20130412140147735-20", "20130424134657597-433"]);
+                                return facade.createExperiments([ creation ]);
+                            });
+                        });
+                    }
+
+                    var fCheck = function(experiment) {
+                        c.assertEqual(experiment.getCode(), code, "Experiment code");
+                        c.assertEqual(experiment.getType().getCode(), experimentTypeCode, "Type code");
+                        c.assertEqual(experiment.getProject().getCode(), "TEST-PROJECT", "Project code");
+                        c.assertEqual(experiment.getProject().getSpace().getCode(), "TEST", "Space code");
+
+                        var identifiers = experiment.getSampleProperties()[propertyTypeCodeSample].map(x => x.getIdentifier().getIdentifier()).sort();
+                        c.assertEqual(identifiers.toString(), ['/PLATONIC/SCREENING-EXAMPLES/PLATE-1', '/TEST/TEST-SAMPLE-1'].toString(), "Sample properties");
+                        c.assertEqual(experiment.getProperties()[propertyTypeCodeSample].sort().toString(), ["20130412140147735-20", "20130424134657597-433"].toString(), "Sample property ids");
+                    }
+
+                    testCreate(c, fCreate, c.findExperiment, fCheck);
+                });
+
+                QUnit.test("createExperiment() with multi-value property of type CONTROLLEDVOCABULARY", function(assert) {
+                    var c = new common(assert, openbis);
+                    var propertyTypeCodeVocab = c.generateId("PROPERTY_TYPE");
+
+                    var experimentTypeCode = c.generateId("EXPERIMENT_TYPE");
+                    var code = c.generateId("EXPERIMENT");
+
+                    var fCreate = function(facade) {
+                        var propertyTypeCreation1 = new c.PropertyTypeCreation();
+                        propertyTypeCreation1.setCode(propertyTypeCodeVocab);
+                        propertyTypeCreation1.setDescription("hello");
+                        propertyTypeCreation1.setDataType(c.DataType.CONTROLLEDVOCABULARY);
+                        propertyTypeCreation1.setLabel("Test Property Type");
+                        propertyTypeCreation1.setMultiValue(true);
+                        propertyTypeCreation1.setVocabularyId(new c.VocabularyPermId("ANTIBODY.HOST"));
+                        return facade.createPropertyTypes([ propertyTypeCreation1 ]).then(function(results) {
+                            var assignmentCreation1 = new c.PropertyAssignmentCreation();
+                            assignmentCreation1.setPropertyTypeId(new c.PropertyTypePermId(propertyTypeCodeVocab));
+                            var experimentTypeCreation = new c.ExperimentTypeCreation();
+                            experimentTypeCreation.setCode(experimentTypeCode);
+                            experimentTypeCreation.setPropertyAssignments([ assignmentCreation1 ]);
+                            return facade.createExperimentTypes([ experimentTypeCreation ]).then(function(results) {
+                                var creation = new c.ExperimentCreation();
+                                creation.setTypeId(new c.EntityTypePermId(experimentTypeCode));
+                                creation.setCode(code);
+                                creation.setProjectId(new c.ProjectIdentifier("/TEST/TEST-PROJECT"));
+                                creation.setProperty(propertyTypeCodeVocab, ["RAT", "MOUSE"]);
+                                return facade.createExperiments([ creation ]);
+                            });
+                        });
+                    }
+
+                    var fCheck = function(experiment) {
+                        c.assertEqual(experiment.getCode(), code, "Experiment code");
+                        c.assertEqual(experiment.getType().getCode(), experimentTypeCode, "Type code");
+                        c.assertEqual(experiment.getProject().getCode(), "TEST-PROJECT", "Project code");
+                        c.assertEqual(experiment.getProject().getSpace().getCode(), "TEST", "Space code");
+                        c.assertEqual(experiment.getProperties()[propertyTypeCodeVocab].sort().toString(), ["MOUSE", "RAT"].toString(), "Vocabulary property ids");
+                    }
+
+                    testCreate(c, fCreate, c.findExperiment, fCheck);
+                });
 				
 				QUnit.test("createExperimentTypes()", function(assert) {
 					var c = new common(assert, openbis);
@@ -375,12 +463,93 @@ define(
 						c.assertEqual(sample.getCode(), code, "Sample code");
 						c.assertEqual(sample.getType().getCode(), sampleTypeCode, "Type code");
 						c.assertEqual(sample.getSpace().getCode(), "TEST", "Space code");
-						c.assertEqual(sample.getSampleProperties()[propertyTypeCode].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-1", "Sample property");
+						c.assertEqual(sample.getSampleProperties()[propertyTypeCode][0].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-1", "Sample property");
 						c.assertEqual(sample.getProperties()[propertyTypeCode], "20130412140147735-20", "Sample property id");
 					}
 					
 					testCreate(c, fCreate, c.findSample, fCheck);
 				});
+
+				QUnit.test("createSamples() with multi-value property of type SAMPLE", function(assert) {
+                    var c = new common(assert, openbis);
+                    var propertyTypeCode = c.generateId("PROPERTY_TYPE");
+                    var sampleTypeCode = c.generateId("SAMPLE_TYPE");
+                    var code = c.generateId("SAMPLE");
+
+                    var fCreate = function(facade) {
+                        var propertyTypeCreation = new c.PropertyTypeCreation();
+                        propertyTypeCreation.setCode(propertyTypeCode);
+                        propertyTypeCreation.setDescription("hello");
+                        propertyTypeCreation.setDataType(c.DataType.SAMPLE);
+                        propertyTypeCreation.setLabel("Test Property Type");
+                        propertyTypeCreation.setMultiValue(true);
+                        return facade.createPropertyTypes([ propertyTypeCreation ]).then(function(results) {
+                            var assignmentCreation = new c.PropertyAssignmentCreation();
+                            assignmentCreation.setPropertyTypeId(new c.PropertyTypePermId(propertyTypeCode));
+                            var sampleTypeCreation = new c.SampleTypeCreation();
+                            sampleTypeCreation.setCode(sampleTypeCode);
+                            sampleTypeCreation.setPropertyAssignments([ assignmentCreation ]);
+                            return facade.createSampleTypes([ sampleTypeCreation ]).then(function(results) {
+                                var creation = new c.SampleCreation();
+                                creation.setTypeId(new c.EntityTypePermId(sampleTypeCode));
+                                creation.setCode(code);
+                                creation.setSpaceId(new c.SpacePermId("TEST"));
+                                creation.setProperty(propertyTypeCode, ["20130412140147735-20", "20130424134657597-433"]);
+                                return facade.createSamples([ creation ]);
+                            });
+                        });
+                    }
+
+                    var fCheck = function(sample) {
+                        c.assertEqual(sample.getCode(), code, "Sample code");
+                        c.assertEqual(sample.getType().getCode(), sampleTypeCode, "Type code");
+                        c.assertEqual(sample.getSpace().getCode(), "TEST", "Space code");
+                        var identifiers = sample.getSampleProperties()[propertyTypeCode].map(x => x.getIdentifier().getIdentifier()).sort();
+                        c.assertEqual(identifiers.toString(), ['/PLATONIC/SCREENING-EXAMPLES/PLATE-1', '/TEST/TEST-SAMPLE-1'].toString(), "Sample properties");
+                        c.assertEqual(sample.getProperties()[propertyTypeCode].sort().toString(), ["20130412140147735-20", "20130424134657597-433"].toString(), "Sample property ids");
+                    }
+                    testCreate(c, fCreate, c.findSample, fCheck);
+                });
+
+                QUnit.test("createSamples() with multi-value property of type CONTROLLEDVOCABULARY", function(assert) {
+                    var c = new common(assert, openbis);
+                    var propertyTypeCode = c.generateId("PROPERTY_TYPE");
+                    var sampleTypeCode = c.generateId("SAMPLE_TYPE");
+                    var code = c.generateId("SAMPLE");
+
+                    var fCreate = function(facade) {
+                        var propertyTypeCreation = new c.PropertyTypeCreation();
+                        propertyTypeCreation.setCode(propertyTypeCode);
+                        propertyTypeCreation.setDescription("hello");
+                        propertyTypeCreation.setDataType(c.DataType.CONTROLLEDVOCABULARY);
+                        propertyTypeCreation.setLabel("Test Property Type");
+                        propertyTypeCreation.setMultiValue(true);
+                        propertyTypeCreation.setVocabularyId(new c.VocabularyPermId("ANTIBODY.HOST"));
+                        return facade.createPropertyTypes([ propertyTypeCreation ]).then(function(results) {
+                            var assignmentCreation = new c.PropertyAssignmentCreation();
+                            assignmentCreation.setPropertyTypeId(new c.PropertyTypePermId(propertyTypeCode));
+                            var sampleTypeCreation = new c.SampleTypeCreation();
+                            sampleTypeCreation.setCode(sampleTypeCode);
+                            sampleTypeCreation.setPropertyAssignments([ assignmentCreation ]);
+                            return facade.createSampleTypes([ sampleTypeCreation ]).then(function(results) {
+                                var creation = new c.SampleCreation();
+                                creation.setTypeId(new c.EntityTypePermId(sampleTypeCode));
+                                creation.setCode(code);
+                                creation.setSpaceId(new c.SpacePermId("TEST"));
+                                creation.setProperty(propertyTypeCode, ["RAT", "MOUSE"]);
+                                return facade.createSamples([ creation ]);
+                            });
+                        });
+                    }
+
+                    var fCheck = function(sample) {
+                        c.assertEqual(sample.getCode(), code, "Sample code");
+                        c.assertEqual(sample.getType().getCode(), sampleTypeCode, "Type code");
+                        c.assertEqual(sample.getSpace().getCode(), "TEST", "Space code");
+                        c.assertEqual(sample.getProperties()[propertyTypeCode].sort().toString(), ["MOUSE", "RAT"].toString(), "Vocabulary property ids");
+                    }
+                    testCreate(c, fCreate, c.findSample, fCheck);
+                });
 				
 				QUnit.test("createSampleTypes()", function(assert) {
 					var c = new common(assert, openbis);
@@ -556,7 +725,7 @@ define(
 						c.assertEqual(dataSet.getCode(), code, "Data set code");
 						c.assertEqual(dataSet.getType().getCode(), dataSetTypeCode, "Type code");
 						c.assertEqual(dataSet.getProperties()[propertyTypeCode], "20130412140147735-20", "Sample property id");
-						c.assertEqual(dataSet.getSampleProperties()[propertyTypeCode].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-1", "Sample property");
+						c.assertEqual(dataSet.getSampleProperties()[propertyTypeCode][0].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-1", "Sample property");
 
 						var metaData = dataSet.getMetaData();
 						c.assertEqual(metaData["dataset_key"], "dataset_value", "Metadata");
@@ -565,6 +734,100 @@ define(
 					
 					testCreate(c, fCreate, c.findDataSet, fCheck);
 				});
+
+				QUnit.test("createDataSet() with multi-value property of type SAMPLE", function(assert) {
+                    var c = new common(assert, openbis);
+                    var propertyTypeCode = c.generateId("PROPERTY_TYPE");
+                    var dataSetTypeCode = c.generateId("DATA_SET_TYPE");
+                    var code = c.generateId("DATA_SET");
+
+                    var fCreate = function(facade) {
+                        var propertyTypeCreation = new c.PropertyTypeCreation();
+                        propertyTypeCreation.setCode(propertyTypeCode);
+                        propertyTypeCreation.setDescription("hello");
+                        propertyTypeCreation.setDataType(c.DataType.SAMPLE);
+                        propertyTypeCreation.setLabel("Test Property Type");
+                        propertyTypeCreation.setMultiValue(true);
+                        return facade.createPropertyTypes([ propertyTypeCreation ]).then(function(results) {
+                            var assignmentCreation = new c.PropertyAssignmentCreation();
+                            assignmentCreation.setPropertyTypeId(new c.PropertyTypePermId(propertyTypeCode));
+                            var dataSetTypeCreation = new c.DataSetTypeCreation();
+                            dataSetTypeCreation.setCode(dataSetTypeCode);
+                            dataSetTypeCreation.setPropertyAssignments([ assignmentCreation ]);
+                            return facade.createDataSetTypes([ dataSetTypeCreation ]).then(function(results) {
+                                var creation = new c.DataSetCreation();
+                                creation.setTypeId(new c.EntityTypePermId(dataSetTypeCode));
+                                creation.setCode(code);
+                                creation.setDataSetKind(c.DataSetKind.CONTAINER);
+                                creation.setDataStoreId(new c.DataStorePermId("DSS1"));
+                                creation.setExperimentId(new c.ExperimentIdentifier("/TEST/TEST-PROJECT/TEST-EXPERIMENT"));
+                                creation.setProperty(propertyTypeCode, ["20130412140147735-20", "20130424134657597-433"]);
+                                creation.setMetaData({"dataset_key":"dataset_value"});
+                                return facade.createDataSets([ creation ]);
+                            });
+                        });
+                    }
+
+                    var fCheck = function(dataSet) {
+                        c.assertEqual(dataSet.getCode(), code, "Data set code");
+                        c.assertEqual(dataSet.getType().getCode(), dataSetTypeCode, "Type code");
+
+                        var identifiers = dataSet.getSampleProperties()[propertyTypeCode].map(x => x.getIdentifier().getIdentifier()).sort();
+                        c.assertEqual(identifiers.toString(), ['/PLATONIC/SCREENING-EXAMPLES/PLATE-1', '/TEST/TEST-SAMPLE-1'].toString(), "Sample properties");
+                        c.assertEqual(dataSet.getProperties()[propertyTypeCode].sort().toString(), ["20130412140147735-20", "20130424134657597-433"].toString(), "Sample property ids");
+
+                        var metaData = dataSet.getMetaData();
+                        c.assertEqual(metaData["dataset_key"], "dataset_value", "Metadata");
+
+                    }
+
+                    testCreate(c, fCreate, c.findDataSet, fCheck);
+                });
+
+                QUnit.test("createDataSet() with multi-value property of type CONTROLLEDVOCABULARY", function(assert) {
+                    var c = new common(assert, openbis);
+                    var propertyTypeCode = c.generateId("PROPERTY_TYPE");
+                    var dataSetTypeCode = c.generateId("DATA_SET_TYPE");
+                    var code = c.generateId("DATA_SET");
+
+                    var fCreate = function(facade) {
+                        var propertyTypeCreation = new c.PropertyTypeCreation();
+                        propertyTypeCreation.setCode(propertyTypeCode);
+                        propertyTypeCreation.setDescription("hello");
+                        propertyTypeCreation.setDataType(c.DataType.CONTROLLEDVOCABULARY);
+                        propertyTypeCreation.setLabel("Test Property Type");
+                        propertyTypeCreation.setMultiValue(true);
+                        propertyTypeCreation.setVocabularyId(new c.VocabularyPermId("ANTIBODY.HOST"));
+                        return facade.createPropertyTypes([ propertyTypeCreation ]).then(function(results) {
+                            var assignmentCreation = new c.PropertyAssignmentCreation();
+                            assignmentCreation.setPropertyTypeId(new c.PropertyTypePermId(propertyTypeCode));
+                            var dataSetTypeCreation = new c.DataSetTypeCreation();
+                            dataSetTypeCreation.setCode(dataSetTypeCode);
+                            dataSetTypeCreation.setPropertyAssignments([ assignmentCreation ]);
+                            return facade.createDataSetTypes([ dataSetTypeCreation ]).then(function(results) {
+                                var creation = new c.DataSetCreation();
+                                creation.setTypeId(new c.EntityTypePermId(dataSetTypeCode));
+                                creation.setCode(code);
+                                creation.setDataSetKind(c.DataSetKind.CONTAINER);
+                                creation.setDataStoreId(new c.DataStorePermId("DSS1"));
+                                creation.setExperimentId(new c.ExperimentIdentifier("/TEST/TEST-PROJECT/TEST-EXPERIMENT"));
+                                creation.setProperty(propertyTypeCode, ["RAT", "MOUSE"]);
+                                creation.setMetaData({"dataset_key":"dataset_value"});
+                                return facade.createDataSets([ creation ]);
+                            });
+                        });
+                    }
+
+                    var fCheck = function(dataSet) {
+                        c.assertEqual(dataSet.getCode(), code, "Data set code");
+                        c.assertEqual(dataSet.getType().getCode(), dataSetTypeCode, "Type code");
+                        c.assertEqual(dataSet.getProperties()[propertyTypeCode].sort().toString(), ["MOUSE", "RAT"].toString(), "Vocabulary property ids");
+                        var metaData = dataSet.getMetaData();
+                        c.assertEqual(metaData["dataset_key"], "dataset_value", "Metadata");
+                    }
+
+                    testCreate(c, fCreate, c.findDataSet, fCheck);
+                });
 				
 				QUnit.test("createDataSetTypes()", function(assert) {
 					var c = new common(assert, openbis);
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-search.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-search.js
index 86163a252444a76305fb580a3b0d2792e22a12bb..5e16a056a0199f76ed0fc3daca9c7f8232fbba1e 100644
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-search.js
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-search.js
@@ -3682,7 +3682,6 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			}
 
 			var fCleanup = function(facade, samples) {
-				debugger;
 				if (samples) {
 					cleanup(c, facade, samples[0].getPermId(), propertyTypeId, sampleTypeId);
 				}
@@ -3723,7 +3722,6 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			}
 
 			var fCleanup = function(facade, samples) {
-				debugger;
 				if (samples) {
 					cleanup(c, facade, samples[0].getPermId(), propertyTypeId, sampleTypeId);
 				}
@@ -3775,7 +3773,6 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			}
 
 			var testDataType = function(i) {
-				debugger;
 				var dataType = dataTypes[i];
 				var fSearch = function(facade) {
 					return createPropertyType(c, facade, dataType).then(function(propertyTypeIds) {
@@ -3785,13 +3782,11 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 				}
 
 				var fCheck = function() {
-					debugger;
 					c.fail("Expected exception not thrown for data type " + dataType + ".");
 					fRecursion(i);
 				}
 
 				testSearch(c, fSearch, fCheck, function(e) {
-					debugger;
 					c.ok("Expected exception thrown for data type " + dataType + ".");
 					fRecursion(i);
 				});
diff --git a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-update.js b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-update.js
index 9c1cc46217e561cfc7308d8292c5db17d9ad23d9..6dd6b2aa1b5af3a5c6ad1f93e22e2775840f562b 100644
--- a/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-update.js
+++ b/test-api-openbis-javascript/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-update.js
@@ -386,13 +386,66 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 				c.assertEqual(experiment.getType().getCode(), experimentTypeCode, "Type code");
 				c.assertEqual(experiment.getProject().getCode(), "TEST-PROJECT", "Project code");
 				c.assertEqual(experiment.getProject().getSpace().getCode(), "TEST", "Space code");
-				c.assertEqual(experiment.getSampleProperties()[propertyTypeCode].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-2", "Sample property");
+				c.assertEqual(experiment.getSampleProperties()[propertyTypeCode][0].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-2", "Sample property");
 				c.assertEqual(experiment.getHistory()[0].getPropertyName(), propertyTypeCode, "Previous sample property name");
 				c.assertEqual(experiment.getHistory()[0].getPropertyValue(), "20130412140147735-20", "Previous sample property value");
 			}
 
 			testUpdate(c, fCreate, fUpdate, c.findExperiment, fCheck);
 		});
+
+		QUnit.test("updateExperiment() change multi-value property of type SAMPLE", function(assert) {
+            var c = new common(assert, openbis);
+            var propertyTypeCode = c.generateId("PROPERTY_TYPE");
+            var experimentTypeCode = c.generateId("EXPERIMENT_TYPE");
+            var code = c.generateId("EXPERIMENT");
+
+            var fCreate = function(facade) {
+                var propertyTypeCreation = new c.PropertyTypeCreation();
+                propertyTypeCreation.setCode(propertyTypeCode);
+                propertyTypeCreation.setDescription("hello");
+                propertyTypeCreation.setDataType(c.DataType.SAMPLE);
+                propertyTypeCreation.setLabel("Test Property Type");
+                propertyTypeCreation.setMultiValue(true);
+                return facade.createPropertyTypes([ propertyTypeCreation ]).then(function(results) {
+                    var assignmentCreation = new c.PropertyAssignmentCreation();
+                    assignmentCreation.setPropertyTypeId(new c.PropertyTypePermId(propertyTypeCode));
+                    var experimentTypeCreation = new c.ExperimentTypeCreation();
+                    experimentTypeCreation.setCode(experimentTypeCode);
+                    experimentTypeCreation.setPropertyAssignments([ assignmentCreation ]);
+                    return facade.createExperimentTypes([ experimentTypeCreation ]).then(function(results) {
+                        var creation = new c.ExperimentCreation();
+                        creation.setTypeId(new c.EntityTypePermId(experimentTypeCode));
+                        creation.setCode(code);
+                        creation.setProjectId(new c.ProjectIdentifier("/TEST/TEST-PROJECT"));
+                        creation.setProperty(propertyTypeCode, ["20130412140147735-20", "20130424134657597-433"]);
+                        return facade.createExperiments([ creation ]);
+                    });
+                });
+            }
+
+            var fUpdate = function(facade, permId) {
+                var update = new c.ExperimentUpdate();
+                update.setExperimentId(permId);
+                update.setProperty(propertyTypeCode, "20130412140147736-21");
+                return facade.updateExperiments([ update ]);
+            }
+
+            var fCheck = function(experiment) {
+                c.assertEqual(experiment.getCode(), code, "Experiment code");
+                c.assertEqual(experiment.getType().getCode(), experimentTypeCode, "Type code");
+                c.assertEqual(experiment.getProject().getCode(), "TEST-PROJECT", "Project code");
+                c.assertEqual(experiment.getProject().getSpace().getCode(), "TEST", "Space code");
+                c.assertEqual(experiment.getSampleProperties()[propertyTypeCode][0].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-2", "Sample property");
+
+                var history = experiment.getHistory().filter(x => x.propertyName == propertyTypeCode && x.validTo);
+                c.assertEqual(history.length, 2, "Previous sample property name");
+                c.assertEqual(history.map(x => x.propertyValue).sort().toString(), ["20130412140147735-20", "20130424134657597-433"].toString(), "Previous sample property value");
+
+            }
+
+            testUpdate(c, fCreate, fUpdate, c.findExperiment, fCheck);
+        });
 		
 		QUnit.test("updateSampleTypes()", function(assert) {
 			var c = new common(assert, openbis);
@@ -676,13 +729,63 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 				c.assertEqual(sample.getCode(), code, "Sample code");
 				c.assertEqual(sample.getType().getCode(), sampleTypeCode, "Type code");
 				c.assertEqual(sample.getSpace().getCode(), "TEST", "Space code");
-				c.assertEqual(sample.getSampleProperties()[propertyTypeCode].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-2", "Sample property");
+				c.assertEqual(sample.getSampleProperties()[propertyTypeCode][0].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-2", "Sample property");
 				c.assertEqual(sample.getHistory()[0].getPropertyName(), propertyTypeCode, "Previous sample property name");
 				c.assertEqual(sample.getHistory()[0].getPropertyValue(), "20130412140147735-20", "Previous sample property value");
 			}
 
 			testUpdate(c, fCreate, fUpdate, c.findSample, fCheck);
 		});
+
+		QUnit.test("updateSamples() change multi-value property of type SAMPLE", function(assert) {
+            var c = new common(assert, openbis);
+            var propertyTypeCode = c.generateId("PROPERTY_TYPE");
+            var sampleTypeCode = c.generateId("SAMPLE_TYPE");
+            var code = c.generateId("SAMPLE");
+
+            var fCreate = function(facade) {
+                var propertyTypeCreation = new c.PropertyTypeCreation();
+                propertyTypeCreation.setCode(propertyTypeCode);
+                propertyTypeCreation.setDescription("hello");
+                propertyTypeCreation.setDataType(c.DataType.SAMPLE);
+                propertyTypeCreation.setLabel("Test Property Type");
+                propertyTypeCreation.setMultiValue(true);
+                return facade.createPropertyTypes([ propertyTypeCreation ]).then(function(results) {
+                    var assignmentCreation = new c.PropertyAssignmentCreation();
+                    assignmentCreation.setPropertyTypeId(new c.PropertyTypePermId(propertyTypeCode));
+                    var sampleTypeCreation = new c.SampleTypeCreation();
+                    sampleTypeCreation.setCode(sampleTypeCode);
+                    sampleTypeCreation.setPropertyAssignments([ assignmentCreation ]);
+                    return facade.createSampleTypes([ sampleTypeCreation ]).then(function(results) {
+                        var creation = new c.SampleCreation();
+                        creation.setTypeId(new c.EntityTypePermId(sampleTypeCode));
+                        creation.setCode(code);
+                        creation.setSpaceId(new c.SpacePermId("TEST"));
+                        creation.setProperty(propertyTypeCode, ["20130412140147735-20", "20130424134657597-433"]);
+                        return facade.createSamples([ creation ]);
+                    });
+                });
+            }
+
+            var fUpdate = function(facade, permId) {
+                var update = new c.SampleUpdate();
+                update.setSampleId(permId);
+                update.setProperty(propertyTypeCode, "20130412140147736-21");
+                return facade.updateSamples([ update ]);
+            }
+
+            var fCheck = function(sample) {
+                c.assertEqual(sample.getCode(), code, "Sample code");
+                c.assertEqual(sample.getType().getCode(), sampleTypeCode, "Type code");
+                c.assertEqual(sample.getSpace().getCode(), "TEST", "Space code");
+                c.assertEqual(sample.getSampleProperties()[propertyTypeCode][0].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-2", "Sample property");
+                var history = sample.getHistory().filter(x => x.propertyName == propertyTypeCode && x.validTo);
+                c.assertEqual(history.length, 2, "Previous sample property name");
+                c.assertEqual(history.map(x => x.propertyValue).sort().toString(), ["20130412140147735-20", "20130424134657597-433"].toString(), "Previous sample property value");
+            }
+
+            testUpdate(c, fCreate, fUpdate, c.findSample, fCheck);
+        });
 		
 		QUnit.test("updateSamples() remove property of type SAMPLE", function(assert) {
 			var c = new common(assert, openbis);
@@ -887,7 +990,7 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			var fCheck = function(dataSet) {
 				c.assertEqual(dataSet.getCode(), code, "Data set code");
 				c.assertEqual(dataSet.getType().getCode(), dataSetTypeCode, "Type code");
-				c.assertEqual(dataSet.getSampleProperties()[propertyTypeCode].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-2", "Sample property");
+				c.assertEqual(dataSet.getSampleProperties()[propertyTypeCode][0].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-2", "Sample property");
 				c.assertEqual(dataSet.getHistory()[0].getPropertyName(), propertyTypeCode, "Previous sample property name");
 				c.assertEqual(dataSet.getHistory()[0].getPropertyValue(), "20130412140147735-20", "Previous sample property value");
 
@@ -899,6 +1002,66 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 
 			testUpdate(c, fCreate, fUpdate, c.findDataSet, fCheck);
 		});
+
+		QUnit.test("updateDataSet() change multi-value property of type SAMPLE", function(assert) {
+            var c = new common(assert, openbis);
+            var propertyTypeCode = c.generateId("PROPERTY_TYPE");
+            var dataSetTypeCode = c.generateId("DATA_SET_TYPE");
+            var code = c.generateId("DATA_SET");
+
+            var fCreate = function(facade) {
+                var propertyTypeCreation = new c.PropertyTypeCreation();
+                propertyTypeCreation.setCode(propertyTypeCode);
+                propertyTypeCreation.setDescription("hello");
+                propertyTypeCreation.setDataType(c.DataType.SAMPLE);
+                propertyTypeCreation.setLabel("Test Property Type");
+                propertyTypeCreation.setMultiValue(true);
+                return facade.createPropertyTypes([ propertyTypeCreation ]).then(function(results) {
+                    var assignmentCreation = new c.PropertyAssignmentCreation();
+                    assignmentCreation.setPropertyTypeId(new c.PropertyTypePermId(propertyTypeCode));
+                    var dataSetTypeCreation = new c.DataSetTypeCreation();
+                    dataSetTypeCreation.setCode(dataSetTypeCode);
+                    dataSetTypeCreation.setPropertyAssignments([ assignmentCreation ]);
+                    return facade.createDataSetTypes([ dataSetTypeCreation ]).then(function(results) {
+                        var creation = new c.DataSetCreation();
+                        creation.setTypeId(new c.EntityTypePermId(dataSetTypeCode));
+                        creation.setCode(code);
+                        creation.setDataSetKind(c.DataSetKind.CONTAINER);
+                        creation.setDataStoreId(new c.DataStorePermId("DSS1"));
+                        creation.setExperimentId(new c.ExperimentIdentifier("/TEST/TEST-PROJECT/TEST-EXPERIMENT"));
+                        creation.setProperty(propertyTypeCode, ["20130412140147735-20", "20130424134657597-433"]);
+                        creation.setMetaData({"dataset_update":"old_value", "dataset_delete":"del_value"});
+                        return facade.createDataSets([ creation ]);
+                    });
+                });
+            }
+
+            var fUpdate = function(facade, permId) {
+                var update = new c.DataSetUpdate();
+                update.setDataSetId(permId);
+                update.setProperty(propertyTypeCode, "20130412140147736-21");
+                update.getMetaData().put("dataset_update", "new_value");
+                update.getMetaData().add({"dataset_add":"add_value"});
+                update.getMetaData().remove("dataset_delete");
+                return facade.updateDataSets([ update ]);
+            }
+
+            var fCheck = function(dataSet) {
+                c.assertEqual(dataSet.getCode(), code, "Data set code");
+                c.assertEqual(dataSet.getType().getCode(), dataSetTypeCode, "Type code");
+                c.assertEqual(dataSet.getSampleProperties()[propertyTypeCode][0].getIdentifier().getIdentifier(), "/PLATONIC/SCREENING-EXAMPLES/PLATE-2", "Sample property");
+                var history = dataSet.getHistory().filter(x => x.propertyName == propertyTypeCode && x.validTo);
+                c.assertEqual(history.length, 2, "Previous sample property name");
+                c.assertEqual(history.map(x => x.propertyValue).sort().toString(), ["20130412140147735-20", "20130424134657597-433"].toString(), "Previous sample property value");
+
+                var metaData = dataSet.getMetaData();
+                c.assertEqual(metaData["dataset_update"], "new_value", "Metadata update");
+                c.assertEqual(metaData["dataset_add"], "add_value", "Metadata add");
+                c.assertEqual(metaData["dataset_delete"], undefined, "Metadata delete");
+            }
+
+            testUpdate(c, fCreate, fUpdate, c.findDataSet, fCheck);
+        });
 		
 		QUnit.test("updateDataSets() link data set", function(assert) {
 			var c = new common(assert, openbis);