diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/method/SearchObjectKindModificationMethodExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/method/SearchObjectKindModificationMethodExecutor.java
index a6192e68a47682f06b5acc0e062bd373f19076c8..4981fffcc8c3ea464278e482c7118a4e59a35b9a 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/method/SearchObjectKindModificationMethodExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/method/SearchObjectKindModificationMethodExecutor.java
@@ -24,18 +24,19 @@ import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.ObjectKind;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.ObjectKindModification;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.OperationKind;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.fetchoptions.ObjectKindModificationFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.search.ObjectKindCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.search.ObjectKindModificationSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.search.OperationKindCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LastModificationState;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 @Component
@@ -62,27 +63,57 @@ public class SearchObjectKindModificationMethodExecutor implements ISearchObject
                 objectKindModification.setLastModificationTimeStamp(date);
                 objectKindModification.setFetchOptions(fetchOptions);
                 result.add(objectKindModification);
-            } 
+            }
         }
         return new SearchResult<>(result, result.size());
     }
-    
-    private List<ObjectKind> getObjectKinds(ObjectKindModificationSearchCriteria searchCriteria)
+
+    private List<ObjectKind> getObjectKinds(ObjectKindModificationSearchCriteria criteria)
     {
-        List<ObjectKind> objectKinds = searchCriteria.getObjectKinds();
-        return objectKinds == null || objectKinds.isEmpty() ? Arrays.asList(ObjectKind.values()) : objectKinds;
+        ObjectKindCriteria lastCriteria = null;
+
+        for (ISearchCriteria subCriteria : criteria.getCriteria())
+        {
+            if (subCriteria instanceof ObjectKindCriteria)
+            {
+                lastCriteria = (ObjectKindCriteria) subCriteria;
+            }
+        }
+
+        if (lastCriteria == null || lastCriteria.getObjectKinds() == null || lastCriteria.getObjectKinds().isEmpty())
+        {
+            return Arrays.asList(ObjectKind.values());
+        } else
+        {
+            return lastCriteria.getObjectKinds();
+        }
     }
-    
-    private List<OperationKind> getOperationKinds(ObjectKindModificationSearchCriteria searchCriteria)
+
+    private List<OperationKind> getOperationKinds(ObjectKindModificationSearchCriteria criteria)
     {
-        List<OperationKind> operationKinds = searchCriteria.getOperationKinds();
-        return operationKinds == null || operationKinds.isEmpty() ? Arrays.asList(OperationKind.values()) : operationKinds;
+        OperationKindCriteria lastCriteria = null;
+
+        for (ISearchCriteria subCriteria : criteria.getCriteria())
+        {
+            if (subCriteria instanceof OperationKindCriteria)
+            {
+                lastCriteria = (OperationKindCriteria) subCriteria;
+            }
+        }
+
+        if (lastCriteria == null || lastCriteria.getOperationKinds() == null || lastCriteria.getOperationKinds().isEmpty())
+        {
+            return Arrays.asList(OperationKind.values());
+        } else
+        {
+            return lastCriteria.getOperationKinds();
+        }
     }
-    
+
     private DatabaseModificationKind translate(ObjectKind objectKind, OperationKind operationKind)
     {
-        ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind translatedObjectKind 
-                = DatabaseModificationKind.ObjectKind.valueOf(objectKind.name());
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind translatedObjectKind =
+                DatabaseModificationKind.ObjectKind.valueOf(objectKind.name());
         switch (operationKind)
         {
             case CREATE_OR_DELETE:
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchObjectKindModificationTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchObjectKindModificationTest.java
index 619ee133d94919e6afb41d5eac7de73cd387a7c7..955b9614087813d4c040f0843355313eca1c9f7d 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchObjectKindModificationTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchObjectKindModificationTest.java
@@ -36,8 +36,6 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectIdentifier;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.update.ProjectUpdate;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class SearchObjectKindModificationTest extends AbstractTest
@@ -47,13 +45,12 @@ public class SearchObjectKindModificationTest extends AbstractTest
     {
         ObjectKindModificationSearchCriteria searchCriteria = new ObjectKindModificationSearchCriteria();
         ObjectKindModificationFetchOptions fetchOptions = new ObjectKindModificationFetchOptions();
-        
-        SearchResult<ObjectKindModification> searchResult 
-                = v3api.searchObjectKindModifications(systemSessionToken, searchCriteria, fetchOptions);
-        
+
+        SearchResult<ObjectKindModification> searchResult = v3api.searchObjectKindModifications(systemSessionToken, searchCriteria, fetchOptions);
+
         assertEquals(searchResult.getTotalCount(), ObjectKind.values().length * OperationKind.values().length);
     }
-    
+
     @Test
     public void testSearchForProjectModifications()
     {
@@ -64,13 +61,12 @@ public class SearchObjectKindModificationTest extends AbstractTest
         projectUpdate.setDescription("time stamp: " + date);
         v3api.updateProjects(systemSessionToken, Arrays.asList(projectUpdate));
         ObjectKindModificationSearchCriteria searchCriteria = new ObjectKindModificationSearchCriteria();
-        searchCriteria.withObjectKinds(ObjectKind.PROJECT, ObjectKind.SAMPLE);
-        searchCriteria.withOperationKinds(OperationKind.UPDATE);
+        searchCriteria.withObjectKind().thatIn(ObjectKind.PROJECT, ObjectKind.SAMPLE);
+        searchCriteria.withOperationKind().thatIn(OperationKind.UPDATE);
         ObjectKindModificationFetchOptions fetchOptions = new ObjectKindModificationFetchOptions();
-        
-        SearchResult<ObjectKindModification> searchResult 
-                = v3api.searchObjectKindModifications(systemSessionToken, searchCriteria, fetchOptions);
-        
+
+        SearchResult<ObjectKindModification> searchResult = v3api.searchObjectKindModifications(systemSessionToken, searchCriteria, fetchOptions);
+
         assertEquals(searchResult.getTotalCount(), 2);
         List<ObjectKindModification> modifications = searchResult.getObjects();
         for (ObjectKindModification modification : modifications)
@@ -79,11 +75,11 @@ public class SearchObjectKindModificationTest extends AbstractTest
             ObjectKind objectKind = modification.getObjectKind();
             if (objectKind == ObjectKind.SAMPLE)
             {
-                assertTrue(lastModificationTimeStamp.getTime() < date.getTime(), 
+                assertTrue(lastModificationTimeStamp.getTime() < date.getTime(),
                         "Expected date (" + date + ") >= " + modification);
             } else if (objectKind == ObjectKind.PROJECT)
             {
-                assertTrue(lastModificationTimeStamp.getTime() >= date.getTime(), 
+                assertTrue(lastModificationTimeStamp.getTime() >= date.getTime(),
                         "Expected date (" + date + ") < " + modification);
             } else
             {
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/objectkindmodification/search/ObjectKindCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/objectkindmodification/search/ObjectKindCriteria.java
new file mode 100644
index 0000000000000000000000000000000000000000..3b3f73f4a490569b3fcba829f4c2ac42ef6bbba8
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/objectkindmodification/search/ObjectKindCriteria.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2016 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.search;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.ObjectKind;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+
+/**
+ * @author pkupczyk
+ */
+@JsonObject("as.dto.objectkindmodification.search.ObjectKindCriteria")
+public class ObjectKindCriteria extends AbstractSearchCriteria
+{
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty
+    private List<ObjectKind> objectKinds;
+
+    public void thatIn(List<ObjectKind> kinds)
+    {
+        this.objectKinds = kinds;
+    }
+
+    public void thatIn(ObjectKind... kinds)
+    {
+        this.objectKinds = Arrays.asList(kinds);
+    }
+
+    public List<ObjectKind> getObjectKinds()
+    {
+        return objectKinds;
+    }
+
+    @Override
+    public String toString()
+    {
+        return "with object kinds " + objectKinds;
+    }
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/objectkindmodification/search/ObjectKindModificationSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/objectkindmodification/search/ObjectKindModificationSearchCriteria.java
index 2aeaa605af0ba01827b21cd5f02b91a66147c76c..e2d3d6ce903c8155345aa56394573a22a7f4334a 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/objectkindmodification/search/ObjectKindModificationSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/objectkindmodification/search/ObjectKindModificationSearchCriteria.java
@@ -16,46 +16,35 @@
 
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.search;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.ObjectKind;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.OperationKind;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractCompositeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
 /**
  * @author Franz-Josef Elmer
  */
 @JsonObject("as.dto.objectkindmodification.search.ObjectKindModificationSearchCriteria")
-public class ObjectKindModificationSearchCriteria implements ISearchCriteria
+public class ObjectKindModificationSearchCriteria extends AbstractCompositeSearchCriteria
 {
-    private List<ObjectKind> objectKinds = new ArrayList<>();
-
-    private List<OperationKind> operationKinds = new ArrayList<>();
 
     private static final long serialVersionUID = 1L;
 
-    public ObjectKindModificationSearchCriteria withObjectKinds(ObjectKind... someObjectKinds)
+    public ObjectKindCriteria withObjectKind()
     {
-        this.objectKinds.addAll(Arrays.asList(someObjectKinds));
-        return this;
+        return with(new ObjectKindCriteria());
     }
 
-    public ObjectKindModificationSearchCriteria withOperationKinds(OperationKind... someOperationKinds)
+    public OperationKindCriteria withOperationKind()
     {
-        this.operationKinds.addAll(Arrays.asList(someOperationKinds));
-        return this;
+        return with(new OperationKindCriteria());
     }
 
-    public List<ObjectKind> getObjectKinds()
+    @Override
+    protected SearchCriteriaToStringBuilder createBuilder()
     {
-        return objectKinds;
+        SearchCriteriaToStringBuilder builder = super.createBuilder();
+        builder.setName("OBJECT_KIND_MODIFICATION_SEARCH");
+        return builder;
     }
 
-    public List<OperationKind> getOperationKinds()
-    {
-        return operationKinds;
-    }
 }
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/objectkindmodification/search/OperationKindCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/objectkindmodification/search/OperationKindCriteria.java
new file mode 100644
index 0000000000000000000000000000000000000000..99b2d495145a411715d2a92e7d4119d5f143e079
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/objectkindmodification/search/OperationKindCriteria.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2016 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.search;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.objectkindmodification.OperationKind;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+
+/**
+ * @author pkupczyk
+ */
+@JsonObject("as.dto.objectkindmodification.search.OperationKindCriteria")
+public class OperationKindCriteria extends AbstractSearchCriteria
+{
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty
+    private List<OperationKind> operationKinds;
+
+    public void thatIn(List<OperationKind> kinds)
+    {
+        this.operationKinds = kinds;
+    }
+
+    public void thatIn(OperationKind... kinds)
+    {
+        this.operationKinds = Arrays.asList(kinds);
+    }
+
+    public List<OperationKind> getOperationKinds()
+    {
+        return operationKinds;
+    }
+
+    @Override
+    public String toString()
+    {
+        return "with operation kinds " + operationKinds;
+    }
+}
diff --git a/openbis_api/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/dictionary.txt b/openbis_api/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/dictionary.txt
index 1479533843f81df72cef3c5cde8845c909c0280b..00b85cd3ef28cea7d249792d0fa221e035955aa3 100644
--- a/openbis_api/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/dictionary.txt
+++ b/openbis_api/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/dictionary.txt
@@ -936,8 +936,10 @@ search Object Kind Modifications
 set Last Modification Time Stamp
 set Object Kind
 set Operation Kind
-with Object Kinds
-with Operation Kinds
+with Object Kind
+with Operation Kind
+ObjectKindCriteria
+OperationKindCriteria
 
 AUTHORIZATION_GROUP
 CREATE_OR_DELETE
@@ -990,7 +992,6 @@ setRegistratorEmail
 withDataSetUsing
 withMaterial
 withMaterialUsing
-withObjectKind
 withText
 getDataProducer
 getDataProductionDate