diff --git a/screening/.classpath b/screening/.classpath
index 2fa42baa063251bf399987b76769420827521cf4..b64b10e9876dfea4a6b87782256a4fee07766ad4 100644
--- a/screening/.classpath
+++ b/screening/.classpath
@@ -42,5 +42,6 @@
 	<classpathentry kind="lib" path="/libraries/jhdf5/cisd-jhdf5-batteries_included_lin_win_mac.jar"/>
 	<classpathentry kind="lib" path="/libraries/hdf5"/>
 	<classpathentry kind="lib" path="/libraries/nativedata"/>
+	<classpathentry kind="lib" path="/libraries/fastutil/fastutil.jar" sourcepath="/libraries/fastutil/fastutil-src.zip"/>
 	<classpathentry kind="output" path="targets/www/WEB-INF/classes"/>
 </classpath>
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
index 63b64f1093a158586aaaff1c320c8e421c15218a..0ed55be5b6d4e0742e74b25461976a19c74387c2 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
@@ -16,7 +16,12 @@
 
 package ch.systemsx.cisd.openbis.plugin.screening.server.logic;
 
+import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap;
+import it.unimi.dsi.fastutil.longs.Long2ObjectSortedMap;
+
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister;
@@ -44,7 +49,7 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader
 
     FeatureVectorDatasetLoader(Session session,
             IScreeningBusinessObjectFactory businessObjectFactory, String dataStoreBaseURL,
-            List<? extends PlateIdentifier> plates)
+            Collection<? extends PlateIdentifier> plates)
     {
         super(session, businessObjectFactory, dataStoreBaseURL, plates,
                 ScreeningConstants.IMAGE_DATASET_TYPE,
@@ -62,10 +67,8 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader
 
     private void loadFeatureVectorDatasets()
     {
-        // TODO 2010-05-26, CR, : This is slow if there are a large number of image data sets
-        // Need to add a query to the dataset lister that returns, for a collection of tech ids, a
-        // child datasets and their parents.
-        featureVectorDatasets = new ArrayList<ExternalData>();
+        final Long2ObjectSortedMap<ExternalData> featureVectorDatasetSet =
+                new Long2ObjectLinkedOpenHashMap<ExternalData>();
         IDatasetLister datasetLister =
                 businessObjectFactory.createDatasetLister(session, dataStoreBaseURL);
 
@@ -73,23 +76,33 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader
         {
             if (ScreeningUtils.isTypeEqual(data, ScreeningConstants.IMAGE_ANALYSIS_DATASET_TYPE))
             {
-                featureVectorDatasets.add(data);
-            } else 
+                featureVectorDatasetSet.put(data.getId(), data);
+            }
+        }
+
+        // Implementation note: some data sets in this loop may overwrite data from the first loop.
+        // This is intended as we want to keep the parent relationship of the feature vector data
+        // sets, if they exist.
+        for (ExternalData data : getDatasets())
+        {
+            if (ScreeningUtils.isTypeEqual(data, ScreeningConstants.IMAGE_DATASET_TYPE))
             {
-                List<ExternalData> children =
+                // TODO 2010-05-26, CR, : This way to access the database one by one is slow if
+                // there are a large number of image data sets
+                // Need to add a query to the dataset lister that returns, for a collection of tech
+                // ids, a child datasets and their parents.
+                final List<ExternalData> children =
                         datasetLister.listByParentTechId(new TechId(data.getId()));
-                ArrayList<ExternalData> parentList = new ArrayList<ExternalData>();
-                parentList.add(data);
                 for (ExternalData child : children)
                 {
-                    child.setParents(parentList);
+                    child.setParents(Collections.singleton(data));
+                    featureVectorDatasetSet.put(child.getId(), child);
                 }
-                featureVectorDatasets.addAll(children);
             }
         }
 
         featureVectorDatasets =
-                ScreeningUtils.filterExternalDataByType(featureVectorDatasets,
+                ScreeningUtils.filterExternalDataByType(featureVectorDatasetSet.values(),
                         featureVectorDatasetTypeCode);
     }
 
@@ -106,22 +119,21 @@ class FeatureVectorDatasetLoader extends ImageDatasetLoader
     protected FeatureVectorDatasetReference asFeatureVectorDataset(ExternalData externalData)
     {
         DataStore dataStore = externalData.getDataStore();
-        if (externalData.getParents() == null || externalData.getParents().size() == 0)
+        if (externalData.getParents() == null || externalData.getParents().isEmpty())
         {
             return new FeatureVectorDatasetReference(externalData.getCode(),
                     getDataStoreUrlFromDataStore(dataStore), createPlateIdentifier(externalData),
-                    extractPlateGeometry(externalData), externalData.getRegistrationDate(),
-                    null);
+                    extractPlateGeometry(externalData), externalData.getRegistrationDate(), null);
         } else
         {
-            // Note: this only works reliably because this class sets the parents of the feature 
+            // Note: this only works reliably because this class sets the parents of the feature
             // vector data sets itself and sets it to a list with exactly one entry!
             // (see loadFeatureVectorDatasets() above)
             final ExternalData parentDataset = externalData.getParents().iterator().next();
             return new FeatureVectorDatasetReference(externalData.getCode(),
                     getDataStoreUrlFromDataStore(dataStore), createPlateIdentifier(parentDataset),
-                    extractPlateGeometry(parentDataset), externalData.getRegistrationDate(), 
-                asImageDataset(parentDataset));
+                    extractPlateGeometry(parentDataset), externalData.getRegistrationDate(),
+                    asImageDataset(parentDataset));
         }
     }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ImageDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ImageDatasetLoader.java
index b6e1f5684224f4079b23e751d898fbd68832241e..fedb87144b078c9e511744a8ef907c6894858276 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ImageDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ImageDatasetLoader.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.plugin.screening.server.logic;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
@@ -37,7 +38,7 @@ class ImageDatasetLoader extends PlateDatasetLoader
     // TODO 2010-05-27, CR : See PlateDatasetLoader todo comment
 
     ImageDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory,
-            String dataStoreBaseURL, List<? extends PlateIdentifier> plates,
+            String dataStoreBaseURL, Collection<? extends PlateIdentifier> plates,
             String... datasetTypeCodes)
     {
         super(session, businessObjectFactory, dataStoreBaseURL, plates,
@@ -51,15 +52,18 @@ class ImageDatasetLoader extends PlateDatasetLoader
     public List<ImageDatasetReference> getImageDatasets()
     {
         load();
-        return asImageDatasets();
+        return filterImageDatasets();
     }
 
-    private List<ImageDatasetReference> asImageDatasets()
+    private List<ImageDatasetReference> filterImageDatasets()
     {
         List<ImageDatasetReference> result = new ArrayList<ImageDatasetReference>();
         for (ExternalData externalData : getDatasets())
         {
-            result.add(asImageDataset(externalData));
+            if (ScreeningUtils.isTypeEqual(externalData, ScreeningConstants.IMAGE_DATASET_TYPE))
+            {
+                result.add(asImageDataset(externalData));
+            }
         }
         return result;
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java
index 6e604cc9dcc4ac5c0ff0274f40dd67d42061aa85..7b10358d884a39779307d9a44e644704bf4bfa7e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java
@@ -3,9 +3,12 @@ package ch.systemsx.cisd.openbis.plugin.screening.server.logic;
 import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 
+import org.apache.commons.lang.StringUtils;
+
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister;
@@ -44,7 +47,7 @@ class PlateDatasetLoader
     protected final String dataStoreBaseURL;
 
     // Parameter state
-    private final List<? extends PlateIdentifier> plates;
+    private final Collection<? extends PlateIdentifier> plates;
 
     private final String[] datasetTypeCodes;
 
@@ -58,7 +61,7 @@ class PlateDatasetLoader
     private HashMap<Long, Sample> samplesById;
 
     PlateDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory,
-            String dataStoreBaseURL, List<? extends PlateIdentifier> plates,
+            String dataStoreBaseURL, Collection<? extends PlateIdentifier> plates,
             String... datasetTypeCodes)
     {
         this.session = session;
@@ -122,7 +125,9 @@ class PlateDatasetLoader
     {
         for (PlateIdentifier plate : plates)
         {
-            Sample sample = samplesByIdentifier.get(createSampleIdentifier(plate));
+            Sample sample =
+                    samplesByIdentifier.get(createSampleIdentifier(plate, session
+                            .tryGetHomeGroupCode()));
             // Make sure the sample and plate have the same *identifier* not just code
             String plateSpaceCodeOrNull = plate.tryGetSpaceCode();
             Space sampleSpaceOrNull = sample.getSpace();
@@ -180,7 +185,7 @@ class PlateDatasetLoader
 
             }
         }
-        throw new UserFailureException("Sample " + sample.getIdentifier() + " has no property "
+        throw new UserFailureException("Sample '" + sample.getIdentifier() + "' has no property "
                 + ScreeningConstants.PLATE_GEOMETRY);
     }
 
@@ -210,7 +215,7 @@ class PlateDatasetLoader
 
     private List<Long> extractSampleIds()
     {
-        ArrayList<Long> sampleIds = new ArrayList<Long>();
+        ArrayList<Long> sampleIds = new ArrayList<Long>(samples.size());
         for (Sample sample : samples)
         {
             sampleIds.add(sample.getId());
@@ -237,17 +242,31 @@ class PlateDatasetLoader
         return datastoreUrl;
     }
 
-    protected static SampleIdentifier createSampleIdentifier(PlateIdentifier plate)
+    protected static SampleIdentifier createSampleIdentifier(PlateIdentifier plate,
+            String homeSpaceCodeOrNull)
     {
         SampleOwnerIdentifier owner;
         String spaceCode = plate.tryGetSpaceCode();
-        if (spaceCode != null)
+        if (StringUtils.isNotBlank(spaceCode))
         {
-            SpaceIdentifier space = new SpaceIdentifier(DatabaseInstanceIdentifier.HOME, spaceCode);
+            final SpaceIdentifier space =
+                    new SpaceIdentifier(DatabaseInstanceIdentifier.HOME, spaceCode);
             owner = new SampleOwnerIdentifier(space);
         } else
         {
-            owner = new SampleOwnerIdentifier(DatabaseInstanceIdentifier.createHome());
+            if (spaceCode == null)
+            {
+                owner = new SampleOwnerIdentifier(DatabaseInstanceIdentifier.createHome());
+            } else
+            {
+                if (homeSpaceCodeOrNull == null)
+                {
+                    throw new UserFailureException("No space given and user has no home space.");
+                }
+                final SpaceIdentifier space =
+                        new SpaceIdentifier(DatabaseInstanceIdentifier.HOME, homeSpaceCodeOrNull);
+                owner = new SampleOwnerIdentifier(space);
+            }
         }
         return SampleIdentifier.createOwnedBy(owner, plate.getPlateCode());
     }