diff --git a/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-search.js b/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-search.js
index 5f78fcebfad7c6723f59e208b34e9c9c7360b9ef..991e36d851a389e93a365bc37385d95e4009df9d 100644
--- a/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-search.js
+++ b/js-test/servers/common/core-plugins/tests/1/as/webapps/openbis-v3-api-test/html/test/test-search.js
@@ -132,6 +132,26 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			testSearch(c, fSearch, fCheck);
 		});
 
+		QUnit.test("searchSpaces() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.SpaceSearchCriteria();
+				criteria.withCodes().thatIn(["TEST"]);
+				return facade.searchSpaces(criteria, c.createSpaceFetchOptions());
+			}
+			
+			var fCheck = function(facade, spaces) {
+				c.assertEqual(spaces.length, 1);
+				var space = spaces[0];
+				c.assertEqual(space.getCode(), "TEST", "Code");
+				c.assertEqual(space.getDescription(), null, "Description");
+				c.assertDate(space.getRegistrationDate(), "Registration date", 2013, 04, 12, 12, 59);
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
+		
 		QUnit.test("searchSpaces() with paging and sorting", function(assert) {
 			var c = new common(assert, openbis);
 
@@ -179,6 +199,24 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			testSearch(c, fSearch, fCheck);
 		});
 
+		QUnit.test("searchProjects() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.ProjectSearchCriteria();
+				criteria.withCodes().thatIn(["SCREENING-EXAMPLES"]);
+				return facade.searchProjects(criteria, c.createProjectFetchOptions());
+			}
+			
+			var fCheck = function(facade, projects) {
+				c.assertEqual(projects.length, 1);
+				var project = projects[0];
+				c.assertEqual(project.getCode(), "SCREENING-EXAMPLES", "Code");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
+		
 		QUnit.test("searchProjects() with paging and sorting", function(assert) {
 			var c = new common(assert, openbis);
 
@@ -230,6 +268,27 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			testSearch(c, fSearch, fCheck);
 		});
 
+		QUnit.test("searchExperiments() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.ExperimentSearchCriteria();
+				criteria.withCodes().thatIn(["EXP-1"]);
+				return facade.searchExperiments(criteria, c.createExperimentFetchOptions());
+			}
+			
+			var fCheck = function(facade, experiments) {
+				c.assertEqual(experiments.length, 1);
+				var experiment = experiments[0];
+				c.assertEqual(experiment.getCode(), "EXP-1", "Experiment code");
+				c.assertEqual(experiment.getType().getCode(), "HCS_PLATONIC", "Type code");
+				c.assertEqual(experiment.getProject().getCode(), "SCREENING-EXAMPLES", "Project code");
+				c.assertEqual(experiment.getProject().getSpace().getCode(), "PLATONIC", "Space code");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
+		
 		QUnit.test("searchExperiments() with paging and sorting", function(assert) {
 			var c = new common(assert, openbis);
 
@@ -458,6 +517,24 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 
 			testSearch(c, fSearch, fCheck);
 		});
+		
+		QUnit.test("searchSamples() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.SampleSearchCriteria();
+				criteria.withCodes().thatIn(["TEST-SAMPLE-2-PARENT"]);
+				return facade.searchSamples(criteria, c.createSampleFetchOptions());
+			}
+			
+			var fCheck = function(facade, samples) {
+				c.assertEqual(samples.length, 1);
+				var sample = samples[0];
+				c.assertEqual(sample.code, "TEST-SAMPLE-2-PARENT", "Sample code");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
 
 		QUnit.test("searchSamples() with paging and sorting", function(assert) {
 			var c = new common(assert, openbis);
@@ -902,6 +979,24 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			testSearch(c, fSearch, fCheck);
 		});
 
+		QUnit.test("searchDataSets() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.DataSetSearchCriteria();
+				criteria.withCodes().thatIn(["20130412142543232-197"]);
+				return facade.searchDataSets(criteria, c.createDataSetFetchOptions());
+			}
+			
+			var fCheck = function(facade, dataSets) {
+				c.assertEqual(dataSets.length, 1);
+				var dataSet = dataSets[0];
+				c.assertEqual(dataSet.getCode(), "20130412142543232-197", "Code");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
+		
 		QUnit.test("searchDataSets() with paging and sorting", function(assert) {
 			var c = new common(assert, openbis);
 
@@ -1266,6 +1361,24 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			testSearch(c, fSearch, fCheck);
 		});
 
+		QUnit.test("searchMaterials() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.MaterialSearchCriteria();
+				criteria.withCodes().thatIn(["H2O"]);
+				return facade.searchMaterials(criteria, c.createMaterialFetchOptions());
+			}
+			
+			var fCheck = function(facade, materials) {
+				c.assertEqual(materials.length, 1);
+				var material = materials[0];
+				c.assertEqual(material.getCode(), "H2O", "Code");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
+		
 		QUnit.test("searchMaterials() with paging and sorting", function(assert) {
 			var c = new common(assert, openbis);
 
@@ -1728,6 +1841,27 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			testSearch(c, fSearch, fCheck);
 		});
 
+		QUnit.test("searchVocabularyTerms() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.VocabularyTermSearchCriteria();
+				criteria.withCodes().thatIn(["BDS_DIRECTORY"]);
+				return facade.searchVocabularyTerms(criteria, c.createVocabularyTermFetchOptions());
+			}
+			
+			var fCheck = function(facade, terms) {
+				c.assertEqual(terms.length, 1);
+				var term = terms[0];
+				c.assertEqual(term.getCode(), "BDS_DIRECTORY", "Code");
+				c.assertEqual(term.getVocabulary().getCode(), "$STORAGE_FORMAT", "Vocabulary code");
+				c.assertEqual(term.getOrdinal(), 2, "Ordinal");
+				c.assertEqual(term.isOfficial(), true, "Official");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
+		
 		QUnit.test("searchExternalDms()", function(assert) {
 			var c = new common(assert, openbis);
 
@@ -1751,6 +1885,29 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			testSearch(c, fSearch, fCheck);
 		});
 
+		QUnit.test("searchExternalDms() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.ExternalDmsSearchCriteria();
+				criteria.withCodes().thatIn(["DMS_2"]);
+				return facade.searchExternalDataManagementSystems(criteria, c.createExternalDmsFetchOptions());
+			}
+			
+			var fCheck = function(facade, entities) {
+				c.assertEqual(entities.length, 1);
+				var edms = entities[0];
+				c.assertEqual(edms.getCode(), "DMS_2", "Code");
+				c.assertEqual(edms.getLabel(), "Test External openBIS instance", "Label");
+				c.assertEqual(edms.getAddress(), "http://www.openbis.ch/perm_id=${code}", "Address");
+				c.assertEqual(edms.getUrlTemplate(), "http://www.openbis.ch/perm_id=${code}", "URL template");
+				c.assertEqual(edms.getAddressType(), "OPENBIS", "Address type");
+				c.assertEqual(edms.isOpenbis(), true, "is openBIS?");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
+		
 		QUnit.test("searchTags()", function(assert) {
 			var c = new common(assert, openbis);
 
@@ -1770,6 +1927,25 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			testSearch(c, fSearch, fCheck);
 		});
 
+		QUnit.test("searchTags() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.TagSearchCriteria();
+				criteria.withCodes().thatIn(["JS_TEST_METAPROJECT"]);
+				return facade.searchTags(criteria, c.createTagFetchOptions());
+			}
+			
+			var fCheck = function(facade, tags) {
+				c.assertEqual(tags.length, 1);
+				var tag = tags[0];
+				c.assertEqual(tag.getCode(), "JS_TEST_METAPROJECT", "Code");
+				c.assertEqual(tag.getPermId().getPermId(), "/openbis_test_js/JS_TEST_METAPROJECT", "PermId");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
+		
 		QUnit.test("searchAuthorizationGroups()", function(assert) {
 			var c = new common(assert, openbis);
 			var code;
@@ -1795,6 +1971,31 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			testSearch(c, fSearch, fCheck);
 		});
 
+		QUnit.test("searchAuthorizationGroups() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			var code;
+			
+			var fSearch = function(facade) {
+				return c.createAuthorizationGroup(facade).then(function(permId) {
+					var criteria = new c.AuthorizationGroupSearchCriteria();
+					code = permId.getPermId();
+					criteria.withCodes().thatIn([code]);
+					return facade.searchAuthorizationGroups(criteria, c.createAuthorizationGroupFetchOptions());
+				});
+			}
+			
+			var fCheck = function(facade, groups) {
+				c.assertEqual(groups.length, 1);
+				var group = groups[0];
+				c.assertEqual(group.getCode(), code, "Code");
+				var users = group.getUsers();
+				c.assertEqual(users[0].getUserId(), "power_user", "User");
+				c.assertEqual(users.length, 1, "# Users");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
+		
 		QUnit.test("searchAuthorizationGroups() existing with role assigments", function(assert) {
 			var c = new common(assert, openbis);
 			var code;
@@ -1956,6 +2157,24 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 			testSearch(c, fSearch, fCheck);
 		});
 
+		QUnit.test("searchDataStores() with codes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.DataStoreSearchCriteria();
+				criteria.withCodes().thatIn(["DSS1"]);
+				return facade.searchDataStores(criteria, c.createDataStoreFetchOptions());
+			}
+			
+			var fCheck = function(facade, dataStores) {
+				c.assertEqual(dataStores.length, 1);
+				var dataStore = dataStores[0];
+				c.assertEqual(dataStore.getCode(), "DSS1", "Code");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
+		
 		QUnit.test("dataStoreFacade.searchFiles() atNonexistentDataStore", function(assert) {
 			var c = new common(assert, openbis);
 
@@ -2130,6 +2349,24 @@ define([ 'jquery', 'underscore', 'openbis', 'test/openbis-execute-operations', '
 
 			testSearch(c, fSearch, fCheck);
 		});
+		
+		QUnit.test("searchSemanticAnnotations() withEntityTypeCodes", function(assert) {
+			var c = new common(assert, openbis);
+			
+			var fSearch = function(facade) {
+				var criteria = new c.SemanticAnnotationSearchCriteria();
+				criteria.withEntityType().withCodes().thatIn(["PLATE"]);
+				return facade.searchSemanticAnnotations(criteria, c.createSemanticAnnotationFetchOptions());
+			}
+			
+			var fCheck = function(facade, annotations) {
+				c.assertEqual(annotations.length, 1);
+				c.assertEqual(annotations[0].getPermId().getPermId(), "ST_PLATE", "Annotation perm id");
+				c.assertEqual(annotations[0].getEntityType().getCode(), "PLATE", "Entity type code");
+			}
+			
+			testSearch(c, fSearch, fCheck);
+		});
 
 		QUnit.test("searchSemanticAnnotations() withPropertyTypeId", function(assert) {
 			var c = new common(assert, openbis);
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/authorizationgroup/SearchAuthorizationGroupExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/authorizationgroup/SearchAuthorizationGroupExecutor.java
index 170f8a59465c5d13476a755502ebd43f832d7704..b209e506f15d7bbbe61b62c80bd852a2db0313e1 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/authorizationgroup/SearchAuthorizationGroupExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/authorizationgroup/SearchAuthorizationGroupExecutor.java
@@ -24,12 +24,14 @@ import org.springframework.stereotype.Component;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.authorizationgroup.id.AuthorizationGroupPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.authorizationgroup.search.AuthorizationGroupSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.IdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.AbstractSearchObjectManuallyExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodeMatcher;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodesMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.Matcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.SimpleFieldMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.StringFieldMatcher;
@@ -70,6 +72,9 @@ public class SearchAuthorizationGroupExecutor
         } else if (criteria instanceof CodeSearchCriteria)
         {
             return new CodeMatcher<AuthorizationGroupPE>();
+        } else if (criteria instanceof CodesSearchCriteria)
+        {
+            return new CodesMatcher<AuthorizationGroupPE>();
         } else if (criteria instanceof PermIdSearchCriteria)
         {
             return new PermIdMatcher();
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/common/search/CodesMatcher.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/common/search/CodesMatcher.java
index 45501ebd988b2372d5a8ddc64bdb70e3e8766d3f..be873dda65d6581c836004ee418e53f0c4c45fc8 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/common/search/CodesMatcher.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/common/search/CodesMatcher.java
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeHolder;
 /**
  * @author pkupczyk
  */
-public class CodesMatcher<OBJECT extends ICodeHolder> extends Matcher<OBJECT>
+public class CodesMatcher<OBJECT> extends Matcher<OBJECT>
 {
 
     @Override
@@ -47,7 +47,7 @@ public class CodesMatcher<OBJECT extends ICodeHolder> extends Matcher<OBJECT>
 
         for (OBJECT object : objects)
         {
-            String code = object.getCode();
+            String code = getCodeOf(object);
             if (codes.contains(code))
             {
                 matches.add(object);
@@ -57,4 +57,9 @@ public class CodesMatcher<OBJECT extends ICodeHolder> extends Matcher<OBJECT>
         return matches;
     }
 
+    protected String getCodeOf(OBJECT object)
+    {
+        return ((ICodeHolder) object).getCode();
+    }
+
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/datastore/SearchDataStoreExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/datastore/SearchDataStoreExecutor.java
index 148c5a6d9b0d962c750ef3d19a2ebce34758aa97..ff7b80b4a09914d7df09d9b778a83feda39f0dee 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/datastore/SearchDataStoreExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/datastore/SearchDataStoreExecutor.java
@@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.IdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
@@ -30,6 +31,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.datastore.search.DataStoreSearch
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.AbstractSearchObjectManuallyExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodeMatcher;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodesMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.Matcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.SimpleFieldMatcher;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
@@ -67,6 +69,9 @@ public class SearchDataStoreExecutor extends AbstractSearchObjectManuallyExecuto
         } else if (criteria instanceof PermIdSearchCriteria || criteria instanceof CodeSearchCriteria)
         {
             return new CodeMatcher<DataStorePE>();
+        } else if (criteria instanceof CodesSearchCriteria)
+        {
+            return new CodesMatcher<DataStorePE>();
         } else
         {
             throw new IllegalArgumentException("Unknown search criteria: " + criteria.getClass());
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/SearchEntityTypeExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/SearchEntityTypeExecutor.java
index dff80b958c158a5725f4f3f99906022857e24f4a..5d074835f9d863d250d04d0336a78e083d2e6f9d 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/SearchEntityTypeExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/entity/SearchEntityTypeExecutor.java
@@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.IdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
@@ -31,6 +32,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.search.EntityTypeSear
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.AbstractSearchObjectManuallyExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodeMatcher;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodesMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.Matcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.SimpleFieldMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.dataset.IDataSetTypeAuthorizationExecutor;
@@ -92,6 +94,9 @@ public class SearchEntityTypeExecutor extends AbstractSearchObjectManuallyExecut
         } else if (criteria instanceof CodeSearchCriteria)
         {
             return new CodeMatcher<EntityTypePE>();
+        } else if (criteria instanceof CodesSearchCriteria)
+        {
+            return new CodesMatcher<EntityTypePE>();
         } else if (criteria instanceof EntityKindSearchCriteria)
         {
             return new EntityKindMatcher();
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/SearchExternalDmsExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/SearchExternalDmsExecutor.java
index dce1a90dd7bb3a5377a845f05a3503f5615dce3f..8b9147c1dc345f32b02ec4cb24832c02b5a26ee4 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/SearchExternalDmsExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/SearchExternalDmsExecutor.java
@@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.AddressSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSearchCriteria;
@@ -30,6 +31,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.LabelSearchCr
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.AbstractSearchObjectManuallyExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodeMatcher;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodesMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.Matcher;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataManagementSystemPE;
 
@@ -63,6 +65,9 @@ public class SearchExternalDmsExecutor extends AbstractSearchObjectManuallyExecu
         if (criteria instanceof CodeSearchCriteria)
         {
             return new CodeMatcher<ExternalDataManagementSystemPE>();
+        } else if (criteria instanceof CodesSearchCriteria)
+        {
+            return new CodesMatcher<ExternalDataManagementSystemPE>();
         } else if (criteria instanceof LabelSearchCriteria)
         {
             return new LabelMatcher();
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/SearchProjectExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/SearchProjectExecutor.java
index 75160dafaf13a7aedea37346cd2598ec9505063d..0dceb979804ad9d94b93a907bd63d8f794b20352 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/SearchProjectExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/project/SearchProjectExecutor.java
@@ -25,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.IdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
@@ -35,6 +36,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.search.SpaceSearchCriteria
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.AbstractSearchObjectManuallyExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodeMatcher;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodesMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.Matcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.SimpleFieldMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.StringFieldMatcher;
@@ -77,6 +79,9 @@ public class SearchProjectExecutor extends AbstractSearchObjectManuallyExecutor<
         } else if (criteria instanceof CodeSearchCriteria)
         {
             return new CodeMatcher<ProjectPE>();
+        } else if (criteria instanceof CodesSearchCriteria)
+        {
+            return new CodesMatcher<ProjectPE>();
         } else if (criteria instanceof PermIdSearchCriteria)
         {
             return new PermIdMatcher();
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/service/SearchCustomASServiceExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/service/SearchCustomASServiceExecutor.java
index ad2564987fa95deea8afc570c148b48b917a2860..364bf3bab76c24d123de7c348b73d95f93f875be 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/service/SearchCustomASServiceExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/service/SearchCustomASServiceExecutor.java
@@ -22,11 +22,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.service.CustomASService;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.service.search.CustomASServiceSearchCriteria;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.AbstractSearchObjectManuallyExecutor;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodesMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.Matcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.StringFieldMatcher;
 
@@ -63,6 +65,14 @@ public class SearchCustomASServiceExecutor extends AbstractSearchObjectManuallyE
         if (criteria instanceof CodeSearchCriteria)
         {
             return new CodeMatcher();
+        } else if (criteria instanceof CodesSearchCriteria)
+        {
+            return new CodesMatcher<CustomASService>() {
+                @Override
+                protected String getCodeOf(CustomASService object)
+                {
+                    return object.getCode().getPermId();
+                }};
         }
         throw new IllegalArgumentException("Unknown search criteria: " + criteria.getClass());
     }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/SearchSpaceExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/SearchSpaceExecutor.java
index 41020e5665190cbf463bc8f7a24c376cdc151624..2e8f8cc4692965f6567369a3a9b255de0dac8da0 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/SearchSpaceExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/space/SearchSpaceExecutor.java
@@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.IdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
@@ -30,6 +31,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.search.SpaceSearchCriteria
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.AbstractSearchObjectManuallyExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodeMatcher;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodesMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.Matcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.SimpleFieldMatcher;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
@@ -66,6 +68,9 @@ public class SearchSpaceExecutor extends AbstractSearchObjectManuallyExecutor<Sp
         } else if (criteria instanceof PermIdSearchCriteria || criteria instanceof CodeSearchCriteria)
         {
             return new CodeMatcher<SpacePE>();
+        } else if (criteria instanceof CodesSearchCriteria)
+        {
+            return new CodesMatcher<SpacePE>();
         } else
         {
             throw new IllegalArgumentException("Unknown search criteria: " + criteria.getClass());
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/SearchTagExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/SearchTagExecutor.java
index ed177f04e3ba89b5d328061e35202a0d168d3d68..956af90342b52820d60bbd3373954f8e467b1279 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/SearchTagExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/tag/SearchTagExecutor.java
@@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.IdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
@@ -30,6 +31,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.search.TagSearchCriteria;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.AbstractSearchObjectManuallyExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodeMatcher;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodesMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.Matcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.SimpleFieldMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.StringFieldMatcher;
@@ -71,6 +73,9 @@ public class SearchTagExecutor extends AbstractSearchObjectManuallyExecutor<TagS
         } else if (criteria instanceof CodeSearchCriteria)
         {
             return new CodeMatcher<MetaprojectPE>();
+        } else if (criteria instanceof CodesSearchCriteria)
+        {
+            return new CodesMatcher<MetaprojectPE>();
         } else
         {
             throw new IllegalArgumentException("Unknown search criteria: " + criteria.getClass());
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/vocabulary/SearchVocabularyTermExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/vocabulary/SearchVocabularyTermExecutor.java
index 4f7159a0d3a9ba0f46f471b79e014401c2a3ef9e..2c9f546dfe292d3e4e5ba5c2596a4a9d95ff6293 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/vocabulary/SearchVocabularyTermExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/vocabulary/SearchVocabularyTermExecutor.java
@@ -25,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.IdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
@@ -34,6 +35,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.search.VocabularyTerm
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.AbstractSearchObjectManuallyExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodeMatcher;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.CodesMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.Matcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.SimpleFieldMatcher;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.StringFieldMatcher;
@@ -79,6 +81,9 @@ public class SearchVocabularyTermExecutor extends AbstractSearchObjectManuallyEx
         } else if (criteria instanceof CodeSearchCriteria)
         {
             return new CodeMatcher<VocabularyTermPE>();
+        } else if (criteria instanceof CodesSearchCriteria)
+        {
+            return new CodesMatcher<VocabularyTermPE>();
         } else if (criteria instanceof VocabularySearchCriteria)
         {
             return new VocabularyMatcher();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/authorizationgroup/search/AuthorizationGroupSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/authorizationgroup/search/AuthorizationGroupSearchCriteria.js
index b928ae09e6a2c10635a04e9dfeb512a29c2f2bc0..ef43681ae1f71744b28550a6563b52dbf3763274 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/authorizationgroup/search/AuthorizationGroupSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/authorizationgroup/search/AuthorizationGroupSearchCriteria.js
@@ -1,4 +1,5 @@
-define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", "as/dto/common/search/PermIdSearchCriteria" ], function(require, stjs,
+define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", 
+		"as/dto/common/search/CodesSearchCriteria", "as/dto/common/search/PermIdSearchCriteria" ], function(require, stjs,
 		AbstractObjectSearchCriteria) {
 	var AuthorizationGroupSearchCriteria = function() {
 		AbstractObjectSearchCriteria.call(this);
@@ -10,6 +11,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria",
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withPermId = function() {
 			var PermIdSearchCriteria = require("as/dto/common/search/PermIdSearchCriteria");
 			return this.addCriteria(new PermIdSearchCriteria());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/search/AbstractEntitySearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/search/AbstractEntitySearchCriteria.js
index 36fb9ea3b0b2394a24cf0ee184e5f7d76f45683e..c64864cffe883850970ae667e480307afc97811e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/search/AbstractEntitySearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/common/search/AbstractEntitySearchCriteria.js
@@ -1,7 +1,7 @@
 /**
  * @author pkupczyk
  */
-define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/SearchOperator", "as/dto/common/search/CodeSearchCriteria",
+define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/SearchOperator", "as/dto/common/search/CodeSearchCriteria", "as/dto/common/search/CodesSearchCriteria",
 		"as/dto/common/search/PermIdSearchCriteria", "as/dto/common/search/RegistrationDateSearchCriteria", "as/dto/common/search/ModificationDateSearchCriteria",
 		"as/dto/common/search/NumberPropertySearchCriteria", "as/dto/tag/search/TagSearchCriteria", "as/dto/common/search/StringPropertySearchCriteria",
 		"as/dto/common/search/DatePropertySearchCriteria", "as/dto/common/search/AnyPropertySearchCriteria", "as/dto/common/search/AnyFieldSearchCriteria",
@@ -21,6 +21,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria",
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withPermId = function() {
 			var PermIdSearchCriteria = require("as/dto/common/search/PermIdSearchCriteria");
 			return this.addCriteria(new PermIdSearchCriteria());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/dataset/search/ExternalDmsSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/dataset/search/ExternalDmsSearchCriteria.js
index 7ba2a31721c3513c30e73604fc9d2b116617b6a8..7316188f553b99496248446e7ce69059c7be4ef1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/dataset/search/ExternalDmsSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/dataset/search/ExternalDmsSearchCriteria.js
@@ -1,7 +1,8 @@
 /**
  * @author pkupczyk
  */
-define([ "require", "stjs", "as/dto/common/search/AbstractCompositeSearchCriteria", "as/dto/common/search/CodeSearchCriteria", "as/dto/externaldms/search/LabelSearchCriteria",  "as/dto/externaldms/search/AddressSearchCriteria", "as/dto/externaldms/search/ExternalDmsTypeSearchCriteria"], function(require, stjs, AbstractCompositeSearchCriteria) {
+define([ "require", "stjs", "as/dto/common/search/AbstractCompositeSearchCriteria", "as/dto/common/search/CodeSearchCriteria", 
+		"as/dto/common/search/CodesSearchCriteria", "as/dto/externaldms/search/LabelSearchCriteria",  "as/dto/externaldms/search/AddressSearchCriteria", "as/dto/externaldms/search/ExternalDmsTypeSearchCriteria"], function(require, stjs, AbstractCompositeSearchCriteria) {
 	var ExternalDmsSearchCriteria = function() {
 		AbstractCompositeSearchCriteria.call(this);
 	};
@@ -12,6 +13,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractCompositeSearchCriteri
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withLabel = function() {
 			var LabelSearchCriteria = require("as/dto/externaldms/search/LabelSearchCriteria");
 			return this.addCriteria(new LabelSearchCriteria());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/datastore/search/DataStoreSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/datastore/search/DataStoreSearchCriteria.js
index 20fadd6af089bbfc6306c379128fdc1b420d1b1b..79b55a1c5075f043d85a02983ef3539ea8c817ae 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/datastore/search/DataStoreSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/datastore/search/DataStoreSearchCriteria.js
@@ -1,7 +1,8 @@
 /**
  * @author pkupczyk
  */
-define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", "as/dto/common/search/PermIdSearchCriteria" ], function(require, stjs,
+define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", 
+		"as/dto/common/search/CodesSearchCriteria", "as/dto/common/search/PermIdSearchCriteria" ], function(require, stjs,
 		AbstractObjectSearchCriteria) {
 	var DataStoreSearchCriteria = function() {
 		AbstractObjectSearchCriteria.call(this);
@@ -13,6 +14,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria",
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withPermId = function() {
 			var PermIdSearchCriteria = require("as/dto/common/search/PermIdSearchCriteria");
 			return this.addCriteria(new PermIdSearchCriteria());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/entitytype/search/EntityTypeSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/entitytype/search/EntityTypeSearchCriteria.js
index 9eadc63e395c46f066d65b938d5dee709e83a777..95419ef563b9d28e3a431383e45194445c019322 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/entitytype/search/EntityTypeSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/entitytype/search/EntityTypeSearchCriteria.js
@@ -1,5 +1,6 @@
-define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", "as/dto/entitytype/search/EntityKindSearchCriteria" ], function(require,
-		stjs, AbstractObjectSearchCriteria, CodeSearchCriteria, EntityKindSearchCriteria) {
+define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", 
+	"as/dto/common/search/CodesSearchCriteria", "as/dto/entitytype/search/EntityKindSearchCriteria" ], function(require,
+		stjs, AbstractObjectSearchCriteria, CodeSearchCriteria, CodesSearchCriteria, EntityKindSearchCriteria) {
 	var EntityTypeSearchCriteria = function() {
 		AbstractObjectSearchCriteria.call(this);
 	};
@@ -10,6 +11,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria",
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withKind = function() {
 			var EntityKindSearchCriteria = require("as/dto/entitytype/search/EntityKindSearchCriteria");
 			return this.addCriteria(new EntityKindSearchCriteria());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/externaldms/search/ExternalDmsSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/externaldms/search/ExternalDmsSearchCriteria.js
index 75b9cc2cd41f3c8c5a69604db3ef08d2b51298ac..97f512f15753c0f9f40a057013d8e6c4ab0f8525 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/externaldms/search/ExternalDmsSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/externaldms/search/ExternalDmsSearchCriteria.js
@@ -1,7 +1,10 @@
 /**
  * @author pkupczyk
  */
-define([ "require", "stjs", "as/dto/common/search/AbstractCompositeSearchCriteria", "as/dto/common/search/CodeSearchCriteria", "as/dto/externaldms/search/LabelSearchCriteria",  "as/dto/externaldms/search/AddressSearchCriteria", "as/dto/externaldms/search/ExternalDmsTypeSearchCriteria"], function(require, stjs, AbstractCompositeSearchCriteria) {
+define([ "require", "stjs", "as/dto/common/search/AbstractCompositeSearchCriteria", "as/dto/common/search/CodeSearchCriteria", 
+		"as/dto/common/search/CodesSearchCriteria", "as/dto/externaldms/search/LabelSearchCriteria",  
+		"as/dto/externaldms/search/AddressSearchCriteria", "as/dto/externaldms/search/ExternalDmsTypeSearchCriteria"], 
+	function(require, stjs, AbstractCompositeSearchCriteria) {
 	var ExternalDmsSearchCriteria = function() {
 		AbstractCompositeSearchCriteria.call(this);
 	};
@@ -12,6 +15,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractCompositeSearchCriteri
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withLabel = function() {
 			var LabelSearchCriteria = require("as/dto/externaldms/search/LabelSearchCriteria");
 			return this.addCriteria(new LabelSearchCriteria());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/project/search/ProjectSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/project/search/ProjectSearchCriteria.js
index 35cf131ef828e484b5ac070a8a8d6c3e6de623f8..a11c70d4b555d7e577a7b3610da7706bb5637777 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/project/search/ProjectSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/project/search/ProjectSearchCriteria.js
@@ -1,7 +1,8 @@
 /**
  * @author pkupczyk
  */
-define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/AbstractCompositeSearchCriteria", "as/dto/common/search/CodeSearchCriteria",
+define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/AbstractCompositeSearchCriteria", 
+		"as/dto/common/search/CodeSearchCriteria", "as/dto/common/search/CodesSearchCriteria",
 		"as/dto/common/search/PermIdSearchCriteria", "as/dto/space/search/SpaceSearchCriteria" ], function(require, stjs, AbstractObjectSearchCriteria) {
 	var ProjectSearchCriteria = function() {
 		AbstractObjectSearchCriteria.call(this);
@@ -13,6 +14,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria",
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withPermId = function() {
 			var PermIdSearchCriteria = require("as/dto/common/search/PermIdSearchCriteria");
 			return this.addCriteria(new PermIdSearchCriteria());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/service/search/CustomASServiceSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/service/search/CustomASServiceSearchCriteria.js
index 8c8dcb66704db8c58b4e28cd5829e5b89c00c9c1..ca467d11aae176ee4744f267432b6ab1aec50db5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/service/search/CustomASServiceSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/service/search/CustomASServiceSearchCriteria.js
@@ -1,4 +1,5 @@
-define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria"], 
+define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", 
+		"as/dto/common/search/CodesSearchCriteria"], 
 	function(require, stjs, AbstractObjectSearchCriteria) {
 	var CustomASServiceSearchCriteria = function() {
 		AbstractObjectSearchCriteria.call(this);
@@ -10,6 +11,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria",
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withOrOperator = function() {
 			return this.withOperator(SearchOperator.OR);
 		};
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/space/search/SpaceSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/space/search/SpaceSearchCriteria.js
index 69f39e1c921893c5a6f1c7faa63e0e34c23dcfd5..a7782f36e95434827eb33b6a60225009eb2005ad 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/space/search/SpaceSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/space/search/SpaceSearchCriteria.js
@@ -1,7 +1,8 @@
 /**
  * @author pkupczyk
  */
-define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", "as/dto/common/search/PermIdSearchCriteria",
+define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", 
+	"as/dto/common/search/CodesSearchCriteria", "as/dto/common/search/PermIdSearchCriteria",
 		"as/dto/common/search/AbstractCompositeSearchCriteria" ], function(require, stjs, AbstractObjectSearchCriteria) {
 	var SpaceSearchCriteria = function() {
 		AbstractObjectSearchCriteria.call(this);
@@ -13,6 +14,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria",
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withPermId = function() {
 			var PermIdSearchCriteria = require("as/dto/common/search/PermIdSearchCriteria");
 			return this.addCriteria(new PermIdSearchCriteria());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/tag/search/TagSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/tag/search/TagSearchCriteria.js
index 9ebf822eb067b071eb9071984d69361003889f83..525ce3e197f5b479d0fd76168fc6f55aaf36b38c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/tag/search/TagSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/tag/search/TagSearchCriteria.js
@@ -1,7 +1,8 @@
 /**
  * @author pkupczyk
  */
-define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", "as/dto/common/search/PermIdSearchCriteria",
+define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", 
+		"as/dto/common/search/CodesSearchCriteria", "as/dto/common/search/PermIdSearchCriteria",
 		"as/dto/common/search/AbstractCompositeSearchCriteria" ], function(require, stjs, AbstractObjectSearchCriteria) {
 	var TagSearchCriteria = function() {
 		AbstractObjectSearchCriteria.call(this);
@@ -13,6 +14,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria",
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withPermId = function() {
 			var PermIdSearchCriteria = require("as/dto/common/search/PermIdSearchCriteria");
 			return this.addCriteria(new PermIdSearchCriteria());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/vocabulary/search/VocabularyTermSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/vocabulary/search/VocabularyTermSearchCriteria.js
index 29140664876ba3c9998032c6d90550bc5831bf84..2940b7361a3fbfc067fb3ffd586a2bd723acde7d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/vocabulary/search/VocabularyTermSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/vocabulary/search/VocabularyTermSearchCriteria.js
@@ -1,7 +1,8 @@
 /**
  * @author pkupczyk
  */
-define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", "as/dto/common/search/PermIdSearchCriteria",
+define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria", "as/dto/common/search/CodeSearchCriteria", 
+		"as/dto/common/search/CodeSearchCriteria", "as/dto/common/search/PermIdSearchCriteria",
 		"as/dto/vocabulary/search/VocabularySearchCriteria" ], function(require, stjs, AbstractObjectSearchCriteria) {
 	var VocabularyTermSearchCriteria = function() {
 		AbstractObjectSearchCriteria.call(this);
@@ -18,6 +19,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractObjectSearchCriteria",
 			var CodeSearchCriteria = require("as/dto/common/search/CodeSearchCriteria");
 			return this.addCriteria(new CodeSearchCriteria());
 		};
+		prototype.withCodes = function() {
+			var CodesSearchCriteria = require("as/dto/common/search/CodesSearchCriteria");
+			return this.addCriteria(new CodesSearchCriteria());
+		};
 		prototype.withVocabulary = function() {
 			var VocabularySearchCriteria = require("as/dto/vocabulary/search/VocabularySearchCriteria");
 			return this.addCriteria(new VocabularySearchCriteria());
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchAuthorizationGroupTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchAuthorizationGroupTest.java
index f3218183927a21d3d0be07229ce235619bce23fb..4c8309a767fd2fbaf491a50cdcc602aa507d9f33 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchAuthorizationGroupTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchAuthorizationGroupTest.java
@@ -69,6 +69,30 @@ public class SearchAuthorizationGroupTest extends AbstractTest
         v3api.logout(sessionToken);
     }
 
+    @Test
+    public void testSearchWithCodes()
+    {
+        // Given
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        AuthorizationGroupSearchCriteria searchCriteria = new AuthorizationGroupSearchCriteria();
+        searchCriteria.withCodes().thatIn(Arrays.asList("AGROUP"));
+        AuthorizationGroupFetchOptions fetchOptions = new AuthorizationGroupFetchOptions();
+        fetchOptions.withRegistrator();
+        fetchOptions.withUsers().withSpace();
+        
+        // When
+        SearchResult<AuthorizationGroup> result = v3api.searchAuthorizationGroups(sessionToken, searchCriteria, fetchOptions);
+        
+        // Then
+        
+        AuthorizationGroup authorizationGroup = result.getObjects().get(0);
+        assertEquals(authorizationGroup.getCode(), "AGROUP");
+        assertEquals(authorizationGroup.getDescription(), "myDescription");
+        assertEquals(result.getTotalCount(), 1);
+        
+        v3api.logout(sessionToken);
+    }
+    
     @Test
     public void testSearchWithPermIdFetchingRegistrator()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java
index d1e3dc9d45bdf18303039235d759e13a4b8b6c11..185b7dc3c4871f4998558be4210911349c7e7af2 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java
@@ -19,6 +19,7 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3;
 import static org.junit.Assert.assertTrue;
 import static org.testng.Assert.assertEquals;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.testng.annotations.Test;
@@ -75,6 +76,14 @@ public class SearchDataSetTest extends AbstractDataSetTest
         testSearch(TEST_USER, criteria, "20081105092259000-18");
     }
 
+    @Test
+    public void testSearchWithCodes()
+    {
+        DataSetSearchCriteria criteria = new DataSetSearchCriteria();
+        criteria.withCodes().thatIn(Arrays.asList("20081105092259000-18", "20081105092259000-19"));
+        testSearch(TEST_USER, criteria, "20081105092259000-18", "20081105092259000-19");
+    }
+    
     @Test
     public void testSearchTwoDataSetsWithCodeAndId()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataStoreTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataStoreTest.java
index 6d67f1a1813497aebbcdb5b747f7afa66f6ba3b9..d4bdf4043a1c9b94b04d4cf8cbbd3292db6b2394 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataStoreTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataStoreTest.java
@@ -16,6 +16,7 @@
 
 package ch.ethz.sis.openbis.systemtest.asapi.v3;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.testng.annotations.Test;
@@ -137,6 +138,14 @@ public class SearchDataStoreTest extends AbstractTest
         criteriaNonMatching.withCode().thatEquals("ANDAR");
         testSearch(TEST_USER, criteriaNonMatching);
     }
+    
+    @Test
+    public void testSearchWithCodes()
+    {
+        DataStoreSearchCriteria criteria = new DataStoreSearchCriteria();
+        criteria.withCodes().thatIn(Arrays.asList("STANDARD", "BLABLA"));
+        testSearch(TEST_USER, criteria, "STANDARD");
+    }
 
     @Test
     public void testSearchWithCodeThatContains()
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExperimentTest.java
index 6f730768035cfc0b57a5c1fbb3206e4ef51893b9..16c17e2ab760db62c37659f6464b3b6d94b4dafb 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExperimentTest.java
@@ -20,6 +20,7 @@ import static org.junit.Assert.assertTrue;
 import static org.testng.Assert.assertEquals;
 
 import java.text.SimpleDateFormat;
+import java.util.Arrays;
 import java.util.List;
 import java.util.TimeZone;
 
@@ -186,6 +187,14 @@ public class SearchExperimentTest extends AbstractExperimentTest
         testSearch(TEST_USER, criteria, "/CISD/NEMO/EXP1", "/CISD/NEMO/EXP10", "/CISD/NEMO/EXP11");
     }
 
+    @Test
+    public void testSearchWithCodes()
+    {
+        ExperimentSearchCriteria criteria = new ExperimentSearchCriteria();
+        criteria.withCodes().thatIn(Arrays.asList("EXP10", "EXP11"));
+        testSearch(TEST_USER, criteria, "/CISD/NEMO/EXP10", "/CISD/NEMO/EXP11");
+    }
+
     @Test
     public void testSearchWithTypeWithIdSetToPermId()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExternalDmsTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExternalDmsTest.java
index 08623e2b2419262d8b7f6e5fce855a262a988178..7cb035d0d631a9a19d456c505a6cb0c66fe7ed5d 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExternalDmsTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchExternalDmsTest.java
@@ -20,6 +20,7 @@ import static org.hamcrest.CoreMatchers.hasItem;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.testng.Assert.assertEquals;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.testng.annotations.Test;
@@ -63,6 +64,23 @@ public class SearchExternalDmsTest extends AbstractExternalDmsTest
         assertEquals(result.get(0).getAddressType(), edms2.getAddressType());
     }
 
+    @Test
+    public void searchReturnsExternalDataManagementSystemWithCodes()
+    {
+        get(create(externalDms()));
+        ExternalDms edms2 = get(create(externalDms()));
+        
+        ExternalDmsSearchCriteria criteria = new ExternalDmsSearchCriteria();
+        criteria.withCodes().thatIn(Arrays.asList(edms2.getCode()));
+        ExternalDmsFetchOptions fetchOptions = new ExternalDmsFetchOptions();
+        List<ExternalDms> result = v3api.searchExternalDataManagementSystems(session, criteria, fetchOptions).getObjects();
+        
+        assertEquals(result.size(), 1);
+        assertEquals(result.get(0).getCode(), edms2.getCode());
+        assertEquals(result.get(0).getAddress(), edms2.getAddress());
+        assertEquals(result.get(0).getAddressType(), edms2.getAddressType());
+    }
+    
     @Test
     public void canSearchWithLabel()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchMaterialTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchMaterialTest.java
index ed61204191ae95158fcb0c1593d4c4b2455cd8f3..182c3857ef32bc9725a09c8b8370858cc523b588 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchMaterialTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchMaterialTest.java
@@ -19,6 +19,7 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3;
 import static org.junit.Assert.assertTrue;
 import static org.testng.Assert.assertEquals;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.testng.annotations.Test;
@@ -76,6 +77,14 @@ public class SearchMaterialTest extends AbstractTest
         testSearch(TEST_USER, criteria, new MaterialPermId("VIRUS1", "VIRUS"), new MaterialPermId("VIRUS2", "VIRUS"));
     }
 
+    @Test
+    public void testSearchWithCodes()
+    {
+        MaterialSearchCriteria criteria = new MaterialSearchCriteria();
+        criteria.withCodes().thatIn(Arrays.asList("VIRUS2", "VIRUS1"));
+        testSearch(TEST_USER, criteria, new MaterialPermId("VIRUS1", "VIRUS"), new MaterialPermId("VIRUS2", "VIRUS"));
+    }
+
     @Test
     public void testSearchWithTypeWithIdSetToPermId()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchProjectTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchProjectTest.java
index 1102796f28da8360da3c0d1ea28e27648a7ca29f..b2986383d0d7be4023f18169488c92b569ee0327 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchProjectTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchProjectTest.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3;
 
 import static org.testng.Assert.assertEquals;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.testng.annotations.Test;
@@ -92,6 +93,14 @@ public class SearchProjectTest extends AbstractTest
         testSearch(TEST_USER, criteria, "/TEST-SPACE/TEST-PROJECT");
     }
 
+    @Test
+    public void testSearchWithCodes()
+    {
+        ProjectSearchCriteria criteria = new ProjectSearchCriteria();
+        criteria.withCodes().thatIn(Arrays.asList("TEST-PROJECT", "TESTPROJ"));
+        testSearch(TEST_USER, criteria, "/TESTGROUP/TESTPROJ", "/TEST-SPACE/TEST-PROJECT");
+    }
+    
     @Test
     public void testSearchWithCodeThatContains()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java
index 9ac54ac764cf63c5796567c29fcb8e26309bdd3b..f7881fdd2112c9936dc8d9064014826279eba780 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java
@@ -162,6 +162,14 @@ public class SearchSampleTest extends AbstractSampleTest
         testSearch(TEST_USER, criteria, "/CISD/RP1-A2X");
     }
 
+    @Test
+    public void testSearchWithCodes()
+    {
+        SampleSearchCriteria criteria = new SampleSearchCriteria();
+        criteria.withCodes().thatIn(Arrays.asList("RP1-A2X", "RP1-B1X"));
+        testSearch(TEST_USER, criteria, "/CISD/RP1-A2X", "/CISD/RP1-B1X");
+    }
+
     @Test
     public void testSearchWithCodeThatEqualsWithStarWildcard()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTypeTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTypeTest.java
index 2eb9185a37e5db81837c5d0f555ac66398170438..7e0ffa3721347fce2ad2e21659838ca1d5f0bab9 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTypeTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTypeTest.java
@@ -400,6 +400,20 @@ public class SearchSampleTypeTest extends AbstractTest
         assertEquals(codes.toString(), "[CELL_PLATE]");
     }
 
+    @Test
+    public void testSearchWithPropertyAssignmentsWithEntityTypeWithCodes()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        SampleTypeSearchCriteria searchCriteria = new SampleTypeSearchCriteria();
+        searchCriteria.withPropertyAssignments().withEntityType().withCodes().thatIn(Arrays.asList("CELL_PLATE"));
+
+        SearchResult<SampleType> searchResult = v3api.searchSampleTypes(sessionToken, searchCriteria, new SampleTypeFetchOptions());
+
+        List<String> codes = extractCodes(searchResult.getObjects());
+        assertEquals(codes.toString(), "[CELL_PLATE]");
+    }
+
     @Test
     public void testSearchWithPropertyAssignmentsWithPropertyTypeWithIdThatEquals()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchServiceTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchServiceTest.java
index c5b846bbd228fc7077d18c816f380768aaf5ae7a..eb9de94c2bfc3e7050ca7ba26522903c0b19deb8 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchServiceTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchServiceTest.java
@@ -18,6 +18,8 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3;
 
 import static org.testng.Assert.assertEquals;
 
+import java.util.Arrays;
+
 import org.testng.annotations.Test;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult;
@@ -44,6 +46,19 @@ public class SearchServiceTest extends AbstractTest
         assertEquals(result.getTotalCount(), 1);
     }
 
+    @Test
+    public void testSearchServicesWithCodes()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        CustomASServiceSearchCriteria searchCriteria = new CustomASServiceSearchCriteria();
+        searchCriteria.withCodes().thatIn(Arrays.asList("simple-service"));
+        
+        SearchResult<CustomASService> result = v3api.searchCustomASServices(sessionToken, searchCriteria,
+                new CustomASServiceFetchOptions());
+        
+        assertEquals(result.getTotalCount(), 1);
+    }
+    
     @Test
     public void testSearchAllServicesSortedPage2()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSpaceTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSpaceTest.java
index f19e229e8d83179acfcf6b215871d864b0ff10c3..5ba0ddb40d8ad832dffd996acf0d2794beea5462 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSpaceTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSpaceTest.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3;
 
 import static org.testng.Assert.assertEquals;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.testng.annotations.Test;
@@ -98,6 +99,14 @@ public class SearchSpaceTest extends AbstractTest
         testSearch(TEST_USER, criteria, "TEST-SPACE");
     }
 
+    @Test
+    public void testSearchWithCodes()
+    {
+        SpaceSearchCriteria criteria = new SpaceSearchCriteria();
+        criteria.withCodes().thatIn(Arrays.asList("TEST-SPACE"));
+        testSearch(TEST_USER, criteria, "TEST-SPACE");
+    }
+    
     @Test
     public void testSearchWithCodeThatContains()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchTagTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchTagTest.java
index 50a5403bf593b16c7d432cec0128cba50c254b32..49c74c5bf3881a1aac3324241f93d1c5b52e34d5 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchTagTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchTagTest.java
@@ -16,6 +16,7 @@
 
 package ch.ethz.sis.openbis.systemtest.asapi.v3;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.testng.annotations.Test;
@@ -97,6 +98,14 @@ public class SearchTagTest extends AbstractTest
         testSearch(TEST_USER, criteria, "/test/TEST_METAPROJECTS");
     }
 
+    @Test
+    public void testSearchWithCodes()
+    {
+        TagSearchCriteria criteria = new TagSearchCriteria();
+        criteria.withCodes().thatIn(Arrays.asList("TEST_METAPROJECTS", "ANOTHER_TEST_METAPROJECTS"));
+        testSearch(TEST_USER, criteria, "/test/TEST_METAPROJECTS", "/test/ANOTHER_TEST_METAPROJECTS");
+    }
+    
     @Test
     public void testSearchWithCodeThatContains()
     {
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchVocabularyTermTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchVocabularyTermTest.java
index 8cb63549663fbee12209e46cd6f8d474c21026be..94f4ffc083f86c9169286c7d43f7e041ec6bc944 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchVocabularyTermTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchVocabularyTermTest.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3;
 
 import static org.testng.Assert.assertEquals;
 
+import java.util.Arrays;
 import java.util.List;
 
 import org.testng.annotations.Test;
@@ -99,6 +100,14 @@ public class SearchVocabularyTermTest extends AbstractVocabularyTermTest
         testSearch(criteria, new VocabularyTermPermId("MAN", "HUMAN"));
     }
 
+    @Test
+    public void testSearchWithCodes()
+    {
+        VocabularyTermSearchCriteria criteria = new VocabularyTermSearchCriteria();
+        criteria.withCodes().thatIn(Arrays.asList("MAN"));
+        testSearch(criteria, new VocabularyTermPermId("MAN", "HUMAN"));
+    }
+
     @Test
     public void testSearchWithCodeThatContains()
     {
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/authorizationgroup/search/AuthorizationGroupSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/authorizationgroup/search/AuthorizationGroupSearchCriteria.java
index 392497e309b841315594b2d171063fe4088b9902..c9e99d6be297988e0c54b2c76502d3154a40ec5d 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/authorizationgroup/search/AuthorizationGroupSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/authorizationgroup/search/AuthorizationGroupSearchCriteria.java
@@ -19,14 +19,13 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.authorizationgroup.search;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.authorizationgroup.id.IAuthorizationGroupId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractObjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchOperator;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 @JsonObject("as.dto.authorizationgroup.search.AuthorizationGroupSearchCriteria")
@@ -40,6 +39,11 @@ public class AuthorizationGroupSearchCriteria extends AbstractObjectSearchCriter
         return with(new CodeSearchCriteria());
     }
 
+    public CodesSearchCriteria withCodes()
+    {
+        return with(new CodesSearchCriteria());
+    }
+
     public PermIdSearchCriteria withPermId()
     {
         return with(new PermIdSearchCriteria());
@@ -63,5 +67,4 @@ public class AuthorizationGroupSearchCriteria extends AbstractObjectSearchCriter
         return builder;
     }
 
-
 }
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/search/AbstractEntitySearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/search/AbstractEntitySearchCriteria.java
index 1ee59467c8f742657f286b0f22b9c9b7138de18d..22d38d7bb6dd3bcc2261b701391909d5954ce2b8 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/search/AbstractEntitySearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/common/search/AbstractEntitySearchCriteria.java
@@ -36,6 +36,11 @@ public abstract class AbstractEntitySearchCriteria<ID extends IObjectId> extends
         return with(new CodeSearchCriteria());
     }
 
+    public CodesSearchCriteria withCodes()
+    {
+        return with(new CodesSearchCriteria());
+    }
+
     public PermIdSearchCriteria withPermId()
     {
         return with(new PermIdSearchCriteria());
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/search/ExternalDmsSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/search/ExternalDmsSearchCriteria.java
index ccb0d4cf905499a30c482ec38e43714e294b2446..22abf7688b9054325e5759d09ad9dec96b3d02fe 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/search/ExternalDmsSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/dataset/search/ExternalDmsSearchCriteria.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.search;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractObjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.id.IExternalDmsId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.AddressSearchCriteria;
@@ -39,6 +40,11 @@ public class ExternalDmsSearchCriteria extends AbstractObjectSearchCriteria<IExt
         return with(new CodeSearchCriteria());
     }
 
+    public CodesSearchCriteria withCodes()
+    {
+        return with(new CodesSearchCriteria());
+    }
+
     public LabelSearchCriteria withLabel()
     {
         return with(new LabelSearchCriteria());
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/datastore/search/DataStoreSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/datastore/search/DataStoreSearchCriteria.java
index a25cc6262bdd0de365153973687ac0c39445109a..115a4605205cd4b21b88de9ef77406a9760a1db8 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/datastore/search/DataStoreSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/datastore/search/DataStoreSearchCriteria.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.datastore.search;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractObjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchOperator;
@@ -47,6 +48,11 @@ public class DataStoreSearchCriteria extends AbstractObjectSearchCriteria<IDataS
         return with(new CodeSearchCriteria());
     }
 
+    public CodesSearchCriteria withCodes()
+    {
+        return with(new CodesSearchCriteria());
+    }
+
     public DataStoreSearchCriteria withOrOperator()
     {
         return (DataStoreSearchCriteria) withOperator(SearchOperator.OR);
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/entitytype/search/EntityTypeSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/entitytype/search/EntityTypeSearchCriteria.java
index d5df2b29bddba678b3456fb03e031a91655a2c74..39b83aed275e412b89f46221651006b9b41a0ac6 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/entitytype/search/EntityTypeSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/entitytype/search/EntityTypeSearchCriteria.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.search;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractObjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.IEntityTypeId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
@@ -35,6 +36,11 @@ public class EntityTypeSearchCriteria extends AbstractObjectSearchCriteria<IEnti
         return with(new CodeSearchCriteria());
     }
 
+    public CodesSearchCriteria withCodes()
+    {
+        return with(new CodesSearchCriteria());
+    }
+
     public EntityKindSearchCriteria withKind()
     {
         return with(new EntityKindSearchCriteria());
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/search/ProjectSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/search/ProjectSearchCriteria.java
index 4b41032df07f5c11ed97e5e5f507f621d47f7d68..9a3dc6e32382f3a0323d679f2f02cdea3621a368 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/search/ProjectSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/project/search/ProjectSearchCriteria.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.project.search;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractObjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchOperator;
@@ -43,6 +44,11 @@ public class ProjectSearchCriteria extends AbstractObjectSearchCriteria<IProject
         return with(new CodeSearchCriteria());
     }
 
+    public CodesSearchCriteria withCodes()
+    {
+        return with(new CodesSearchCriteria());
+    }
+
     public PermIdSearchCriteria withPermId()
     {
         return with(new PermIdSearchCriteria());
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/service/search/CustomASServiceSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/service/search/CustomASServiceSearchCriteria.java
index ca7eb454304b7d1a3315590f6996299a439f349a..373f0ca3cb602da3305aaa944ca6dc78a7b19c71 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/service/search/CustomASServiceSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/service/search/CustomASServiceSearchCriteria.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.service.search;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractObjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchOperator;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.service.id.ICustomASServiceId;
@@ -40,6 +41,11 @@ public class CustomASServiceSearchCriteria extends AbstractObjectSearchCriteria<
         return with(new CodeSearchCriteria());
     }
 
+    public CodesSearchCriteria withCodes()
+    {
+        return with(new CodesSearchCriteria());
+    }
+
     public CustomASServiceSearchCriteria withOrOperator()
     {
         return (CustomASServiceSearchCriteria) withOperator(SearchOperator.OR);
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/search/SpaceSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/search/SpaceSearchCriteria.java
index 3347a73a824a097b50b83f2fe717b8acf5ce72e7..0b956f592976fd2074c34de7fb790186aebb980c 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/search/SpaceSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/space/search/SpaceSearchCriteria.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.space.search;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractObjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchOperator;
@@ -42,6 +43,11 @@ public class SpaceSearchCriteria extends AbstractObjectSearchCriteria<ISpaceId>
         return with(new CodeSearchCriteria());
     }
 
+    public CodesSearchCriteria withCodes()
+    {
+        return with(new CodesSearchCriteria());
+    }
+
     public PermIdSearchCriteria withPermId()
     {
         return with(new PermIdSearchCriteria());
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/search/TagSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/search/TagSearchCriteria.java
index c74b434ecd370727ed8b1e6df1953a081499c912..0b44c41225284d2c6c7d5e5c647a9b0c6e83f71f 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/search/TagSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/tag/search/TagSearchCriteria.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.tag.search;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractObjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchOperator;
@@ -42,6 +43,11 @@ public class TagSearchCriteria extends AbstractObjectSearchCriteria<ITagId>
         return with(new CodeSearchCriteria());
     }
 
+    public CodesSearchCriteria withCodes()
+    {
+        return with(new CodesSearchCriteria());
+    }
+
     public PermIdSearchCriteria withPermId()
     {
         return with(new PermIdSearchCriteria());
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/search/VocabularyTermSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/search/VocabularyTermSearchCriteria.java
index 329ac2b896f6309acee3acbb03c08855a9efa2d6..0a5df7446d64d487cfca203e588d2384af70756c 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/search/VocabularyTermSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/vocabulary/search/VocabularyTermSearchCriteria.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.search;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractObjectSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.PermIdSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchOperator;
@@ -47,6 +48,11 @@ public class VocabularyTermSearchCriteria extends AbstractObjectSearchCriteria<I
         return with(new CodeSearchCriteria());
     }
 
+    public CodesSearchCriteria withCodes()
+    {
+        return with(new CodesSearchCriteria());
+    }
+
     public VocabularySearchCriteria withVocabulary()
     {
         return with(new VocabularySearchCriteria());