diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/ISearchExternalDmsExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/ISearchExternalDmsExecutor.java
index 1ce2ad75dbbcd1a8a9e6e185d37a59b231d78d25..8025a531f28684d2dea6ddbfa50da851cc150b2e 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/ISearchExternalDmsExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/ISearchExternalDmsExecutor.java
@@ -18,11 +18,12 @@ package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.externaldms;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSearchCriteria;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.ISearchObjectExecutor;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataManagementSystemPE;
 
 /**
  * @author pkupczyk
  */
-public interface ISearchExternalDmsExecutor extends ISearchObjectExecutor<ExternalDmsSearchCriteria, Long>
+public interface ISearchExternalDmsExecutor extends ISearchObjectExecutor<ExternalDmsSearchCriteria, ExternalDataManagementSystemPE>
 {
 
 }
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 62085f560ad7a086ee42d69270dad68d71255f40..ee6ff796a8ffcc1a50a6ec9ae887cc35720e17d9 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
@@ -16,23 +16,25 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.externaldms;
 
-import java.util.ArrayList;
 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.CodeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSearchCriteria;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.AbstractSearchObjectExecutor;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
+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.Matcher;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataManagementSystemPE;
 
 /**
  * @author pkupczyk
  */
 @Component
-public class SearchExternalDmsExecutor extends AbstractSearchObjectExecutor<ExternalDmsSearchCriteria, Long> implements
+public class SearchExternalDmsExecutor extends AbstractSearchObjectManuallyExecutor<ExternalDmsSearchCriteria, ExternalDataManagementSystemPE> implements
         ISearchExternalDmsExecutor
 {
 
@@ -40,16 +42,27 @@ public class SearchExternalDmsExecutor extends AbstractSearchObjectExecutor<Exte
     private IExternalDmsAuthorizationExecutor authorizationExecutor;
 
     @Override
-    protected List<Long> doSearch(IOperationContext context, DetailedSearchCriteria criteria)
+    public List<ExternalDataManagementSystemPE> search(IOperationContext context, ExternalDmsSearchCriteria criteria)
     {
         authorizationExecutor.canSearch(context);
-        List<ExternalDataManagementSystemPE> list =
-                daoFactory.getExternalDataManagementSystemDAO().listExternalDataManagementSystems();
-        List<Long> ids = new ArrayList<>();
-        for (ExternalDataManagementSystemPE edms : list)
+        return super.search(context, criteria);
+    }
+    
+    @Override
+    protected List<ExternalDataManagementSystemPE> listAll()
+    {
+        return daoFactory.getExternalDataManagementSystemDAO().listExternalDataManagementSystems();
+    }
+
+    @Override
+    protected Matcher<ExternalDataManagementSystemPE> getMatcher(ISearchCriteria criteria)
+    {
+        if (criteria instanceof CodeSearchCriteria)
+        {
+            return new CodeMatcher<ExternalDataManagementSystemPE>();
+        } else
         {
-            ids.add(edms.getId());
+            throw new IllegalArgumentException("Unknown search criteria: " + criteria.getClass());
         }
-        return ids;
     }
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/SearchExternalDmsOperationExecutor.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/SearchExternalDmsOperationExecutor.java
index c3d9241b9f348078153f36e6e217b4b9cd72ba4a..6367d4bee7ff7b830af67e1f76ec32a9d50a0a21 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/SearchExternalDmsOperationExecutor.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/externaldms/SearchExternalDmsOperationExecutor.java
@@ -28,16 +28,17 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSe
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.SearchExternalDmsOperation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.SearchExternalDmsOperationResult;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.ISearchObjectExecutor;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.SearchObjectsOperationExecutor;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.search.SearchObjectsPEOperationExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.translator.ITranslator;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.translator.externaldms.IExternalDmsTranslator;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataManagementSystemPE;
 
 /**
  * @author pkupczyk
  */
 @Component
 public class SearchExternalDmsOperationExecutor
-        extends SearchObjectsOperationExecutor<ExternalDms, Long, ExternalDmsSearchCriteria, ExternalDmsFetchOptions>
+        extends SearchObjectsPEOperationExecutor<ExternalDms, ExternalDataManagementSystemPE, ExternalDmsSearchCriteria, ExternalDmsFetchOptions>
         implements ISearchExternalDmsOperationExecutor
 {
 
@@ -54,7 +55,7 @@ public class SearchExternalDmsOperationExecutor
     }
 
     @Override
-    protected ISearchObjectExecutor<ExternalDmsSearchCriteria, Long> getExecutor()
+    protected ISearchObjectExecutor<ExternalDmsSearchCriteria, ExternalDataManagementSystemPE> getExecutor()
     {
         return searchExecutor;
     }
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 52e2226a96c18eae9803dec347558223e5adf86b..5afd5bbfe286468f4b5970ebb55ee35a45a199be 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
@@ -18,7 +18,11 @@ package ch.ethz.sis.openbis.systemtest.asapi.v3;
 
 import static org.hamcrest.CoreMatchers.hasItem;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.testng.Assert.assertEquals;
 
+import java.util.List;
+
+import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult;
@@ -41,4 +45,21 @@ public class SearchExternalDmsTest extends AbstractExternalDmsTest
         assertThat(result.getObjects(), hasItem(isSimilarTo(edms1)));
         assertThat(result.getObjects(), hasItem(isSimilarTo(edms2)));
     }
+    
+    @Test
+    public void searchReturnsSpecifiedExternalDataManagementSystem()
+    {
+        get(create(externalDms()));
+        ExternalDms edms2 = get(create(externalDms()));
+        
+        ExternalDmsSearchCriteria criteria = new ExternalDmsSearchCriteria();
+        criteria.withCode().thatEquals(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());
+    }
 }