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 f2760142ef2c3bbb24ed2629c2802155ed63c1c6..65825c2954c23912e31feb4bf48d946818654cff 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
@@ -52,6 +52,7 @@ 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.ExperimentSearchByProjectCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
 /**
  * Service interface for the <i>screening</i> <i>GWT</i> client.
@@ -228,8 +229,9 @@ public interface IScreeningClientService extends IClientService
             throws UserFailureException;
 
     /**
-     * Return all analysis procedures for an experiment.
+     * Return all analysis procedures for an experiment criteria.
      */
-    public AnalysisProcedures listAnalysisProcedures(TechId experimentId);
+    public AnalysisProcedures listAnalysisProcedures(
+            ExperimentSearchCriteria experimentSearchCriteria);
 
 }
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 5600a738368aa01cc6ecf634f7bbc913cd2ddad8..2881438211166c585f9df9dd3bf962fb53b17191 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
@@ -53,6 +53,7 @@ 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.ExperimentSearchByProjectCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
 /**
  * Service interface for the <i>screening</i> <i>GWT</i> client.
@@ -222,9 +223,9 @@ public interface IScreeningClientServiceAsync extends IClientServiceAsync
             AsyncCallback<String> callback);
 
     /**
-     * @see IScreeningClientService#listAnalysisProcedures(TechId)
+     * @see IScreeningClientService#listAnalysisProcedures(ExperimentSearchCriteria)
      */
-    public void listAnalysisProcedures(TechId experimentId,
+    public void listAnalysisProcedures(ExperimentSearchCriteria experimentSearchCriteria,
             AsyncCallback<AnalysisProcedures> 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 7f038694017f19f55e9128a38d7948d006bf5b4a..44ca3b404d6b12eaffe9e47cf7c75dce9e31c748 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
@@ -25,23 +25,28 @@ import com.extjs.gxt.ui.client.event.Events;
 import com.extjs.gxt.ui.client.event.Listener;
 import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.HorizontalPanel;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.VerticalPanel;
 import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
 import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
 import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem;
 
 import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
 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.ExperimentSearchCriteriaHolder;
 
 /**
  * An UI panel for selecting analysis procedures.
  * 
  * @author Kaloyan Enimanev
  */
-class AnalysisProcedureChooser extends HorizontalPanel
+class AnalysisProcedureChooser extends LayoutContainer
 {
 
     /**
@@ -53,11 +58,36 @@ class AnalysisProcedureChooser extends HorizontalPanel
         void analysisProcedureSelected(String analysisProcedureOrNull);
     }
 
-    private final static String UNSPECIFIED_ANALYSIS_PROCEDURE = "unspecified";
+    public static final AnalysisProcedureChooser createHorizontal(
+            IViewContext<IScreeningClientServiceAsync> viewContext,
+            ExperimentSearchCriteriaHolder experimentCriteriaHolder,
+            String selectedAnalysisProcedureOrNull,
+            IAnalysisProcedureSelectionListener selectionListener)
+    {
+        return new AnalysisProcedureChooser(viewContext, experimentCriteriaHolder,
+                selectedAnalysisProcedureOrNull, selectionListener, new HorizontalPanel());
+    }
+
+    public static final AnalysisProcedureChooser createVertical(
+            IViewContext<IScreeningClientServiceAsync> viewContext,
+            ExperimentSearchCriteriaHolder experimentCriteriaHolder,
+            String selectedAnalysisProcedureOrNull,
+            IAnalysisProcedureSelectionListener selectionListener)
+    {
+
+        final VerticalPanel layoutPanel = new VerticalPanel();
+        layoutPanel.setWidth(200);
+        return new AnalysisProcedureChooser(viewContext, experimentCriteriaHolder,
+                selectedAnalysisProcedureOrNull, selectionListener, layoutPanel);
+    }
+
+    private final static String ANY_ANALYSIS_PROCEDURE = "Any";
 
     private final IViewContext<IScreeningClientServiceAsync> viewContext;
     private final IAnalysisProcedureSelectionListener selectionListener;
 
+    private final ExperimentSearchCriteriaHolder experimentCriteriaHolder;
+
     private SimpleComboBox<String> analysisProceduresComboBox;
 
     private final Listener<BaseEvent> selectionChangeListener = new Listener<BaseEvent>()
@@ -70,24 +100,48 @@ class AnalysisProcedureChooser extends HorizontalPanel
 
         };
 
-    public AnalysisProcedureChooser(IViewContext<IScreeningClientServiceAsync> viewContext,
-            List<String> analysisProcedures,
+    private AnalysisProcedureChooser(IViewContext<IScreeningClientServiceAsync> viewContext,
+            ExperimentSearchCriteriaHolder experimentCriteriaHolder,
             String selectedAnalysisProcedureOrNull,
-            IAnalysisProcedureSelectionListener selectionListener)
+            IAnalysisProcedureSelectionListener selectionListener, LayoutContainer layoutPanel)
     {
         this.viewContext = viewContext;
         this.selectionListener = selectionListener;
+        this.experimentCriteriaHolder = experimentCriteriaHolder;
+
         analysisProceduresComboBox = createProceduresComboBox();
 
-        setAutoHeight(true);
-        setAutoWidth(true);
+        add(layoutPanel);
+        layoutPanel.setAutoHeight(true);
+        layoutPanel.add(createComboLabel());
+        layoutPanel.add(analysisProceduresComboBox);
+
+        refresh(selectedAnalysisProcedureOrNull);
+    }
+
+    public void updateAnalysisProcedures()
+    {
+        String selection = analysisProceduresComboBox.getSimpleValue();
+        String selectedProcedureOrNull = comboBoxValueToAnalysisProcedure(selection);
+        refresh(selectedProcedureOrNull);
+    }
+
+    private void refresh(final String selectedAnalysisProcedureOrNull)
+    {
 
-        add(createComboLabel());
-        add(analysisProceduresComboBox);
-        addAnalysisProcedures(analysisProcedures);
+        analysisProceduresComboBox.removeAll();
 
+        viewContext.getService().listAnalysisProcedures(experimentCriteriaHolder.tryGetCriteria(),
+                new AbstractAsyncCallback<AnalysisProcedures>(viewContext)
+                    {
+                        @Override
+                        protected void process(AnalysisProcedures analysisProcedures)
+                        {
+                            addAnalysisProcedures(analysisProcedures.getProcedureCodes());
+                            setInitialSelection(selectedAnalysisProcedureOrNull);
+                        }
+                    });
 
-        setInitialSelection(selectedAnalysisProcedureOrNull);
     }
 
     private Component createComboLabel()
@@ -103,6 +157,7 @@ class AnalysisProcedureChooser extends HorizontalPanel
     {
         SimpleComboBox<String> comboBox = new SimpleComboBox<String>();
 
+        comboBox.setWidth(160);
         comboBox.setTriggerAction(TriggerAction.ALL);
         comboBox.setAllowBlank(false);
         comboBox.setEditable(false);
@@ -130,8 +185,8 @@ class AnalysisProcedureChooser extends HorizontalPanel
         Collections.sort(sortedCodes);
 
         // unspecified is always an option and is always displayed at the end
-        sortedCodes.remove(UNSPECIFIED_ANALYSIS_PROCEDURE);
-        sortedCodes.add(UNSPECIFIED_ANALYSIS_PROCEDURE);
+        sortedCodes.remove(ANY_ANALYSIS_PROCEDURE);
+        sortedCodes.add(ANY_ANALYSIS_PROCEDURE);
 
         return sortedCodes;
     }
@@ -146,6 +201,7 @@ class AnalysisProcedureChooser extends HorizontalPanel
 
     private void setInitialSelection(String value)
     {
+        // TODO KE: this is a logic we might want to review
         String analysisProcedureOrNull = value;
         if (StringUtils.isBlank(analysisProcedureOrNull))
         {
@@ -154,7 +210,7 @@ class AnalysisProcedureChooser extends HorizontalPanel
 
         String comboBoxValue = analysisCodeToComboBoxValue(analysisProcedureOrNull);
 
-        if (UNSPECIFIED_ANALYSIS_PROCEDURE.equals(comboBoxValue)
+        if (ANY_ANALYSIS_PROCEDURE.equals(comboBoxValue)
                 || analysisProceduresComboBox.findModel(comboBoxValue) == null)
         {
             comboBoxValue = getFirstValueFromCombo();
@@ -201,12 +257,12 @@ class AnalysisProcedureChooser extends HorizontalPanel
 
     private String analysisCodeToComboBoxValue(String analysisProcedureOrNull)
     {
-        return StringUtils.isBlank(analysisProcedureOrNull) ? UNSPECIFIED_ANALYSIS_PROCEDURE
+        return StringUtils.isBlank(analysisProcedureOrNull) ? ANY_ANALYSIS_PROCEDURE
                 : analysisProcedureOrNull;
     }
 
     private String comboBoxValueToAnalysisProcedure(String comboBoxValue)
     {
-        return UNSPECIFIED_ANALYSIS_PROCEDURE.equals(comboBoxValue) ? null : comboBoxValue;
+        return ANY_ANALYSIS_PROCEDURE.equals(comboBoxValue) ? null : comboBoxValue;
     }
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java
index 720b3be88ac4105518ca2991d77ad6d48831f361..49a407df67dd7ea1a2af32366c3a0dfcca0cd009 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java
@@ -1,16 +1,15 @@
 package ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableTabContent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.AnalysisProcedureChooser.IAnalysisProcedureSelectionListener;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.AnalysisProcedures;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteriaHolder;
 
 /**
  * Experiment section panel which shows all feature vector summary for a given experiment.
@@ -62,33 +61,27 @@ public class ExperimentAnalysisSummarySection extends DisposableTabContent
 
     private void showAnalysisProcedureChooser()
     {
-        TechId experimentId = new TechId(experiment.getId());
-        screeningViewContext.getService().listAnalysisProcedures(experimentId,
-                new AbstractAsyncCallback<AnalysisProcedures>(screeningViewContext)
-                    {
-                        @Override
-                        protected void process(AnalysisProcedures analysisProcedures)
-                        {
-                            setHeading("");
-                            getHeader().setVisible(true);
-                            final AnalysisProcedureChooser analysisProcedureChooser =
-                                    createAnalysisProcedureChooser(analysisProcedures);
-                            getHeader().addTool(analysisProcedureChooser);
-                            // WORKAROUND to GXT private widgetPanel in Header with fixed
-                            // "float: right" set onRender
-                            analysisProcedureChooser.getParent().addStyleName("force-float-left");
-
-                            replaceContent(analysisGridDisposableComponent);
-                        }
-                    });
+        final AnalysisProcedureChooser analysisProcedureChooser = createAnalysisProcedureChooser();
+
+        setHeading("");
+        getHeader().setVisible(true);
+        getHeader().addTool(analysisProcedureChooser);
+        // WORKAROUND to GXT private widgetPanel in Header with fixed
+        // "float: right" set onRender
+        analysisProcedureChooser.getParent().addStyleName("force-float-left");
+
+        replaceContent(analysisGridDisposableComponent);
     }
 
-    private AnalysisProcedureChooser createAnalysisProcedureChooser(
-            AnalysisProcedures analysisProcedures)
+    private AnalysisProcedureChooser createAnalysisProcedureChooser()
     {
-        return new AnalysisProcedureChooser(screeningViewContext,
-                analysisProcedures.getProcedureCodes(), null,
-                getGridAsListener());
+        ExperimentSearchCriteria experimentCriteria =
+            ExperimentSearchCriteria.createExperiment(experiment);
+        
+        ExperimentSearchCriteriaHolder criteriaHolder = new ExperimentSearchCriteriaHolder(experimentCriteria);
+
+        return AnalysisProcedureChooser.createHorizontal(screeningViewContext, criteriaHolder,
+                null, getGridAsListener());
     }
 
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java
index f324820193abc961e15ac87af5f4556e7f16534c..c780aa034435f1f853c5bb88ceb3a850defee4eb 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java
@@ -28,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.material.GenericMaterialViewer;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
 /**
@@ -79,9 +80,13 @@ public class ImagingMaterialViewer extends GenericMaterialViewer
         boolean restrictGlobalScopeLinkToProject =
                 isRestrictGlobalScopeLinkToProject(initialExperimentCriteriaOrNull);
 
+        AnalysisProcedureCriteria analysisProcedureCriteria =
+                AnalysisProcedureCriteria.createAllProcedures();
+
         WellSearchMaterialSection wellSearchSection =
                 new WellSearchMaterialSection(screeningViewContext, materialId,
-                        initialExperimentCriteriaOrNull, restrictGlobalScopeLinkToProject);
+                        initialExperimentCriteriaOrNull, analysisProcedureCriteria,
+                        restrictGlobalScopeLinkToProject);
         sections.add(wellSearchSection);
 
         MaterialMergedSummarySection summarySection =
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java
index 19664b5b3eb722ee95cf871c2430e73ca7f45383..68cbe32ba683f6996b47965195da7d65eaa7fc8d 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java
@@ -71,7 +71,7 @@ class SingleOrAllExperimentsChooser extends LayoutContainer
         ExperimentChooserFieldAdaptor singleExperimentChooser = createSingleExperimentChooser();
         RadioGroup experimentRadioChooser = createExperimentRadio(singleExperimentChooser);
 
-        setWidth(400);
+        setWidth(380);
         add(experimentRadioChooser);
         add(singleExperimentChooser.getField());
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchComponent.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchComponent.java
index 6f3ddba03f18949c07ca61c650eccd0737c2c8c6..b3ec6264790471a42bf418e12a2a4576bf70e325 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchComponent.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchComponent.java
@@ -28,6 +28,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.DisplayTypeIDGenerator;
 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.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.MaterialSearchCodesCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.MaterialSearchCriteria;
@@ -207,7 +208,8 @@ public class WellSearchComponent extends TabContent
             return;
         }
         WellSearchGrid.openTab(screeningViewContext, experimentSearchCriteria,
-                MaterialSearchCriteria.create(materialCriteria), showCombinedResults.getValue());
+                MaterialSearchCriteria.create(materialCriteria),
+                AnalysisProcedureCriteria.createAllProcedures(), showCombinedResults.getValue());
     }
 
     private MaterialSearchCodesCriteria tryGetMaterialSearchCriteria()
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 5318d3026ed92c6abee8a233844defd6e52888e4..f0b23d0b59481d8fd9e1da9f270d7674b959b372 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
@@ -47,6 +47,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.Co
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListenerAndLinkGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
@@ -65,6 +66,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.C
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningDisplayTypeIDGenerator;
+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.detailviewers.ChannelWidgetWithListener.ISimpleChanneledViewerFactory;
 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.DatasetImagesReference;
@@ -72,6 +74,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetReferen
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ImageDatasetParameters;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent;
 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.ExperimentSearchCriteriaHolder;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.MaterialSearchCriteria;
@@ -80,7 +83,8 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.WellSear
 /**
  * @author Franz-Josef Elmer
  */
-public class WellSearchGrid extends TypedTableGrid<WellContent>
+public class WellSearchGrid extends TypedTableGrid<WellContent> implements
+        IAnalysisProcedureSelectionListener
 {
     public static final String BROWSER_ID = GenericConstants.ID_PREFIX
             + "PlateMaterialReviewer2Grid";
@@ -93,6 +97,7 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
     public static void openTab(
             final IViewContext<IScreeningClientServiceAsync> screeningViewContext,
             final String experimentPermId, final MaterialSearchCriteria materialSearchCriteria,
+            final AnalysisProcedureCriteria analysisProcedureCriteria,
             final boolean showCombinedResults)
     {
         screeningViewContext.getCommonService().getEntityInformationHolder(EntityKind.EXPERIMENT,
@@ -105,7 +110,8 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
                         {
                             TechId experimentId = new TechId(experimentIdentifier.getId());
                             WellSearchGrid.openTab(screeningViewContext, experimentId,
-                                    materialSearchCriteria, showCombinedResults);
+                                    materialSearchCriteria, analysisProcedureCriteria,
+                                    showCombinedResults);
                         }
                     });
     }
@@ -114,6 +120,7 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
     private static void openTab(
             final IViewContext<IScreeningClientServiceAsync> screeningViewContext,
             TechId experimentId, final MaterialSearchCriteria materialSearchCriteria,
+            final AnalysisProcedureCriteria analysisProcedureCriteria,
             final boolean showCombinedResults)
     {
         screeningViewContext.getCommonService().getExperimentInfo(experimentId,
@@ -125,17 +132,21 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
                             ExperimentSearchCriteria experimentCriteria =
                                     ExperimentSearchCriteria.createExperiment(experiment);
                             WellSearchGrid.openTab(screeningViewContext, experimentCriteria,
-                                    materialSearchCriteria, showCombinedResults);
+                                    materialSearchCriteria, analysisProcedureCriteria,
+                                    showCombinedResults);
                         }
                     });
     }
 
     public static void openTab(final IViewContext<IScreeningClientServiceAsync> viewContext,
             final ExperimentSearchCriteria experimentCriteria,
-            final MaterialSearchCriteria materialCriteria, final boolean showCombinedResults)
+            final MaterialSearchCriteria materialCriteria,
+            final AnalysisProcedureCriteria analysisProcedureCriteria,
+            final boolean showCombinedResults)
     {
         WellSearchCriteria searchCriteria =
-                new WellSearchCriteria(experimentCriteria, materialCriteria);
+                new WellSearchCriteria(experimentCriteria, materialCriteria,
+                        analysisProcedureCriteria);
         if (showCombinedResults)
         {
             openWellSearchTab(viewContext, searchCriteria);
@@ -157,7 +168,8 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
                     IDisposableComponent grid =
                             WellSearchGrid.create(viewContext,
                                     searchCriteria.getExperimentCriteria(),
-                                    searchCriteria.getMaterialSearchCriteria());
+                                    searchCriteria.getMaterialSearchCriteria(),
+                                    searchCriteria.getAnalysisProcedureCriteria());
                     return DefaultTabItem.create(getTabTitle(), grid, viewContext);
                 }
 
@@ -192,10 +204,11 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
     public static IDisposableComponent create(
             IViewContext<IScreeningClientServiceAsync> viewContext,
             ExperimentSearchCriteria experimentCriteriaOrNull, TechId materialId,
+            AnalysisProcedureCriteria analysisProcedureCriteria,
             boolean restrictGlobalScopeLinkToProject)
     {
         return create(viewContext, experimentCriteriaOrNull,
-                MaterialSearchCriteria.createIdCriteria(materialId),
+                MaterialSearchCriteria.createIdCriteria(materialId), analysisProcedureCriteria,
                 restrictGlobalScopeLinkToProject);
     }
 
@@ -204,18 +217,23 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
     private static IDisposableComponent create(
             IViewContext<IScreeningClientServiceAsync> viewContext,
             ExperimentSearchCriteria experimentCriteriaOrNull,
-            MaterialSearchCriteria materialCriteria)
+            MaterialSearchCriteria materialCriteria,
+            AnalysisProcedureCriteria analysisProcedureCriteria)
     {
-        return create(viewContext, experimentCriteriaOrNull, materialCriteria, false);
+        return create(viewContext, experimentCriteriaOrNull, materialCriteria,
+                analysisProcedureCriteria, false);
     }
 
     private static IDisposableComponent create(
             IViewContext<IScreeningClientServiceAsync> viewContext,
             ExperimentSearchCriteria experimentCriteriaOrNull,
-            MaterialSearchCriteria materialCriteria, boolean restrictGlobalScopeLinkToProject)
+            MaterialSearchCriteria materialCriteria,
+            AnalysisProcedureCriteria analysisProcedureCriteria,
+            boolean restrictGlobalScopeLinkToProject)
     {
         WellSearchGrid reviewer =
                 new WellSearchGrid(viewContext, experimentCriteriaOrNull, materialCriteria,
+                        analysisProcedureCriteria,
                         restrictGlobalScopeLinkToProject);
         final ToolBar toolbar = reviewer.createToolbar();
         return reviewer.asDisposableWithToolbar(new IDisposableComponent()
@@ -250,9 +268,14 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
 
     private ChannelChooserPanel channelChooser;
 
+    // field value can change
+    private AnalysisProcedureCriteria analysisProcedureCriteria;
+
     private WellSearchGrid(IViewContext<IScreeningClientServiceAsync> viewContext,
             ExperimentSearchCriteria experimentCriteriaOrNull,
-            MaterialSearchCriteria materialCriteria, boolean restrictGlobalScopeLinkToProject)
+            MaterialSearchCriteria materialCriteria,
+            AnalysisProcedureCriteria analysisProcedureCriteria,
+            boolean restrictGlobalScopeLinkToProject)
     {
         super(viewContext.getCommonViewContext(), BROWSER_ID, experimentCriteriaOrNull != null,
                 DisplayTypeIDGenerator.PLATE_MATERIAL_REVIEWER);
@@ -262,6 +285,7 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
         this.experimentCriteriaHolder =
                 new ExperimentSearchCriteriaHolder(experimentCriteriaOrNull);
         this.materialCriteria = materialCriteria;
+        this.analysisProcedureCriteria = analysisProcedureCriteria;
 
         final IDefaultChannelState defaultChannelState =
                 createDefaultChannelState(viewContext, experimentCriteriaOrNull);
@@ -512,16 +536,41 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
     private ToolBar createToolbar()
     {
         ToolBar toolbar = new ToolBar();
-        toolbar.add(createExperimentChooser());
+        AnalysisProcedureChooser analysisProcedureChooser = createAnalysisProcedureChooser();
+        toolbar.add(createExperimentChooser(analysisProcedureChooser));
+        toolbar.add(analysisProcedureChooser);
         toolbar.add(new Label(CHANNEL_CHOOSER_LABEL));
         toolbar.add(channelChooser);
         return toolbar;
     }
 
-    private Component createExperimentChooser()
+    private Component createExperimentChooser(AnalysisProcedureChooser analysisProcedureChooser)
     {
+        IDelegatedAction experimentSelectionChangedAction =
+                createExperimentSelectionChangedAction(analysisProcedureChooser);
         return new SingleOrAllExperimentsChooser(viewContext, experimentCriteriaHolder,
-                restrictGlobalScopeLinkToProject, createRefreshGridAction());
+                restrictGlobalScopeLinkToProject, experimentSelectionChangedAction);
+    }
+
+    protected final IDelegatedAction createExperimentSelectionChangedAction(
+            final AnalysisProcedureChooser analysisProcedureChooser)
+    {
+        return new IDelegatedAction()
+            {
+                public void execute()
+                {
+                    analysisProcedureChooser.updateAnalysisProcedures();
+                }
+            };
+    }
+
+
+    private AnalysisProcedureChooser createAnalysisProcedureChooser()
+    {
+        AnalysisProcedureChooser analysisProcedureChooser =
+                AnalysisProcedureChooser.createVertical(viewContext, experimentCriteriaHolder,
+                        null, this);
+        return analysisProcedureChooser;
     }
 
     @Override
@@ -597,7 +646,8 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
         assert experimentCriteriaOrNull != null : "experiment not specified";
 
         WellSearchCriteria searchCriteria =
-                new WellSearchCriteria(experimentCriteriaOrNull, materialCriteria);
+                new WellSearchCriteria(experimentCriteriaOrNull, materialCriteria,
+                        analysisProcedureCriteria);
         viewContext.getService().listPlateWells(resultSetConfig, searchCriteria, callback);
     }
 
@@ -615,4 +665,14 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
         return Arrays.asList(WellSearchGridColumnIds.PLATE, WellSearchGridColumnIds.WELL);
     }
 
+    public void analysisProcedureSelected(String analysisProcedureOrNull)
+    {
+        if (experimentCriteriaHolder.tryGetCriteria() != null)
+        {
+            this.analysisProcedureCriteria =
+                AnalysisProcedureCriteria.createFromCode(analysisProcedureOrNull);
+            refresh(true);
+        }
+    }
+
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchMaterialSection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchMaterialSection.java
index 1c5a9a2265db5617b33e89c3b8e4e1524f812ae9..213ae3c1f461f0cae8a5b527572fc24ed2d3a4fd 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchMaterialSection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchMaterialSection.java
@@ -6,6 +6,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ID
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.DisplayTypeIDGenerator;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
 /**
@@ -23,6 +24,7 @@ class WellSearchMaterialSection extends TabContent
     public WellSearchMaterialSection(
             IViewContext<IScreeningClientServiceAsync> screeningViewContext,
             final TechId materialId, ExperimentSearchCriteria experimentCriteriaOrNull,
+            AnalysisProcedureCriteria analysisProcedureCriteria,
             boolean restrictGlobalScopeLinkToProject)
     {
         super(
@@ -32,6 +34,7 @@ class WellSearchMaterialSection extends TabContent
         setHeaderVisible(false);
         this.reviewer =
                 WellSearchGrid.create(screeningViewContext, experimentCriteriaOrNull, materialId,
+                        analysisProcedureCriteria,
                         restrictGlobalScopeLinkToProject);
         setIds(DisplayTypeIDGenerator.PLATE_LOCATIONS_MATERIAL_SECTION);
     }
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 3a4a7226536acd199671914c3734458fb35b994f..0b61aa277e8fc73110d147486f30c567bd782fc8 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
@@ -10,6 +10,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.WellSearchGrid;
 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.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.MaterialSearchCodesCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.MaterialSearchCriteria;
@@ -47,6 +48,10 @@ public class WellSearchLocatorResolver extends AbstractViewLocatorResolver
         boolean exactMatchOnly =
                 getMandatoryBooleanParameter(locator,
                         ScreeningLinkExtractor.WELL_SEARCH_IS_EXACT_PARAMETER_KEY);
+
+        String analysisProcedureOrNull =
+                getOptionalParameter(locator, ScreeningLinkExtractor.ANALYSIS_PROCEDURE_KEY);
+
         boolean showCombinedResults =
                 getOptionalBooleanParameter(locator,
                         ScreeningLinkExtractor.WELL_SEARCH_SHOW_COMBINED_RESULTS_PARAMETER_KEY,
@@ -58,6 +63,11 @@ public class WellSearchLocatorResolver extends AbstractViewLocatorResolver
 
         MaterialSearchCriteria materialSearchCriteria =
                 MaterialSearchCriteria.create(materialCodesCriteria);
+
+        AnalysisProcedureCriteria analysisProcedureCriteria =
+                (analysisProcedureOrNull == null) ? AnalysisProcedureCriteria.createAllProcedures()
+                        : AnalysisProcedureCriteria.createFromCode(analysisProcedureOrNull);
+
         if (StringUtils.isBlank(experimentPermId))
         {
             ExperimentSearchCriteria criteria;
@@ -72,10 +82,12 @@ public class WellSearchLocatorResolver extends AbstractViewLocatorResolver
                                         spaceCode, projectCode));
             }
             WellSearchGrid.openTab(viewContext, criteria, materialSearchCriteria,
+                    analysisProcedureCriteria,
                     showCombinedResults);
         } else
         {
             WellSearchGrid.openTab(viewContext, experimentPermId, materialSearchCriteria,
+                    analysisProcedureCriteria,
                     showCombinedResults);
         }
 
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 e8ba0078cefbb803d8281eb9a97d64d776646eec..4ca6c89d46550c263c1e1ced9b0ba325ae0073d2 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
@@ -76,6 +76,7 @@ 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.ExperimentSearchByProjectCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
 /**
  * The {@link IScreeningClientService} implementation.
@@ -347,9 +348,10 @@ public final class ScreeningClientService extends AbstractClientService implemen
         return prepareExportEntities(criteria);
     }
 
-    public AnalysisProcedures listAnalysisProcedures(TechId experimentId)
+    public AnalysisProcedures listAnalysisProcedures(
+            ExperimentSearchCriteria experimentSearchCriteria)
     {
-        return server.listAnalysisProcedures(getSessionToken(), experimentId);
+        return server.listAnalysisProcedures(getSessionToken(), experimentSearchCriteria);
     }
 
 }
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 d7f3ee5ebde2cb46ce54d7dcaba85a2bb2f0ddf5..d178fee26ff1b1aeafb224a7992498446a491104 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
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.plugin.screening.server;
 import java.sql.Connection;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -110,6 +111,8 @@ 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.ExperimentSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria;
 
 /**
  * The concrete {@link IScreeningServer} implementation.
@@ -453,11 +456,24 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
         return createScreeningApiImpl(sessionToken).getDatasetIdentifiers(datasetCodes);
     }
 
-    public AnalysisProcedures listAnalysisProcedures(String sessionToken, TechId experimentId)
+    public AnalysisProcedures listAnalysisProcedures(String sessionToken,
+            ExperimentSearchCriteria experimentSearchCriteria)
     {
         checkSession(sessionToken);
         IScreeningQuery dao = createDAO(getDAOFactory());
-        List<String> procedureCodes = dao.listAnalysisProcedures(experimentId.getId());
+
+        SingleExperimentSearchCriteria singleExpCriteria =
+                (experimentSearchCriteria != null) ? experimentSearchCriteria.tryGetExperiment()
+                        : null;
+        List<String> procedureCodes = Collections.emptyList();
+        if (singleExpCriteria == null)
+        {
+            procedureCodes = dao.listAllAnalysisProcedures();
+        } else
+        {
+            procedureCodes =
+                    dao.listAnalysisProcedures(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 24ab08ab04ceac91fc85ba50f9f5737fd0d27871..525786d4d85809d36d061d2ef4c3b3b005dc9703 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
@@ -67,6 +67,7 @@ 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.ExperimentSearchByProjectCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
 /**
  * The <i>screening</i> specific {@link AbstractServerLogger} extension.
@@ -376,10 +377,12 @@ final class ScreeningServerLogger extends AbstractServerLogger implements IScree
         return null;
     }
 
-    public AnalysisProcedures listAnalysisProcedures(String sessionToken, TechId experimentId)
+    public AnalysisProcedures listAnalysisProcedures(String sessionToken,
+            ExperimentSearchCriteria experimentSearchCriteria)
     {
-        logAccess(sessionToken, "listAnalysisProcedures", "sessionToken(%s), experimentId(%s)",
-                sessionToken, experimentId);
+        logAccess(sessionToken, "listAnalysisProcedures",
+                "sessionToken(%s), experimentSearchCriteria(%s)", sessionToken,
+                experimentSearchCriteria);
         return null;
     }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/IScreeningQuery.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/IScreeningQuery.java
index 47c51623cc4b53655d195f6981aa2c32815fd9c2..feb94dce856bb28b6beb0223e709e71c7836c4a5 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/IScreeningQuery.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/IScreeningQuery.java
@@ -305,17 +305,20 @@ public interface IScreeningQuery extends BaseQuery
     public List<ExperimentReferenceQueryResult> getExperimentsWithMaterial(long materialId,
             long projectId);
 
-    @Select(sql = "select distinct "
-            + "       ds_props.value as value"
-            + "  from experiments exp "
-            + "       join data ds on ds.expe_id = exp.id "
-            + "       join data_set_types ds_type on ds.dsty_id = ds_type.id "
-            + "       join data_set_type_property_types  dst_pt on dst_pt.dsty_id = ds_type.id "
-            + "       left outer join data_set_properties ds_props on ds_props.ds_id = ds.id "
-            + "  where "
-            + "       exp.id = ?{1} "
-            + "       and "
-            + "       dst_pt.prty_id = (select id from property_types where code='ANALYSIS_PROCEDURE' and is_internal_namespace=true)")
+    
+    final static String ANALYSIS_PROCEDURE_SELECT = "select distinct "
+        + "       ds_props.value as value"
+        + "  from experiments exp "
+        + "       join data ds on ds.expe_id = exp.id "
+        + "       join data_set_types ds_type on ds.dsty_id = ds_type.id "
+        + "       join data_set_type_property_types  dst_pt on dst_pt.dsty_id = ds_type.id "
+        + "       left outer join data_set_properties ds_props on ds_props.ds_id = ds.id "
+        + "  where "
+        + "       dst_pt.prty_id = (select id from property_types where code='ANALYSIS_PROCEDURE' and is_internal_namespace=true)";
+    
+    @Select(sql = ANALYSIS_PROCEDURE_SELECT + " and exp.id = ?{1} ")
     public List<String> listAnalysisProcedures(long experimentId);
 
+    @Select(sql = ANALYSIS_PROCEDURE_SELECT)
+    public List<String> listAllAnalysisProcedures();
 }
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 14092853b9541e3c0941c0e36aab9186688ac47e..0795eb6b57b2d060133c74ff4801511654d59bcb 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
@@ -41,6 +41,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.DatasetReferencePredicate;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.ExperimentSearchCriteriaPredicate;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.MaterialExperimentFeatureVectorSummaryValidator;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.WellContentValidator;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.authorization.WellSearchCriteriaPredicate;
@@ -61,6 +62,7 @@ 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.ExperimentSearchByProjectCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 
 /**
  * The <i>screening</i> server. Used internally.
@@ -251,6 +253,6 @@ public interface IScreeningServer extends IServer
     @Transactional(readOnly = true)
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     public AnalysisProcedures listAnalysisProcedures(String sessionToken,
-            @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class) TechId experimentId);
+            @AuthorizationGuard(guardClass = ExperimentSearchCriteriaPredicate.class) ExperimentSearchCriteria experimentSearchCriteria);
 
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/ExperimentSearchCriteriaPredicate.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/ExperimentSearchCriteriaPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f9cd024e3cf45cbaeb86f3b48339b4d14b8078b
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/ExperimentSearchCriteriaPredicate.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2008 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.authorization;
+
+import java.util.List;
+
+import org.springframework.dao.DataAccessException;
+
+import ch.systemsx.cisd.common.exceptions.Status;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.IAuthorizationDataProvider;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.RoleWithIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.IPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SpaceIdentifierPredicate;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria;
+
+/**
+ * @author Tomasz Pylak
+ * @author Kaloyan Enimanev
+ */
+public final class ExperimentSearchCriteriaPredicate implements
+        IPredicate<ExperimentSearchCriteria>
+{
+    private final IPredicate<TechId> experimentPredicate;
+
+    private final SpaceIdentifierPredicate spacePredicate;
+
+    public ExperimentSearchCriteriaPredicate()
+    {
+        this.experimentPredicate = new ExperimentTechIdPredicate();
+        this.spacePredicate = new SpaceIdentifierPredicate();
+    }
+
+    public final void init(IAuthorizationDataProvider provider)
+    {
+        experimentPredicate.init(provider);
+        spacePredicate.init(provider);
+    }
+
+    public final Status evaluate(final PersonPE person,
+            final List<RoleWithIdentifier> allowedRoles, final ExperimentSearchCriteria value)
+    {
+        assert person != null : "Unspecified person";
+        assert allowedRoles != null : "Unspecified allowed roles";
+
+        if (value != null)
+        {
+            try
+            {
+                SingleExperimentSearchCriteria experiment = value.tryGetExperiment();
+                BasicProjectIdentifier project = value.tryGetProjectIdentifier();
+                if (experiment != null)
+                {
+                    return experimentPredicate.evaluate(person, allowedRoles,
+                            experiment.getExperimentId());
+                } else if (project != null)
+                {
+                    SpaceIdentifier space =
+                            new SpaceIdentifier(project.getInstanceCode(), project.getSpaceCode());
+                    return spacePredicate.evaluate(person, allowedRoles, space);
+                }
+            } catch (DataAccessException ex)
+            {
+                throw new UserFailureException(ex.getMessage(), ex);
+            }
+        }
+
+        return Status.OK;
+
+    }
+}
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/WellSearchCriteriaPredicate.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/WellSearchCriteriaPredicate.java
index 3d9a6d6d4980faf2db94ae31f652a1f66d7f2157..aac3f4869941cf7d084a6e21e534fc6edcb21c3a 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/WellSearchCriteriaPredicate.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/authorization/WellSearchCriteriaPredicate.java
@@ -16,76 +16,39 @@
 
 package ch.systemsx.cisd.openbis.plugin.screening.shared.authorization;
 
-import java.util.List;
-
-import org.springframework.dao.DataAccessException;
-
-import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.IAuthorizationDataProvider;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.RoleWithIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.IPredicate;
-import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.SpaceIdentifierPredicate;
-import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.DelegatedPredicate;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria;
 
 /**
  * @author Tomasz Pylak
+ * @author Kaloyan Enimanev
  */
-public final class WellSearchCriteriaPredicate implements IPredicate<WellSearchCriteria>
+public final class WellSearchCriteriaPredicate extends
+        DelegatedPredicate<ExperimentSearchCriteria, WellSearchCriteria>
 {
-    private final IPredicate<TechId> experimentPredicate;
-
-    private final SpaceIdentifierPredicate spacePredicate;
 
     public WellSearchCriteriaPredicate()
     {
-        this.experimentPredicate = new ExperimentTechIdPredicate();
-        this.spacePredicate = new SpaceIdentifierPredicate();
+        super(new ExperimentSearchCriteriaPredicate());
     }
 
-    public final void init(IAuthorizationDataProvider provider)
+    @Override
+    public ExperimentSearchCriteria tryConvert(WellSearchCriteria value)
     {
-        experimentPredicate.init(provider);
-        spacePredicate.init(provider);
-    }
-
-    public final Status evaluate(final PersonPE person,
-            final List<RoleWithIdentifier> allowedRoles, final WellSearchCriteria value)
-    {
-        assert person != null : "Unspecified person";
-        assert allowedRoles != null : "Unspecified allowed roles";
         if (value == null)
         {
             throw UserFailureException.fromTemplate("No well search criteria specified.");
         }
-        try
-        {
-            ExperimentSearchCriteria experimentCriteria = value.getExperimentCriteria();
-            SingleExperimentSearchCriteria experiment = experimentCriteria.tryGetExperiment();
-            BasicProjectIdentifier project = experimentCriteria.tryGetProjectIdentifier();
-            if (experiment != null)
-            {
-                return experimentPredicate.evaluate(person, allowedRoles,
-                        experiment.getExperimentId());
-            } else if (project != null)
-            {
-                SpaceIdentifier space =
-                        new SpaceIdentifier(project.getInstanceCode(), project.getSpaceCode());
-                return spacePredicate.evaluate(person, allowedRoles, space);
-            } else
-            {
-                return Status.OK;
-            }
-        } catch (DataAccessException ex)
-        {
-            throw new UserFailureException(ex.getMessage(), ex);
-        }
+
+        return value.getExperimentCriteria();
     }
+
+    @Override
+    public String getCandidateDescription()
+    {
+        return "Well search criteria";
+    }
+
 }
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 f443fba9bc7e5d57c14ac72758f5ab4a5281b5d0..3ff4eef19a9569788f11bc8a2a3a5456ffdb78ef 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
@@ -305,7 +305,7 @@ public class WellSearchCriteria implements ISerializable
         }
     }
 
-    public static final class MaterialSearchCodesCriteria implements IsSerializable, Serializable
+    public static final class MaterialSearchCodesCriteria implements ISerializable
     {
         private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
@@ -358,7 +358,7 @@ public class WellSearchCriteria implements ISerializable
         }
     }
 
-    public static final class MaterialSearchCriteria implements IsSerializable, Serializable
+    public static final class MaterialSearchCriteria implements ISerializable
     {
         private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
@@ -432,10 +432,52 @@ public class WellSearchCriteria implements ISerializable
         }
     }
 
+    public static final class AnalysisProcedureCriteria implements ISerializable
+    {
+        private static final long serialVersionUID = ServiceVersionHolder.VERSION;
+
+        private String analysisProcedureCodeOrNull;
+
+        public static AnalysisProcedureCriteria createAllProcedures()
+        {
+            // TODO KE: could we improve this ?
+            return new AnalysisProcedureCriteria();
+        }
+
+        public static AnalysisProcedureCriteria createFromCode(String codeOrNull)
+        {
+            return new AnalysisProcedureCriteria(codeOrNull);
+        }
+
+        // GWT only
+        @SuppressWarnings("unused")
+        private AnalysisProcedureCriteria()
+        {
+        }
+
+        private AnalysisProcedureCriteria(String analysisProcedureCodeOrNull)
+        {
+            this.analysisProcedureCodeOrNull = analysisProcedureCodeOrNull;
+        }
+
+        public String tryGetAnalysisProcedureCode()
+        {
+            return analysisProcedureCodeOrNull;
+        }
+
+        @Override
+        public String toString()
+        {
+            return "[Analysis procedure code '" + analysisProcedureCodeOrNull + "']";
+        }
+    }
+
     private MaterialSearchCriteria materialCriteria;
 
     private ExperimentSearchCriteria experimentCriteria;
 
+    private AnalysisProcedureCriteria analysisProcedureCriteria;
+
     // GWT
     @SuppressWarnings("unused")
     private WellSearchCriteria()
@@ -443,19 +485,23 @@ public class WellSearchCriteria implements ISerializable
     }
 
     public WellSearchCriteria(ExperimentSearchCriteria experimentCriteria,
-            MaterialSearchCriteria materialCriteria)
+            MaterialSearchCriteria materialCriteria,
+            AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         assert experimentCriteria != null;
         assert materialCriteria != null;
+        assert analysisProcedureCriteria != null;
 
         this.materialCriteria = materialCriteria;
         this.experimentCriteria = experimentCriteria;
+        this.analysisProcedureCriteria = analysisProcedureCriteria;
     }
 
     @Override
     public String toString()
     {
-        return "Search criteria: " + experimentCriteria + ", " + materialCriteria;
+        return "Search criteria: " + experimentCriteria + ", " + materialCriteria + ", "
+                + analysisProcedureCriteria;
     }
 
     /** null means all experiments */
@@ -469,6 +515,11 @@ public class WellSearchCriteria implements ISerializable
         return materialCriteria;
     }
 
+    public AnalysisProcedureCriteria getAnalysisProcedureCriteria()
+    {
+        return analysisProcedureCriteria;
+    }
+
     public static boolean shouldRestrictScopeToProject(
             ExperimentSearchCriteria searchCriteria)
     {
@@ -480,4 +531,5 @@ public class WellSearchCriteria implements ISerializable
     {
         return searchCriteria != null && searchCriteria.tryGetProjectIdentifier() != null;
     }
+
 }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoaderTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoaderTest.java
index 2a2eff1b06582bf09832a36941c48619bffae914..9ac5ac883f0195d6bf7d924740b0693f8da89a0c 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoaderTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoaderTest.java
@@ -35,6 +35,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObject
 import ch.systemsx.cisd.openbis.plugin.screening.server.dataaccess.AbstractScreeningDAOTest;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent;
 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.MaterialSearchCriteria;
 
@@ -64,7 +65,8 @@ public class WellContentLoaderTest extends AbstractScreeningDAOTest
         WellSearchCriteria searchCriteria =
                 new WellSearchCriteria(ExperimentSearchCriteria.createAllExperiments(),
                         MaterialSearchCriteria.createCodesCriteria(materialCodes,
-                                materialTypeCodes, false));
+                                materialTypeCodes, false),
+                        AnalysisProcedureCriteria.createFromCode(null));
 
         Session session = createSession(getSystemPerson());
         List<WellContent> wellContents =
@@ -89,7 +91,8 @@ public class WellContentLoaderTest extends AbstractScreeningDAOTest
         WellSearchCriteria searchCriteria =
                 new WellSearchCriteria(ExperimentSearchCriteria.createAllExperiments(),
                         MaterialSearchCriteria.createCodesCriteria(materialCodes,
-                                materialTypeCodes, false));
+                                materialTypeCodes, false),
+                        AnalysisProcedureCriteria.createFromCode(null));
 
         Session session = createSession(getSystemPerson());
         List<WellContent> wellContents =