diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/DssServiceRpcScreeningBatchResults.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/DssServiceRpcScreeningBatchResults.java
new file mode 100644
index 0000000000000000000000000000000000000000..059e43a4aa9354371dc4eb1b6cf7827bde05c1d2
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/DssServiceRpcScreeningBatchResults.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2013 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.systemsx.cisd.openbis.dss.screening.shared.api.internal;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author pkupczyk
+ */
+public class DssServiceRpcScreeningBatchResults<T> implements
+        IDssServiceRpcScreeningBatchResults<T>
+{
+
+    private Map<String, List<T>> dssResultsMap = new LinkedHashMap<String, List<T>>();
+
+    public void addDataStoreResults(String dssUrl, List<T> dssResults)
+    {
+        dssResultsMap.put(dssUrl, dssResults);
+    }
+
+    @Override
+    public List<T> withDuplicates()
+    {
+        List<T> results = new ArrayList<T>();
+
+        for (List<T> dssResults : dssResultsMap.values())
+        {
+            if (dssResults != null)
+            {
+                results.addAll(dssResults);
+            }
+        }
+
+        return results;
+    }
+
+    @Override
+    public List<T> withoutDuplicates()
+    {
+        Set<T> results = new LinkedHashSet<T>();
+
+        for (List<T> dssResults : dssResultsMap.values())
+        {
+            if (dssResults != null)
+            {
+                results.addAll(dssResults);
+            }
+        }
+
+        return new ArrayList<T>(results);
+    }
+
+}
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/DssServiceRpcScreeningMultiplexer.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/DssServiceRpcScreeningMultiplexer.java
index 15ad531ee37269475cdf94270f1edbda57aff51b..abb4ca95d43989e6730b5d7509704db582c3f372 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/DssServiceRpcScreeningMultiplexer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/DssServiceRpcScreeningMultiplexer.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.dss.screening.shared.api.internal;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -49,61 +50,114 @@ public class DssServiceRpcScreeningMultiplexer implements IDssServiceRpcScreenin
     }
 
     @Override
-    public <R extends IDatasetIdentifier, V> List<V> process(final List<? extends R> references,
-            final IDssServiceRpcScreeningBatchHandler<R, V> handler)
+    public <R extends IDatasetIdentifier, V> DssServiceRpcScreeningBatchResults<V> process(
+            final List<? extends R> references,
+            final IDssServiceRpcScreeningBatchHandler<R, V> batchHandler)
     {
-        Map<String, List<R>> referencesPerDss = getReferencesPerDss(cast(references));
-        List<ITerminableFuture<List<V>>> dssFutures = new ArrayList<ITerminableFuture<List<V>>>();
-        final long callMillis = System.currentTimeMillis();
+        Map<String, List<R>> referencesPerDataStore = getReferencesPerDataStore(cast(references));
 
-        for (Entry<String, List<R>> entry : referencesPerDss.entrySet())
+        Map<String, ITerminableFuture<List<V>>> futuresPerDataStore =
+                submitReferencesToDataStores(referencesPerDataStore, batchHandler);
+
+        return gatherResultsFromDataStores(futuresPerDataStore);
+    }
+
+    public static <R extends IDatasetIdentifier> Map<String, List<R>> getReferencesPerDataStore(
+            final List<R> references)
+    {
+        HashMap<String, List<R>> referencesPerDataStore = new HashMap<String, List<R>>();
+
+        if (references != null)
+        {
+            for (R reference : references)
+            {
+                if (reference != null)
+                {
+                    String dataStoreUrl = reference.getDatastoreServerUrl();
+                    if (dataStoreUrl != null)
+                    {
+                        List<R> dataStoreReferences = referencesPerDataStore.get(dataStoreUrl);
+                        if (dataStoreReferences == null)
+                        {
+                            dataStoreReferences = new ArrayList<R>();
+                            referencesPerDataStore.put(dataStoreUrl, dataStoreReferences);
+                        }
+                        dataStoreReferences.add(reference);
+                    }
+                }
+            }
+        }
+
+        return referencesPerDataStore;
+    }
+
+    private <R extends IDatasetIdentifier, V> Map<String, ITerminableFuture<List<V>>> submitReferencesToDataStores(
+            final Map<String, List<R>> referencesPerDataStore,
+            final IDssServiceRpcScreeningBatchHandler<R, V> batchHandler)
+    {
+        Map<String, ITerminableFuture<List<V>>> futuresPerDataStore =
+                new LinkedHashMap<String, ITerminableFuture<List<V>>>();
+        final long submitTime = System.currentTimeMillis();
+
+        for (Entry<String, List<R>> referencePerDataStore : referencesPerDataStore.entrySet())
         {
-            final String dssUrl = entry.getKey();
-            final List<R> referencesForDss = entry.getValue();
+            final String dataStoreUrl = referencePerDataStore.getKey();
+            final List<R> dataStoreReferences = referencePerDataStore.getValue();
 
-            ITerminableFuture<List<V>> dssFuture =
+            ITerminableFuture<List<V>> dataStoreFuture =
                     ConcurrencyUtilities.submit(executor, new INamedCallable<List<V>>()
                         {
                             @Override
                             public List<V> call(IStoppableExecutor<List<V>> stoppableExecutor)
                                     throws Exception
                             {
-                                final DssServiceRpcScreeningHolder dssServiceHolder =
-                                        dssServiceFactory.createDssService(dssUrl);
-                                return handler.handle(dssServiceHolder, referencesForDss);
+                                final DssServiceRpcScreeningHolder dataStoreServiceHolder =
+                                        dssServiceFactory.createDssService(dataStoreUrl);
+                                return batchHandler.handle(dataStoreServiceHolder,
+                                        dataStoreReferences);
                             }
 
                             @Override
                             public String getCallableName()
                             {
-                                return dssUrl + "(" + callMillis + ")";
+                                return dataStoreUrl + "(" + submitTime + ")";
                             }
                         });
-            dssFutures.add(dssFuture);
+            futuresPerDataStore.put(dataStoreUrl, dataStoreFuture);
         }
 
-        List<V> allResults = new ArrayList<V>();
+        return futuresPerDataStore;
+    }
+
+    private <V> DssServiceRpcScreeningBatchResults<V> gatherResultsFromDataStores(
+            final Map<String, ITerminableFuture<List<V>>> futuresPerDataStore)
+    {
+        DssServiceRpcScreeningBatchResults<V> results = new DssServiceRpcScreeningBatchResults<V>();
 
         try
         {
-            for (ITerminableFuture<List<V>> dssFuture : dssFutures)
+            for (Map.Entry<String, ITerminableFuture<List<V>>> futurePerDataStore : futuresPerDataStore
+                    .entrySet())
             {
-                List<V> dssResults = ConcurrencyUtilities.tryGetResult(dssFuture, -1);
-                if (dssResults != null)
+                String dataStoreUrl = futurePerDataStore.getKey();
+                ITerminableFuture<List<V>> dataStoreFuture = futurePerDataStore.getValue();
+
+                List<V> dataStoreResults = ConcurrencyUtilities.tryGetResult(dataStoreFuture, -1);
+                if (dataStoreResults != null)
                 {
-                    allResults.addAll(dssResults);
+                    results.addDataStoreResults(dataStoreUrl, dataStoreResults);
                 }
             }
         } catch (RuntimeException e)
         {
-            for (ITerminableFuture<List<V>> dssFuture : dssFutures)
+            for (ITerminableFuture<List<V>> dataStoreFuture : futuresPerDataStore.values())
             {
-                dssFuture.cancel(true);
+                dataStoreFuture.cancel(true);
             }
             throw e;
         }
 
-        return allResults;
+        return results;
     }
 
     @SuppressWarnings("unchecked")
@@ -112,33 +166,4 @@ public class DssServiceRpcScreeningMultiplexer implements IDssServiceRpcScreenin
         return (List<R>) references;
     }
 
-    public static <R extends IDatasetIdentifier> Map<String, List<R>> getReferencesPerDss(
-            List<R> references)
-    {
-        HashMap<String, List<R>> referencesPerDss = new HashMap<String, List<R>>();
-
-        if (references != null)
-        {
-            for (R reference : references)
-            {
-                if (reference != null)
-                {
-                    String url = reference.getDatastoreServerUrl();
-                    if (url != null)
-                    {
-                        List<R> list = referencesPerDss.get(url);
-                        if (list == null)
-                        {
-                            list = new ArrayList<R>();
-                            referencesPerDss.put(url, list);
-                        }
-                        list.add(reference);
-                    }
-                }
-            }
-        }
-
-        return referencesPerDss;
-    }
-
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/IDssServiceRpcScreeningBatchResults.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/IDssServiceRpcScreeningBatchResults.java
new file mode 100644
index 0000000000000000000000000000000000000000..92dc94f0e9717b575ac30b8a32a15c538a4b6805
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/IDssServiceRpcScreeningBatchResults.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2013 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.systemsx.cisd.openbis.dss.screening.shared.api.internal;
+
+import java.util.List;
+
+/**
+ * @author pkupczyk
+ */
+public interface IDssServiceRpcScreeningBatchResults<T>
+{
+
+    public List<T> withDuplicates();
+
+    public List<T> withoutDuplicates();
+
+}
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/IDssServiceRpcScreeningMultiplexer.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/IDssServiceRpcScreeningMultiplexer.java
index 81ef30529ad9d0427bdf0b379f839c5285cb1985..dbc5962b64cefc1000f5e719c87c42e530c7132f 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/IDssServiceRpcScreeningMultiplexer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/internal/IDssServiceRpcScreeningMultiplexer.java
@@ -26,7 +26,8 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.IDatasetIdent
 public interface IDssServiceRpcScreeningMultiplexer
 {
 
-    public <R extends IDatasetIdentifier, V> List<V> process(final List<? extends R> references,
+    public <R extends IDatasetIdentifier, V> DssServiceRpcScreeningBatchResults<V> process(
+            final List<? extends R> references,
             final IDssServiceRpcScreeningBatchHandler<R, V> batchHandler);
 
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacade.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacade.java
index 2e4c892d9e6903b5950527787d985d2008009aaf..e58c489dc6eb6da89645c3d358ee62dbde772984 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacade.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacade.java
@@ -878,7 +878,7 @@ public class ScreeningOpenbisServiceFacade implements IScreeningOpenbisServiceFa
                         }
                     };
 
-        return dssMultiplexer.process(featureDatasets, handler);
+        return dssMultiplexer.process(featureDatasets, handler).withoutDuplicates();
     }
 
     /**
@@ -946,8 +946,9 @@ public class ScreeningOpenbisServiceFacade implements IScreeningOpenbisServiceFa
                         }
                     };
 
-        return dssMultiplexer.process(identifiersIncludingContained == null ? featureDatasets
-                : identifiersIncludingContained, handler);
+        return dssMultiplexer.process(
+                identifiersIncludingContained == null ? featureDatasets
+                        : identifiersIncludingContained, handler).withoutDuplicates();
     }
 
     private SearchSubCriteria getContainerSearchCriteria(String containerCode)
@@ -1035,7 +1036,7 @@ public class ScreeningOpenbisServiceFacade implements IScreeningOpenbisServiceFa
                         }
                     };
 
-        return dssMultiplexer.process(featureDatasets, handler);
+        return dssMultiplexer.process(featureDatasets, handler).withDuplicates();
     }
 
     @Override
@@ -1089,7 +1090,7 @@ public class ScreeningOpenbisServiceFacade implements IScreeningOpenbisServiceFa
                         }
                     };
 
-        return dssMultiplexer.process(datasetWellReferences, handler);
+        return dssMultiplexer.process(datasetWellReferences, handler).withDuplicates();
     }
 
     private boolean isEmpty(final List<String> featureCodeOrNull)
@@ -1747,7 +1748,7 @@ public class ScreeningOpenbisServiceFacade implements IScreeningOpenbisServiceFa
             String channel, IImageTransformerFactory transformerFactoryOrNull)
     {
         Map<String, List<IDatasetIdentifier>> map =
-                DssServiceRpcScreeningMultiplexer.getReferencesPerDss(dataSetIdentifiers);
+                DssServiceRpcScreeningMultiplexer.getReferencesPerDataStore(dataSetIdentifiers);
         Set<Entry<String, List<IDatasetIdentifier>>> entrySet = map.entrySet();
         for (Entry<String, List<IDatasetIdentifier>> entry : entrySet)
         {
@@ -1764,7 +1765,7 @@ public class ScreeningOpenbisServiceFacade implements IScreeningOpenbisServiceFa
             List<IDatasetIdentifier> dataSetIdentifiers, String channel)
     {
         Map<String, List<IDatasetIdentifier>> map =
-                DssServiceRpcScreeningMultiplexer.getReferencesPerDss(dataSetIdentifiers);
+                DssServiceRpcScreeningMultiplexer.getReferencesPerDataStore(dataSetIdentifiers);
         Set<Entry<String, List<IDatasetIdentifier>>> entrySet = map.entrySet();
         if (entrySet.size() != 1)
         {
@@ -1833,7 +1834,7 @@ public class ScreeningOpenbisServiceFacade implements IScreeningOpenbisServiceFa
                         }
                     };
 
-        return dssMultiplexer.process(imageDatasets, handler);
+        return dssMultiplexer.process(imageDatasets, handler).withDuplicates();
     }
 
     @Override
@@ -2104,7 +2105,7 @@ public class ScreeningOpenbisServiceFacade implements IScreeningOpenbisServiceFa
                 new ArrayList<IDatasetIdentifier>(dataSetIdentifiers.size());
         simplerList.addAll(dataSetIdentifiers);
         Map<String, List<IDatasetIdentifier>> map =
-                DssServiceRpcScreeningMultiplexer.getReferencesPerDss(simplerList);
+                DssServiceRpcScreeningMultiplexer.getReferencesPerDataStore(simplerList);
         Set<Entry<String, List<IDatasetIdentifier>>> entrySet = map.entrySet();
         if (entrySet.size() != 1)
         {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
index 801c517c1394c57d629936c50ea1be9140a4af02..b7021639037483f5cdbf07e9d20a983b8173cf22 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
@@ -768,7 +768,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(featureDatasets, handler);
+        return dssMultiplexer.process(featureDatasets, handler).withoutDuplicates();
     }
 
     @Override
@@ -790,7 +790,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(featureDatasets, handler);
+        return dssMultiplexer.process(featureDatasets, handler).withoutDuplicates();
     }
 
     @Override
@@ -813,7 +813,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(featureDatasets, handler);
+        return dssMultiplexer.process(featureDatasets, handler).withDuplicates();
     }
 
     @Override
@@ -837,7 +837,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(datasetWellReferences, handler);
+        return dssMultiplexer.process(datasetWellReferences, handler).withDuplicates();
     }
 
     @Override
@@ -858,7 +858,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(imageReferences, handler);
+        return dssMultiplexer.process(imageReferences, handler).withDuplicates();
     }
 
     @Override
@@ -879,7 +879,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(imageReferences, handler);
+        return dssMultiplexer.process(imageReferences, handler).withDuplicates();
     }
 
     @Override
@@ -900,7 +900,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(imageReferences, handler);
+        return dssMultiplexer.process(imageReferences, handler).withDuplicates();
     }
 
     @Override
@@ -921,7 +921,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(imageReferences, handler);
+        return dssMultiplexer.process(imageReferences, handler).withDuplicates();
     }
 
     @Override
@@ -940,7 +940,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(imageReferences, handler);
+        return dssMultiplexer.process(imageReferences, handler).withDuplicates();
     }
 
     @Override
@@ -959,7 +959,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(imageReferences, handler);
+        return dssMultiplexer.process(imageReferences, handler).withDuplicates();
     }
 
     @Override
@@ -979,7 +979,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(imageReferences, handler);
+        return dssMultiplexer.process(imageReferences, handler).withDuplicates();
     }
 
     @Override
@@ -999,7 +999,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(imageDatasets, handler);
+        return dssMultiplexer.process(imageDatasets, handler).withDuplicates();
     }
 
     @Override
@@ -1019,7 +1019,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(imageDatasets, handler);
+        return dssMultiplexer.process(imageDatasets, handler).withDuplicates();
     }
 
     @Override
@@ -1038,7 +1038,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
                         }
                     };
 
-        return dssMultiplexer.process(imageReferences, handler);
+        return dssMultiplexer.process(imageReferences, handler).withDuplicates();
     }
 
 }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java
index a7cecf1a98a7cd0e64acc656b84d77318d65d1fa..5316f2d0c30ad9ff741eea28e4a410c986808e89 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java
@@ -100,7 +100,6 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConst
  * @author Franz-Josef Elmer
  */
 @Friend(toClasses = DssServiceRpcScreeningHolder.class)
-@Test(enabled = false)
 public class ScreeningOpenbisServiceFacadeTest extends AbstractFileSystemTestCase
 {
     private static final String MY_DATA_SET_TYPE = "my-data-set";
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/DssServiceRpcScreeningBatchResultsTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/DssServiceRpcScreeningBatchResultsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0db9ee097e090c5743b33224ba472d5963cb28d
--- /dev/null
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/DssServiceRpcScreeningBatchResultsTest.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2013 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.systemsx.cisd.openbis.plugin.screening.shared.api.v1;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.testng.AssertJUnit;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.openbis.dss.screening.shared.api.internal.DssServiceRpcScreeningBatchResults;
+
+/**
+ * @author pkupczyk
+ */
+public class DssServiceRpcScreeningBatchResultsTest extends AssertJUnit
+{
+
+    @Test
+    public void testNullResults()
+    {
+        DssServiceRpcScreeningBatchResults<String> results =
+                new DssServiceRpcScreeningBatchResults<String>();
+        results.addDataStoreResults("dss1", null);
+        results.addDataStoreResults("dss2", null);
+
+        assertTrue(results.withDuplicates().isEmpty());
+        assertTrue(results.withoutDuplicates().isEmpty());
+    }
+
+    @Test
+    public void testEmptyResults()
+    {
+        DssServiceRpcScreeningBatchResults<String> results =
+                new DssServiceRpcScreeningBatchResults<String>();
+        results.addDataStoreResults("dss1", new ArrayList<String>());
+        results.addDataStoreResults("dss2", new ArrayList<String>());
+
+        assertTrue(results.withDuplicates().isEmpty());
+        assertTrue(results.withoutDuplicates().isEmpty());
+    }
+
+    @Test
+    public void testNotEmptyResults()
+    {
+        DssServiceRpcScreeningBatchResults<String> results =
+                new DssServiceRpcScreeningBatchResults<String>();
+        results.addDataStoreResults("dss1", Arrays.asList("a", "c", "e"));
+        results.addDataStoreResults("dss2", Arrays.asList("c", "d"));
+
+        assertEquals(Arrays.asList("a", "c", "e", "c", "d"), results.withDuplicates());
+        assertEquals(Arrays.asList("a", "c", "e", "d"), results.withoutDuplicates());
+    }
+
+}
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/DssServiceRpcScreeningMultiplexerTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/DssServiceRpcScreeningMultiplexerTest.java
index 94c43f6669a56832165fa14aaa85f2b52f774e90..6256fdcb17e3ec1dd3bcd2f98f665a00cb56209e 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/DssServiceRpcScreeningMultiplexerTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/DssServiceRpcScreeningMultiplexerTest.java
@@ -216,7 +216,7 @@ public class DssServiceRpcScreeningMultiplexerTest extends AssertJUnit
     @Test
     public void testWithNullReferenceLists()
     {
-        List<String> results = multiplexer.process(null, batchHandler);
+        List<String> results = multiplexer.process(null, batchHandler).withDuplicates();
         assertTrue(results.isEmpty());
     }
 
@@ -224,7 +224,8 @@ public class DssServiceRpcScreeningMultiplexerTest extends AssertJUnit
     public void testWithEmptyReferenceLists()
     {
         List<String> results =
-                multiplexer.process(new ArrayList<IDatasetIdentifier>(), batchHandler);
+                multiplexer.process(new ArrayList<IDatasetIdentifier>(), batchHandler)
+                        .withDuplicates();
         assertTrue(results.isEmpty());
     }
 
@@ -330,7 +331,7 @@ public class DssServiceRpcScreeningMultiplexerTest extends AssertJUnit
                 }
             });
 
-        return multiplexer.process(allDatasets, batchHandler);
+        return multiplexer.process(allDatasets, batchHandler).withDuplicates();
     }
 
 }