diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java
index 65825c2954c23912e31feb4bf48d946818654cff..b6e20c982377541c30d31e0d606bfd434a303b14 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java
@@ -51,6 +51,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellMetadata;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
@@ -198,7 +199,8 @@ public interface IScreeningClientService extends IClientService
      */
     public TypedTableResultSet<MaterialFeatureVectorSummary> listExperimentFeatureVectorSummary(
             IResultSetConfig<String, TableModelRowWithObject<MaterialFeatureVectorSummary>> resultSetConfig,
-            TechId experimentId, String analysisProcedureOrNull) throws UserFailureException;
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
+            throws UserFailureException;
 
     public String prepareExportFeatureVectorSummary(
             TableExportCriteria<TableModelRowWithObject<MaterialFeatureVectorSummary>> criteria)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java
index 2881438211166c585f9df9dd3bf962fb53b17191..c49465c41612cb4ddf6ef352ac90d440818031a9 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java
@@ -52,6 +52,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellMetadata;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
@@ -176,11 +177,11 @@ public interface IScreeningClientServiceAsync extends IClientServiceAsync
 
     /**
      * @see IScreeningClientService#listExperimentFeatureVectorSummary(IResultSetConfig, TechId,
-     *      String)
+     *      AnalysisProcedureCriteria)
      */
     public void listExperimentFeatureVectorSummary(
             IResultSetConfig<String, TableModelRowWithObject<MaterialFeatureVectorSummary>> resultSetConfig,
-            TechId experimentId, String analysisProcedureOrNull,
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria,
             AsyncCallback<TypedTableResultSet<MaterialFeatureVectorSummary>> callback);
 
     /**
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java
index 44ca3b404d6b12eaffe9e47cf7c75dce9e31c748..f5d5fe36733f533d24768896e1004e1fd8bf4a81 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java
@@ -39,6 +39,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningCli
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningDisplaySettingsManager;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.AnalysisProcedures;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteriaHolder;
 
 /**
@@ -55,7 +56,7 @@ class AnalysisProcedureChooser extends LayoutContainer
      */
     public static interface IAnalysisProcedureSelectionListener
     {
-        void analysisProcedureSelected(String analysisProcedureOrNull);
+        void analysisProcedureSelected(AnalysisProcedureCriteria criteria);
     }
 
     public static final AnalysisProcedureChooser createHorizontal(
@@ -235,7 +236,11 @@ class AnalysisProcedureChooser extends LayoutContainer
 
     private void notifySelectionListener(String analysisProcedureOrNull)
     {
-        selectionListener.analysisProcedureSelected(analysisProcedureOrNull);
+        AnalysisProcedureCriteria criteria = StringUtils.isBlank(analysisProcedureOrNull) ?
+                AnalysisProcedureCriteria.createAllProcedures() : 
+                    AnalysisProcedureCriteria.createFromCode(analysisProcedureOrNull);
+            
+        selectionListener.analysisProcedureSelected(criteria);
     }
 
     private String getDefaultAnalysisProcedure()
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryGrid.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryGrid.java
index 012dcf70619d20673fccc38d65f3014f4ab9ed3f..6857fcc1b436bf51936f5664ce2ddd640dfff391 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryGrid.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryGrid.java
@@ -44,6 +44,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.D
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.AnalysisProcedureChooser.IAnalysisProcedureSelectionListener;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific.ScreeningLinkExtractor;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.MaterialFeatureVectorSummary;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.FeatureVectorSummaryGridColumnIDs;
 
@@ -66,7 +67,7 @@ public class ExperimentAnalysisSummaryGrid extends TypedTableGrid<MaterialFeatur
 
     private final boolean restrictGlobalScopeLinkToProject;
 
-    private String analysisProcedureOrNull = null;
+    private AnalysisProcedureCriteria analysisProcedureCriteria;
 
     public static IDisposableComponent create(
             IViewContext<IScreeningClientServiceAsync> viewContext,
@@ -141,15 +142,13 @@ public class ExperimentAnalysisSummaryGrid extends TypedTableGrid<MaterialFeatur
         setBorders(true);
     }
 
-
     @Override
     protected void listTableRows(
             DefaultResultSetConfig<String, TableModelRowWithObject<MaterialFeatureVectorSummary>> resultSetConfig,
             AsyncCallback<TypedTableResultSet<MaterialFeatureVectorSummary>> callback)
     {
         screeningViewContext.getService().listExperimentFeatureVectorSummary(resultSetConfig,
-                new TechId(experiment), analysisProcedureOrNull, callback);
-
+                new TechId(experiment), analysisProcedureCriteria, callback);
     }
 
     @Override
@@ -181,9 +180,9 @@ public class ExperimentAnalysisSummaryGrid extends TypedTableGrid<MaterialFeatur
     //
     // IAnalysisProcedureSelectionListener
     //
-    public void analysisProcedureSelected(String analysisProcedure)
+    public void analysisProcedureSelected(AnalysisProcedureCriteria selectedProcedureCriteria)
     {
-        this.analysisProcedureOrNull = analysisProcedure;
+        this.analysisProcedureCriteria = selectedProcedureCriteria;
         refresh(true);
     }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
index f0b23d0b59481d8fd9e1da9f270d7674b959b372..e02158bd89ee31e52fed0bcc18768bf306da6f99 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
@@ -665,12 +665,11 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> implements
         return Arrays.asList(WellSearchGridColumnIds.PLATE, WellSearchGridColumnIds.WELL);
     }
 
-    public void analysisProcedureSelected(String analysisProcedureOrNull)
+    public void analysisProcedureSelected(AnalysisProcedureCriteria selectedProcedureCriteria)
     {
         if (experimentCriteriaHolder.tryGetCriteria() != null)
         {
-            this.analysisProcedureCriteria =
-                AnalysisProcedureCriteria.createFromCode(analysisProcedureOrNull);
+            this.analysisProcedureCriteria = selectedProcedureCriteria;
             refresh(true);
         }
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/WellSearchLocatorResolver.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/WellSearchLocatorResolver.java
index 0b61aa277e8fc73110d147486f30c567bd782fc8..8b9a5273cfa5bff79f1dbb4f595d90427798dda7 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/WellSearchLocatorResolver.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/WellSearchLocatorResolver.java
@@ -65,7 +65,8 @@ public class WellSearchLocatorResolver extends AbstractViewLocatorResolver
                 MaterialSearchCriteria.create(materialCodesCriteria);
 
         AnalysisProcedureCriteria analysisProcedureCriteria =
-                (analysisProcedureOrNull == null) ? AnalysisProcedureCriteria.createAllProcedures()
+                StringUtils.isBlank(analysisProcedureOrNull) ? AnalysisProcedureCriteria
+                        .createAllProcedures()
                         : AnalysisProcedureCriteria.createFromCode(analysisProcedureOrNull);
 
         if (StringUtils.isBlank(experimentPermId))
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
index 4ca6c89d46550c263c1e1ced9b0ba325ae0073d2..5aea6145f484a8d6b6e9fd002fe282e7b22614e5 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
@@ -75,6 +75,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellMetadata;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
@@ -296,11 +297,11 @@ public final class ScreeningClientService extends AbstractClientService implemen
 
     public TypedTableResultSet<MaterialFeatureVectorSummary> listExperimentFeatureVectorSummary(
             IResultSetConfig<String, TableModelRowWithObject<MaterialFeatureVectorSummary>> criteria,
-            TechId experimentId, String analysisProcedureOrNull)
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         FeatureVectorSummaryProvider provider =
                 new FeatureVectorSummaryProvider(server, getSessionToken(), experimentId,
-                        analysisProcedureOrNull);
+                        analysisProcedureCriteria);
         return listEntities(provider, criteria);
 
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/FeatureVectorSummaryProvider.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/FeatureVectorSummaryProvider.java
index 492be321346ccdde8bd5af49b2d239691f94d3b7..b22e2c13debc2e496283ab638256f67e7464b42e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/FeatureVectorSummaryProvider.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/FeatureVectorSummaryProvider.java
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.IScreeningServer;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ExperimentFeatureVectorSummary;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.MaterialFeatureVectorSummary;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.FeatureVectorSummaryGridColumnIDs;
 
 /**
@@ -49,15 +50,15 @@ public class FeatureVectorSummaryProvider extends AbstractTableModelProvider<Mat
 
     private final TechId experimentId;
 
-    private final String analysisProcedureOrNull;
+    private final AnalysisProcedureCriteria analysisProcedureCriteria;
 
     public FeatureVectorSummaryProvider(IScreeningServer server, String sessionToken,
-            TechId experimentId, String analysisProcedureOrNull)
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         this.server = server;
         this.sessionToken = sessionToken;
         this.experimentId = experimentId;
-        this.analysisProcedureOrNull = analysisProcedureOrNull;
+        this.analysisProcedureCriteria = analysisProcedureCriteria;
     }
 
     @Override
@@ -67,7 +68,7 @@ public class FeatureVectorSummaryProvider extends AbstractTableModelProvider<Mat
                 new TypedTableModelBuilder<MaterialFeatureVectorSummary>();
         ExperimentFeatureVectorSummary fvSummary =
                 server.getExperimentFeatureVectorSummary(sessionToken, experimentId,
-                        analysisProcedureOrNull);
+                        analysisProcedureCriteria);
 
         builder.addColumn(MATERIAL_ID);
         builder.columnGroup(MATERIAL_PROPS_GROUP);
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 d178fee26ff1b1aeafb224a7992498446a491104..c567d0eaf396efe46dae6fccd37ba6bf623d25d3 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
@@ -111,6 +111,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria;
 
@@ -306,13 +307,13 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     }
 
     public ExperimentFeatureVectorSummary getExperimentFeatureVectorSummary(String sessionToken,
-            TechId experimentId, String analysisProcedureOrNull)
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         Session session = getSession(sessionToken);
         // NOTE: we want the settings to be passed form the client in future
         MaterialSummarySettings settings = createDefaultSettings();
         return ExperimentFeatureVectorSummaryLoader.loadExperimentFeatureVectors(session,
-                businessObjectFactory, getDAOFactory(), experimentId, analysisProcedureOrNull,
+                businessObjectFactory, getDAOFactory(), experimentId, analysisProcedureCriteria,
                 settings);
     }
 
@@ -472,7 +473,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
         } else
         {
             procedureCodes =
-                    dao.listAnalysisProcedures(singleExpCriteria.getExperimentId().getId());
+                    dao.listAnalysisProceduresForExperiment(singleExpCriteria.getExperimentId().getId());
         }
         return new AnalysisProcedures(procedureCodes);
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
index 525786d4d85809d36d061d2ef4c3b3b005dc9703..1296f0bee1f925bbada9ad7b323a58349ef56f5e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
@@ -66,6 +66,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
@@ -350,11 +351,11 @@ final class ScreeningServerLogger extends AbstractServerLogger implements IScree
     }
 
     public ExperimentFeatureVectorSummary getExperimentFeatureVectorSummary(String sessionToken,
-            TechId experimentId, String analysisProcedureOrNull)
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         logAccess(sessionToken, "getExperimentFeatureVectorSummary",
-                "sessionToken(%s), experimentId(%s), analysisProcedure(%s)", sessionToken,
-                experimentId, analysisProcedureOrNull);
+                "sessionToken(%s), experimentId(%s), analysisProcedureCriteria(%s)", sessionToken,
+                experimentId, analysisProcedureCriteria);
         return null;
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AbstractContentLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AbstractContentLoader.java
index 4badb30efd7a8d08883eb87502c22b471f8e60b9..2e4debdcaa4ef1e117fb2542ddea642f23c6f983 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AbstractContentLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AbstractContentLoader.java
@@ -36,6 +36,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObject
 import ch.systemsx.cisd.openbis.plugin.screening.server.dataaccess.IScreeningQuery;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ExperimentReference;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 
 /**
  * Abstract superclass for screening loaders.
@@ -100,9 +101,9 @@ abstract class AbstractContentLoader
     }
 
     protected final FeatureVectorDatasetLoader createFeatureVectorDatasetsRetriever(
-            Set<PlateIdentifier> plates, String analysisProcedureOrNull)
+            Set<PlateIdentifier> plates, AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         return new FeatureVectorDatasetLoader(session, businessObjectFactory, null, plates,
-                analysisProcedureOrNull);
+                analysisProcedureCriteria);
     }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java
index 9e5951d90e9367783ed70e6de011113cd9739bef..121438dbc5931393a11a827925763c03df569974 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java
@@ -54,6 +54,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.MaterialFeatur
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.MaterialSummarySettings;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReference;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.FeatureVectorLoader.WellFeatureCollection;
 
 /**
@@ -68,12 +69,12 @@ public class ExperimentFeatureVectorSummaryLoader extends AbstractContentLoader
     {
         TechId experimentId;
 
-        String analysisProcedureOrNull;
+        AnalysisProcedureCriteria analysisProcedureCriteria;
 
-        LoaderParameters(TechId experimentId, String analysisProcedureOrNull)
+        LoaderParameters(TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria)
         {
             this.experimentId = experimentId;
-            this.analysisProcedureOrNull = analysisProcedureOrNull;
+            this.analysisProcedureCriteria = analysisProcedureCriteria;
         }
     }
 
@@ -82,9 +83,10 @@ public class ExperimentFeatureVectorSummaryLoader extends AbstractContentLoader
      */
     public static ExperimentFeatureVectorSummary loadExperimentFeatureVectors(Session session,
             IScreeningBusinessObjectFactory businessObjectFactory, IDAOFactory daoFactory,
-            TechId experimentId, String analysisProcedureOrNull, MaterialSummarySettings settings)
+            TechId experimentId, AnalysisProcedureCriteria analysisProcedureCriteria,
+            MaterialSummarySettings settings)
     {
-        LoaderParameters params = new LoaderParameters(experimentId, analysisProcedureOrNull);
+        LoaderParameters params = new LoaderParameters(experimentId, analysisProcedureCriteria);
         return new ExperimentFeatureVectorSummaryLoader(session, businessObjectFactory, daoFactory,
                 settings).loadExperimentFeatureVectors(params);
     }
@@ -189,7 +191,7 @@ public class ExperimentFeatureVectorSummaryLoader extends AbstractContentLoader
 
         Set<PlateIdentifier> plateIdentifiers = extractIdentifiers(plates);
         WellFeatureCollection<FeatureVectorValues> featureVectorsCollection =
-                tryLoadWellSingleFeatureVectors(plateIdentifiers, params.analysisProcedureOrNull);
+                tryLoadWellSingleFeatureVectors(plateIdentifiers, params.analysisProcedureCriteria);
         if (featureVectorsCollection == null)
         {
             return null; // no feature vector datasets connected to plates in this experiment
@@ -201,11 +203,12 @@ public class ExperimentFeatureVectorSummaryLoader extends AbstractContentLoader
     }
 
     private WellFeatureCollection<FeatureVectorValues> tryLoadWellSingleFeatureVectors(
-            Set<PlateIdentifier> plateIdentifiers, String analysisProcedureOrNull)
+            Set<PlateIdentifier> plateIdentifiers,
+            AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         return new WellFeatureCollectionLoader(session, businessObjectFactory, daoFactory)
                 .tryLoadWellSingleFeatureVectors(plateIdentifiers, settings.getFeatureCodes(),
-                        analysisProcedureOrNull);
+                        analysisProcedureCriteria);
     }
 
     private static ExperimentFeatureVectorSummary createEmptySummary(ExperimentReference experiment)
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 40544e10eae02458eef6b07534f0e6a6cbf56244..b9dd88bb4a3badd3666f45db776581b4419c184d 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
@@ -27,6 +27,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.commons.lang.StringUtils;
+
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
@@ -36,6 +38,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObject
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 
 /**
  * @author Chandrasekhar Ramakrishnan
@@ -47,7 +50,7 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
     // Parameter state
     private final String featureVectorDatasetTypeCode;
 
-    private final String analysisProcedureOrNull;
+    private final AnalysisProcedureCriteria analysisProcedureCriteria;
 
     // Running state
     private Collection<ExternalData> featureVectorDatasets;
@@ -56,18 +59,20 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
             IScreeningBusinessObjectFactory businessObjectFactory, String homeSpaceOrNull,
             Set<? extends PlateIdentifier> plates)
     {
-        this(session, businessObjectFactory, homeSpaceOrNull, plates, null);
+        this(session, businessObjectFactory, homeSpaceOrNull, plates, AnalysisProcedureCriteria
+                .createAllProcedures());
     }
 
     FeatureVectorDatasetLoader(Session session,
             IScreeningBusinessObjectFactory businessObjectFactory, String homeSpaceOrNull,
-            Set<? extends PlateIdentifier> plates, String analysisProcedureOrNull)
+            Set<? extends PlateIdentifier> plates,
+            AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         super(session, businessObjectFactory, homeSpaceOrNull, plates,
                 ScreeningConstants.ANY_HCS_IMAGE_DATASET_TYPE_PATTERN,
                 ScreeningConstants.HCS_IMAGE_ANALYSIS_DATASET_TYPE_PATTERN);
         featureVectorDatasetTypeCode = ScreeningConstants.HCS_IMAGE_ANALYSIS_DATASET_TYPE_PATTERN;
-        this.analysisProcedureOrNull = analysisProcedureOrNull;
+        this.analysisProcedureCriteria = analysisProcedureCriteria;
     }
 
     public static class FeatureVectorExternalData
@@ -141,14 +146,20 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
 
     private boolean isMatchingAnalysisProcedure(ExternalData dataset)
     {
+        if (analysisProcedureCriteria.isAllProcedures())
+        {
+            return true;
+        }
+
         String dataSetAnalysisProcedure =
                 EntityHelper.tryFindPropertyValue(dataset, ScreeningConstants.ANALYSIS_PROCEDURE);
-        if (analysisProcedureOrNull == null)
+        if (analysisProcedureCriteria.isNoProcedures())
         {
-            return dataSetAnalysisProcedure == null;
+            return StringUtils.isBlank(dataSetAnalysisProcedure);
         } else
         {
-            return analysisProcedureOrNull.equals(dataSetAnalysisProcedure);
+            String analysisProcedureCode = analysisProcedureCriteria.tryGetAnalysisProcedureCode();
+            return analysisProcedureCode.equals(dataSetAnalysisProcedure);
         }
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java
index 66a8e59df6f1af83e36f6557067360673c83828e..84ae45f9c16b01fbba9f0af6056f6a0e9d59aaa7 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java
@@ -38,6 +38,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifi
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.FeatureValue;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.FeatureVectorValues;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.FeatureVectorLoader.WellFeatureCollection;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.IHCSFeatureVectorLoader;
 
@@ -56,12 +57,13 @@ public class WellFeatureCollectionLoader extends AbstractContentLoader
 
     /** Loads feature vectors for chosen plates and set of features */
     public WellFeatureCollection<FeatureVectorValues> tryLoadWellSingleFeatureVectors(
-            Set<PlateIdentifier> plates, List<String> featureCodes, String analysisProcedureOrNull)
+            Set<PlateIdentifier> plates, List<String> featureCodes,
+            AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         StopWatch watch = new StopWatch();
         watch.start();
         FeatureVectorDatasetLoader datasetsRetriever =
-                createFeatureVectorDatasetsRetriever(plates, analysisProcedureOrNull);
+                createFeatureVectorDatasetsRetriever(plates, analysisProcedureCriteria);
         Collection<ExternalData> featureVectorDatasets =
                 datasetsRetriever.getFeatureVectorDatasets();
         if (featureVectorDatasets.isEmpty())
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
index 0795eb6b57b2d060133c74ff4801511654d59bcb..21059c87462c19b1019cb5b86ae247a9d8bf7e19 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
@@ -61,6 +61,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellReplicaImage;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
@@ -223,7 +224,7 @@ public interface IScreeningServer extends IServer
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public ExperimentFeatureVectorSummary getExperimentFeatureVectorSummary(String sessionToken,
             @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId,
-            String analysisProcedureOrNull);
+            AnalysisProcedureCriteria analysisProcedureCriteria);
 
     /**
      * Returns a feature vector summary (with details for each replica) for the given experiment and
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
index 3ff4eef19a9569788f11bc8a2a3a5456ffdb78ef..21fda21124aaee14ac4023ab9b0cabd86b0fd767 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
@@ -436,30 +436,69 @@ public class WellSearchCriteria implements ISerializable
     {
         private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
-        private String analysisProcedureCodeOrNull;
+        public static enum MatchType implements ISerializable
+        {
+            /** match data sets for explicitly specified analysis procedure code. */
+            BY_CODE,
+            /** match any data set */
+            ANY,
+            /** match data sets having no analysis procedure property */
+            NONE
+        }
+
+        public static AnalysisProcedureCriteria createFromCode(String code)
+        {
+            if (StringUtils.isBlank(code))
+            {
+                throw new IllegalArgumentException("Cannot construct analysis procedure search "
+                        + "criteria of this type without a specified code.");
+            }
+            return new AnalysisProcedureCriteria(MatchType.BY_CODE, code);
+        }
 
         public static AnalysisProcedureCriteria createAllProcedures()
         {
-            // TODO KE: could we improve this ?
-            return new AnalysisProcedureCriteria();
+            return new AnalysisProcedureCriteria(MatchType.ANY, null);
         }
 
-        public static AnalysisProcedureCriteria createFromCode(String codeOrNull)
+        public static AnalysisProcedureCriteria createNoProcedures()
         {
-            return new AnalysisProcedureCriteria(codeOrNull);
+            return new AnalysisProcedureCriteria(MatchType.NONE, null);
         }
 
+
+        private MatchType matchType;
+
+        private String analysisProcedureCodeOrNull;
+
         // GWT only
         @SuppressWarnings("unused")
         private AnalysisProcedureCriteria()
         {
         }
 
-        private AnalysisProcedureCriteria(String analysisProcedureCodeOrNull)
+        private AnalysisProcedureCriteria(MatchType matchType, String analysisProcedureCodeOrNull)
         {
+            this.matchType = matchType;
             this.analysisProcedureCodeOrNull = analysisProcedureCodeOrNull;
         }
 
+        /**
+         * Return true if this criteria selects all data sets regardless of their property values.
+         */
+        public boolean isAllProcedures()
+        {
+            return matchType == MatchType.ANY;
+        }
+
+        /**
+         * Return true if this criteria selects only data sets without APs, false otherwise.
+         */
+        public boolean isNoProcedures()
+        {
+            return matchType == MatchType.NONE;
+        }
+
         public String tryGetAnalysisProcedureCode()
         {
             return analysisProcedureCodeOrNull;