diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
index 1eaf9fd04e9b9d02c3e2bc62614ef98c75f0794a..6e8c085918908b96777eabb884ba08778e7065cf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
@@ -424,29 +424,31 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
     /**
      * Find the data set type objects specified by the dataSetTypeCodes.
      * 
-     * @return A set of DataSetTypePE objects or null if all data set types are explicitly
-     *         specified.
+     * @return A set of DataSetTypePE objects.
      */
     private Set<DataSetTypePE> extractDatasetTypes(String[] dataSetTypeCodes,
             DatastoreServiceDescription serviceDescription)
     {
-        // "*" means accept all data set types
-        if (dataSetTypeCodes.length == 1 && "*".equals(dataSetTypeCodes[0]))
-        {
-            return null;
-        }
         Set<DataSetTypePE> dataSetTypes = new HashSet<DataSetTypePE>();
         Set<String> missingCodes = new HashSet<String>();
         IDataSetTypeDAO dataSetTypeDAO = daoFactory.getDataSetTypeDAO();
+        List<DataSetTypePE> allDataSetTypes = dataSetTypeDAO.listAllEntities();
+
         for (String dataSetTypeCode : dataSetTypeCodes)
         {
-            DataSetTypePE datasetType = dataSetTypeDAO.tryToFindDataSetTypeByCode(dataSetTypeCode);
-            if (datasetType == null)
+            boolean found = false;
+            // Try to find the specified data set type
+            for (DataSetTypePE dataSetType : allDataSetTypes)
             {
-                missingCodes.add(dataSetTypeCode);
-            } else
+                if (dataSetType.getCode().matches(dataSetTypeCode))
+                {
+                    dataSetTypes.add(dataSetType);
+                    found = true;
+                }
+            }
+            if (false == found)
             {
-                dataSetTypes.add(datasetType);
+                missingCodes.add(dataSetTypeCode);
             }
         }
         if (missingCodes.size() > 0)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataStoreServicePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataStoreServicePE.java
index d37a9db635c380f0c1e49e738162a5ea6d78ce23..8f3e2a3e7d29e2b368b3d1a82df1d3c8f7ed485f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataStoreServicePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataStoreServicePE.java
@@ -71,7 +71,7 @@ public class DataStoreServicePE implements Serializable
 
     private DataStorePE dataStore;
 
-    // which types of datasets can be processed by this plugin? If null, all types are appropriate.
+    // which types of datasets can be processed by this plugin?
     private Set<DataSetTypePE> datasetTypes;
 
     @SuppressWarnings("unused")
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
index 69e03816c387110e7fac3b7644a575d160c05133..374b9bcbfbc5ce1094b0c54875dc5338e9b038a5 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
@@ -80,6 +80,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetShareId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServerInfo;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServicePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatastoreServiceDescriptions;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
@@ -298,15 +299,37 @@ public class ETLServiceTest extends AbstractServerTestCase
 
     private void prepareFindDatasetTypes(Expectations exp)
     {
-        exp.allowing(dataSetTypeDAO).tryToFindDataSetTypeByCode(DATA_SET_TYPE_CODE);
-        exp.will(Expectations.returnValue(new DataSetTypePE()));
-        exp.allowing(dataSetTypeDAO).tryToFindDataSetTypeByCode(UNKNOWN_DATA_SET_TYPE_CODE);
-        exp.will(Expectations.returnValue(null));
+        ArrayList<DataSetTypePE> allDataSetTypes = getAllDataSetTypes();
+
+        exp.allowing(dataSetTypeDAO).listAllEntities();
+        exp.will(Expectations.returnValue(allDataSetTypes));
+    }
+
+    protected ArrayList<DataSetTypePE> getAllDataSetTypes()
+    {
+        // Prepare the collection of data set types
+        DataSetTypePE dataSetType;
+        ArrayList<DataSetTypePE> allDataSetTypes = new ArrayList<DataSetTypePE>();
+
+        dataSetType = new DataSetTypePE();
+        dataSetType.setCode(DATA_SET_TYPE_CODE);
+        allDataSetTypes.add(dataSetType);
+
+        dataSetType = new DataSetTypePE();
+        dataSetType.setCode("dataSetTypeCode2");
+        allDataSetTypes.add(dataSetType);
+
+        dataSetType = new DataSetTypePE();
+        dataSetType.setCode("differentPrefix");
+        allDataSetTypes.add(dataSetType);
+        return allDataSetTypes;
     }
 
     @Test
     public void testRegisterDataStoreServerAgain()
     {
+        final String reportingPluginTypes = ".*";
+        final String processingPluginTypes = "dataSet.*";
         prepareGetSession();
         prepareGetVersion();
         context.checking(new Expectations()
@@ -334,20 +357,72 @@ public class ETLServiceTest extends AbstractServerTestCase
                                         if (item instanceof DataStorePE)
                                         {
                                             DataStorePE store = (DataStorePE) item;
-                                            return DSS_CODE.equals(store.getCode())
-                                                    && URL.equals(store.getRemoteUrl())
-                                                    && DOWNLOAD_URL.equals(store.getDownloadUrl())
-                                                    && DSS_SESSION_TOKEN.equals(store
-                                                            .getSessionToken());
+                                            boolean basicMatch =
+                                                    DSS_CODE.equals(store.getCode())
+                                                            && URL.equals(store.getRemoteUrl())
+                                                            && DOWNLOAD_URL.equals(store
+                                                                    .getDownloadUrl())
+                                                            && DSS_SESSION_TOKEN.equals(store
+                                                                    .getSessionToken());
+                                            // To workaround a hibernate bug, data stores are once
+                                            // registered with no services
+                                            if (false == basicMatch
+                                                    || store.getServices().isEmpty())
+                                            {
+                                                return basicMatch;
+                                            }
+
+                                            for (DataStoreServicePE service : store.getServices())
+                                            {
+                                                // Check that the types found match those specified
+                                                if (service.getKind() == DataStoreServiceKind.PROCESSING)
+                                                {
+                                                    // expect 2 matches
+                                                    if (false == isDataSetTypeMatch(service,
+                                                            processingPluginTypes, 2))
+                                                    {
+                                                        return false;
+                                                    }
+                                                }
+                                                if (service.getKind() == DataStoreServiceKind.QUERIES)
+                                                {
+                                                    // expect 3 matches
+                                                    if (false == isDataSetTypeMatch(service,
+                                                            reportingPluginTypes, 3))
+                                                    {
+                                                        return false;
+                                                    }
+                                                }
+                                            }
+
+                                            return true;
                                         }
                                         return false;
                                     }
 
+                                    private boolean isDataSetTypeMatch(DataStoreServicePE service,
+                                            String typeRegex, int numberExpected)
+                                    {
+                                        Set<DataSetTypePE> datasetTypes = service.getDatasetTypes();
+                                        if (datasetTypes.isEmpty())
+                                        {
+                                            return false;
+                                        }
+                                        for (DataSetTypePE types : datasetTypes)
+                                        {
+                                            if (false == types.getCode().matches(typeRegex))
+                                            {
+                                                return false;
+                                            }
+                                        }
+                                        return datasetTypes.size() == numberExpected;
+                                    }
+
                                 }));
                 }
             });
-
-        createService().registerDataStoreServer(SESSION_TOKEN, createDSSInfo());
+        createService().registerDataStoreServer(SESSION_TOKEN,
+                createDSSInfoWithWildcards(reportingPluginTypes, processingPluginTypes));
 
         context.assertIsSatisfied();
     }
@@ -1366,6 +1441,26 @@ public class ETLServiceTest extends AbstractServerTestCase
         return info;
     }
 
+    private DataStoreServerInfo createDSSInfoWithWildcards(String reportingPluginTypes,
+            String processingPluginTypes)
+    {
+        DataStoreServerInfo info = new DataStoreServerInfo();
+        info.setPort(PORT);
+        info.setSessionToken(DSS_SESSION_TOKEN);
+        info.setDataStoreCode(DSS_CODE);
+        info.setDownloadUrl(DOWNLOAD_URL);
+        List<DatastoreServiceDescription> reporting =
+                Arrays.asList(createDataStoreServiceForWildcardTypes(DataStoreServiceKind.QUERIES,
+                        "reporting", reportingPluginTypes));
+        List<DatastoreServiceDescription> processing =
+                Arrays.asList(createDataStoreServiceForWildcardTypes(
+                        DataStoreServiceKind.PROCESSING, "processing", processingPluginTypes));
+        DatastoreServiceDescriptions services =
+                new DatastoreServiceDescriptions(reporting, processing);
+        info.setServicesDescriptions(services);
+        return info;
+    }
+
     @SuppressWarnings("deprecation")
     private static DatastoreServiceDescription createDataStoreService(
             DataStoreServiceKind serviceKind, String key)
@@ -1375,6 +1470,15 @@ public class ETLServiceTest extends AbstractServerTestCase
             { DATA_SET_TYPE_CODE, UNKNOWN_DATA_SET_TYPE_CODE }, key, serviceKind);
     }
 
+    @SuppressWarnings("deprecation")
+    private static DatastoreServiceDescription createDataStoreServiceForWildcardTypes(
+            DataStoreServiceKind serviceKind, String key, String regex)
+    {
+        // wildcards should be handled correctly
+        return new DatastoreServiceDescription(key, key, new String[]
+            { regex }, key, serviceKind);
+    }
+
     private void assignRoles(PersonPE person)
     {
         final Set<RoleAssignmentPE> list = new HashSet<RoleAssignmentPE>();