From 211defe0a80622983ec848ea47f8079ba211064e Mon Sep 17 00:00:00 2001
From: tpylak <tpylak>
Date: Tue, 7 Jun 2011 15:35:23 +0000
Subject: [PATCH] LMS-2268 allow to specify project in 'all assays for a gene'
 view (only with the URL). Keep this setting when navigating between different
 views.

SVN: 21624
---
 .../application/ClientPluginFactory.java      |  89 ++++----
 .../application/ScreeningViewContext.java     |   4 -
 .../ExperimentAnalysisSummaryGrid.java        |  22 +-
 .../ExperimentAnalysisSummarySection.java     |   2 +-
 .../ExperimentAnalysisSummaryViewer.java      |  26 ++-
 .../ExperimentWellMaterialBrowserGrid.java    |  15 +-
 .../detailviewers/ImagingMaterialViewer.java  |  34 +++-
 .../MaterialDisambiguationGrid.java           |   2 +-
 ...aterialFeaturesFromAllExperimentsGrid.java |  23 ++-
 ...erialFeaturesFromAllExperimentsViewer.java |  20 +-
 ...erialFeaturesFromAllExpermentsSection.java |  10 +-
 .../MaterialReplicaSummaryComponent.java      |  80 +++++---
 .../MaterialReplicaSummarySection.java        |  19 +-
 .../MaterialReplicaSummaryViewer.java         |  69 ++++---
 .../detailviewers/WellContentDialog.java      |  12 +-
 .../detailviewers/WellSearchGrid.java         |  47 +++--
 .../ExperimentAnalysisSummaryResolver.java    |   7 +-
 .../ImagingMaterialLocatorResolver.java       |  76 ++++---
 ...ialFeaturesFromAllExperimentsResolver.java |  67 ------
 .../MaterialReplicaSummaryResolver.java       |  48 -----
 .../locator/WellSearchLocatorResolver.java    |  19 +-
 .../specific/ScreeningLinkExtractor.java      | 192 +++++++-----------
 .../ExperimentIdentifierSearchCriteria.java   |  46 ++++-
 .../screening/server/ScreeningServer.java     |  32 ++-
 .../server/dataaccess/IScreeningQuery.java    |  21 ++
 .../server/logic/WellContentLoader.java       |  44 ++--
 .../WellSearchCriteriaPredicate.java          |  66 ++++--
 .../shared/basic/dto/WellSearchCriteria.java  | 131 ++++++++++--
 .../java/BiozentrumMatLabApiTest.java         | 108 ++++++++--
 .../utils/EntityTypeLabelUtilsTest.java       |   8 +-
 .../server/dataaccess/ScreeningDAOTest.java   |  19 +-
 31 files changed, 794 insertions(+), 564 deletions(-)
 delete mode 100644 screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/MaterialFeaturesFromAllExperimentsResolver.java
 delete mode 100644 screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/MaterialReplicaSummaryResolver.java

diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
index df48e2f1c88..6f86cdbfb82 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ClientPluginFactory.java
@@ -48,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWit
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
@@ -65,9 +66,9 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.d
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.PlateSampleViewer;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.sample.LibrarySampleBatchRegistrationForm;
 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.ExperimentReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria;
 
 /**
@@ -185,11 +186,13 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Scree
      */
     public static final void openImagingExperimentViewer(
             final IEntityInformationHolderWithPermId experiment,
+            boolean restrictGlobalScopeLinkToProject,
             final IViewContext<IScreeningClientServiceAsync> viewContext)
     {
         if (viewContext.getModel().isEmbeddedMode())
         {
-            ExperimentAnalysisSummaryViewer.openTab(viewContext, new TechId(experiment));
+            ExperimentAnalysisSummaryViewer.openTab(viewContext, new TechId(experiment),
+                    restrictGlobalScopeLinkToProject);
         } else
         {
             new OpenEntityDetailsTabAction(experiment, viewContext).execute();
@@ -200,13 +203,15 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Scree
      * Creates a link to experiment detail viewer. In embedded mode the link will lead to the tab
      * which has only the content of the analysis summary panel.
      */
-    public static String createImagingExperimentViewerLink(ExperimentReference experiment,
+    public static String createImagingExperimentViewerLink(
+            IEntityInformationHolderWithPermId experiment,
+            boolean restrictGlobalScopeLinkToProject,
             IViewContext<IScreeningClientServiceAsync> viewContext)
     {
         if (viewContext.getModel().isEmbeddedMode())
         {
-            return ScreeningLinkExtractor.createExperimentAnalysisSummaryBrowserLink(experiment
-                    .getPermId());
+            return ScreeningLinkExtractor.createExperimentAnalysisSummaryBrowserLink(
+                    experiment.getPermId(), restrictGlobalScopeLinkToProject);
         } else
         {
             return LinkExtractor.tryExtract(experiment);
@@ -225,18 +230,26 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Scree
             final ExperimentSearchCriteria experimentCriteriaOrNull,
             final IViewContext<IScreeningClientServiceAsync> viewContext)
     {
-        String experimentPermId = tryGetExperimentPermId(experimentCriteriaOrNull);
         if (viewContext.getModel().isEmbeddedMode())
         {
             MaterialIdentifier materialIdentifier = asMaterialIdentifier(material);
-            if (experimentPermId != null)
+            ExperimentSearchByProjectCriteria multipleExperimentsScope =
+                    tryAsMultipleExperimentsCriteria(experimentCriteriaOrNull);
+            if (multipleExperimentsScope != null)
             {
-                MaterialReplicaSummaryViewer.openTab(viewContext, experimentPermId,
-                        materialIdentifier);
+                MaterialFeaturesFromAllExperimentsViewer.openTab(viewContext, materialIdentifier,
+                        multipleExperimentsScope);
             } else
             {
-                MaterialFeaturesFromAllExperimentsViewer.openTab(viewContext, materialIdentifier,
-                        null);
+                assert experimentCriteriaOrNull != null;
+                SingleExperimentSearchCriteria experiment =
+                        experimentCriteriaOrNull.tryGetExperiment();
+                assert experiment != null;
+
+                MaterialReplicaSummaryViewer.openTab(viewContext, experiment.getExperimentPermId(),
+                        experimentCriteriaOrNull.getRestrictGlobalSearchLinkToProject(),
+                        materialIdentifier);
+
             }
         } else
         {
@@ -244,35 +257,23 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Scree
         }
     }
 
-    /**
-     * Creates a link to material detail viewer. In embedded mode the link will lead to the tab
-     * which has only the replica summary panel (for a chosen experiment or for all of them,
-     * depending on the criteria).
-     */
-    public static String createImagingMaterialViewerLink(
-            final IEntityInformationHolderWithPermId material,
-            final ExperimentSearchCriteria experimentCriteria,
-            IViewContext<IScreeningClientServiceAsync> viewContext)
+    private static ExperimentSearchByProjectCriteria tryAsMultipleExperimentsCriteria(
+            ExperimentSearchCriteria experimentCriteriaOrNull)
     {
-        if (viewContext.getModel().isEmbeddedMode())
+        if (experimentCriteriaOrNull == null)
         {
-            SingleExperimentSearchCriteria experiment = experimentCriteria.tryGetExperiment();
-            String materialCode = material.getCode();
-            String materialTypeCode = material.getEntityType().getCode();
-            if (experiment != null)
-            {
-                return ScreeningLinkExtractor.createMaterialReplicaSummaryLink(
-                        experiment.getExperimentPermId(), materialCode, materialTypeCode);
-            } else
-            {
-                return ScreeningLinkExtractor.createMaterialFeaturesFromAllExperimentsLink(
-                        materialCode, materialTypeCode);
-            }
-        } else
+            return ExperimentSearchByProjectCriteria.createAllExperimentsForAllProjects();
+        }
+        if (experimentCriteriaOrNull.tryGetExperiment() != null)
+        {
+            return null;
+        }
+        BasicProjectIdentifier project = experimentCriteriaOrNull.tryGetProjectIdentifier();
+        if (project != null)
         {
-            return ScreeningLinkExtractor
-                    .tryCreateMaterialDetailsLink(material, experimentCriteria);
+            return ExperimentSearchByProjectCriteria.createAllExperimentsForProject(project);
         }
+        return ExperimentSearchByProjectCriteria.createAllExperimentsForAllProjects();
     }
 
     private static void openImagingMaterialGenericViewer(
@@ -286,22 +287,6 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<Scree
         DispatcherHelper.dispatchNaviEvent(tab);
     }
 
-    private static String tryGetExperimentPermId(ExperimentSearchCriteria criteriaOrNull)
-    {
-        if (criteriaOrNull == null)
-        {
-            return null;
-        }
-        SingleExperimentSearchCriteria singleExperiment = criteriaOrNull.tryGetExperiment();
-        if (singleExperiment != null)
-        {
-            return singleExperiment.getExperimentPermId();
-        } else
-        {
-            return null;
-        }
-    }
-
     private static MaterialIdentifier asMaterialIdentifier(
             IEntityInformationHolderWithPermId material)
     {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ScreeningViewContext.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ScreeningViewContext.java
index c6cdaaa0a9a..49d083e5d1b 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ScreeningViewContext.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ScreeningViewContext.java
@@ -11,8 +11,6 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningCli
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator.ExperimentAnalysisSummaryResolver;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator.GlobalWellSearchLocatorResolver;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator.ImagingMaterialLocatorResolver;
-import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator.MaterialFeaturesFromAllExperimentsResolver;
-import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator.MaterialReplicaSummaryResolver;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator.PlateMetadataBrowserLocatorResolver;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator.WellSearchLocatorResolver;
 
@@ -52,8 +50,6 @@ public final class ScreeningViewContext extends
         handlerRegistry.registerHandler(new WellSearchLocatorResolver(this));
         handlerRegistry.registerHandler(new GlobalWellSearchLocatorResolver(this));
         handlerRegistry.registerHandler(new ExperimentAnalysisSummaryResolver(this));
-        handlerRegistry.registerHandler(new MaterialReplicaSummaryResolver(this));
-        handlerRegistry.registerHandler(new MaterialFeaturesFromAllExperimentsResolver(this));
     }
 
     public static ScreeningDisplaySettingsManager getTechnologySpecificDisplaySettingsManager(
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 ba24315c542..dc24816f0f9 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
@@ -54,20 +54,21 @@ public class ExperimentAnalysisSummaryGrid extends TypedTableGrid<MaterialFeatur
     private static final String PREFIX = GenericConstants.ID_PREFIX
             + "experiment-feature-vector-summary";
 
-    public static final String BROWSER_ID = PREFIX + "_main";
-
-    public static final String GRID_ID = PREFIX + TypedTableGrid.GRID_POSTFIX;
+    private static final String BROWSER_ID = PREFIX + "_main";
 
     private final IViewContext<IScreeningClientServiceAsync> screeningViewContext;
 
     private final IEntityInformationHolderWithIdentifier experiment;
 
+    private final boolean restrictGlobalScopeLinkToProject;
+
     public static IDisposableComponent create(
             IViewContext<IScreeningClientServiceAsync> viewContext,
-            IEntityInformationHolderWithIdentifier experiment)
+            IEntityInformationHolderWithIdentifier experiment,
+            boolean restrictGlobalScopeLinkToProject)
     {
-        return new ExperimentAnalysisSummaryGrid(viewContext, experiment)
-                .asDisposableWithoutToolbar();
+        return new ExperimentAnalysisSummaryGrid(viewContext, experiment,
+                restrictGlobalScopeLinkToProject).asDisposableWithoutToolbar();
     }
 
     private ICellListenerAndLinkGenerator<MaterialFeatureVectorSummary> createMaterialReplicaSummaryLinkGenerator()
@@ -87,7 +88,7 @@ public class ExperimentAnalysisSummaryGrid extends TypedTableGrid<MaterialFeatur
                         ISerializableComparable comparableValue)
                 {
                     IEntityInformationHolder material = entity.getMaterial();
-                    return ScreeningLinkExtractor.tryCreateMaterialDetailsLink(material,
+                    return ScreeningLinkExtractor.createMaterialDetailsLink(material,
                             getExperimentAsSearchCriteria());
                 }
             };
@@ -101,16 +102,19 @@ public class ExperimentAnalysisSummaryGrid extends TypedTableGrid<MaterialFeatur
 
     private ExperimentSearchCriteria getExperimentAsSearchCriteria()
     {
-        return ExperimentSearchCriteria.createExperiment(experiment);
+        return ExperimentSearchCriteria.createExperiment(experiment,
+                restrictGlobalScopeLinkToProject);
     }
 
     ExperimentAnalysisSummaryGrid(IViewContext<IScreeningClientServiceAsync> viewContext,
-            final IEntityInformationHolderWithIdentifier experiment)
+            final IEntityInformationHolderWithIdentifier experiment,
+            boolean restrictGlobalScopeLinkToProject)
     {
         super(viewContext.getCommonViewContext(), BROWSER_ID, true,
                 DisplayTypeIDGenerator.EXPERIMENT_FEATURE_VECTOR_SUMMARY_SECTION);
         this.screeningViewContext = viewContext;
         this.experiment = experiment;
+        this.restrictGlobalScopeLinkToProject = restrictGlobalScopeLinkToProject;
 
         ICellListenerAndLinkGenerator<MaterialFeatureVectorSummary> linkGenerator =
                 createMaterialReplicaSummaryLinkGenerator();
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 1a55399b350..0cee03edc13 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
@@ -34,7 +34,7 @@ public class ExperimentAnalysisSummarySection extends DisposableTabContent
     @Override
     protected IDisposableComponent createDisposableContent()
     {
-        return ExperimentAnalysisSummaryGrid.create(screeningViewContext, experiment);
+        return ExperimentAnalysisSummaryGrid.create(screeningViewContext, experiment, false);
     }
 
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryViewer.java
index 5cddaa40882..079d2cbe37d 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryViewer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummaryViewer.java
@@ -44,7 +44,7 @@ public class ExperimentAnalysisSummaryViewer
 
     public static void openTab(
             final IViewContext<IScreeningClientServiceAsync> screeningViewContext,
-            String experimentPermId)
+            String experimentPermId, final boolean restrictGlobalScopeLinkToProject)
     {
         screeningViewContext.getCommonService().getEntityInformationHolder(EntityKind.EXPERIMENT,
                 experimentPermId,
@@ -54,14 +54,15 @@ public class ExperimentAnalysisSummaryViewer
                         protected void process(IEntityInformationHolderWithPermId experiment)
                         {
                             TechId experimentId = new TechId(experiment);
-                            openTab(screeningViewContext, experimentId);
+                            openTab(screeningViewContext, experimentId,
+                                    restrictGlobalScopeLinkToProject);
                         }
                     });
     }
 
     public static void openTab(
             final IViewContext<IScreeningClientServiceAsync> screeningViewContext,
-            TechId experimentId)
+            TechId experimentId, final boolean restrictGlobalScopeLinkToProject)
     {
         screeningViewContext.getCommonService().getExperimentInfo(experimentId,
                 new AbstractAsyncCallback<Experiment>(screeningViewContext)
@@ -70,7 +71,8 @@ public class ExperimentAnalysisSummaryViewer
                         protected void process(Experiment result)
                         {
                             AbstractTabItemFactory factory =
-                                    createTabFactory(screeningViewContext, result);
+                                    createTabFactory(screeningViewContext, result,
+                                            restrictGlobalScopeLinkToProject);
                             DispatcherHelper.dispatchNaviEvent(factory);
                         }
                     });
@@ -78,7 +80,8 @@ public class ExperimentAnalysisSummaryViewer
 
     private static AbstractTabItemFactory createTabFactory(
             final IViewContext<IScreeningClientServiceAsync> viewContext,
-            final IEntityInformationHolderWithProperties experiment)
+            final IEntityInformationHolderWithProperties experiment,
+            final boolean restrictGlobalScopeLinkToProject)
     {
         return new AbstractTabItemFactory()
             {
@@ -94,15 +97,16 @@ public class ExperimentAnalysisSummaryViewer
                 @Override
                 public ITabItem create()
                 {
-                    IDisposableComponent tabComponent = createViewer(viewContext, experiment);
+                    IDisposableComponent tabComponent =
+                            createViewer(viewContext, experiment, restrictGlobalScopeLinkToProject);
                     return DefaultTabItem.create(getTabTitle(), tabComponent, viewContext);
                 }
 
                 @Override
                 public String tryGetLink()
                 {
-                    return ScreeningLinkExtractor
-                            .createExperimentAnalysisSummaryBrowserLink(experiment.getPermId());
+                    return ScreeningLinkExtractor.createExperimentAnalysisSummaryBrowserLink(
+                            experiment.getPermId(), restrictGlobalScopeLinkToProject);
                 }
 
                 @Override
@@ -122,11 +126,13 @@ public class ExperimentAnalysisSummaryViewer
 
     private static IDisposableComponent createViewer(
             IViewContext<IScreeningClientServiceAsync> viewContext,
-            IEntityInformationHolderWithProperties experiment)
+            IEntityInformationHolderWithProperties experiment,
+            boolean restrictGlobalScopeLinkToProject)
     {
         String headingText = "Assay " + experiment.getCode();
         final IDisposableComponent gridComponent =
-                ExperimentAnalysisSummaryGrid.create(viewContext, experiment);
+                ExperimentAnalysisSummaryGrid.create(viewContext, experiment,
+                        restrictGlobalScopeLinkToProject);
 
         return MaterialComponentUtils.createExperimentViewer(viewContext, experiment, headingText,
                 gridComponent);
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentWellMaterialBrowserGrid.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentWellMaterialBrowserGrid.java
index 8c2308389bb..20dc5a0417c 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentWellMaterialBrowserGrid.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentWellMaterialBrowserGrid.java
@@ -108,23 +108,26 @@ public class ExperimentWellMaterialBrowserGrid extends MaterialBrowserGrid
     {
         if (editMode == false)
         {
-            ExperimentSearchCriteria experimentCriteria =
-                    ExperimentSearchCriteria.createExperiment(experiment);
-            ClientPluginFactory.openImagingMaterialViewer(material, experimentCriteria,
-                    screeningViewContext);
+            ClientPluginFactory.openImagingMaterialViewer(material,
+                    createExperimentSearchCriteria(), screeningViewContext);
         } else
         {
             super.showEntityViewer(material, editMode, active);
         }
     }
 
+    private ExperimentSearchCriteria createExperimentSearchCriteria()
+    {
+        return ExperimentSearchCriteria.createExperiment(experiment);
+    }
+
     @Override
     protected BaseEntityModel<Material> createModel(GridRowModel<Material> entity)
     {
         BaseEntityModel<Material> basicModel = super.createModel(entity);
         basicModel.set(ModelDataPropertyNames.link(CommonMaterialColDefKind.CODE.id()),
-                ScreeningLinkExtractor.tryCreateMaterialDetailsLink(entity.getOriginalObject(),
-                        experiment.getIdentifier()));
+                ScreeningLinkExtractor.createMaterialDetailsLink(entity.getOriginalObject(),
+                        createExperimentSearchCriteria()));
         return basicModel;
     }
 
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 b22df360e54..5854c2f0432 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
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.Gen
 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.ExperimentSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria;
 
 /**
@@ -87,17 +88,46 @@ public class ImagingMaterialViewer extends GenericMaterialViewer
         String experimentPermId = tryGetExperimentPermId();
         if (experimentPermId != null)
         {
+            boolean restrictGlobalScopeLinkToProject =
+                    isRestrictGlobalScopeLinkToProject(experimentCriteriaOrNull);
             MaterialReplicaSummarySection replicaSummarySection =
                     new MaterialReplicaSummarySection(screeningViewContext, material,
-                            experimentPermId);
+                            experimentPermId, restrictGlobalScopeLinkToProject);
             sections.add(replicaSummarySection);
         }
+        ExperimentSearchByProjectCriteria experimentCriteria = tryConvert(experimentCriteriaOrNull);
         MaterialFeaturesFromAllExpermentsSection featuresFromAllExperimentsSection =
-                new MaterialFeaturesFromAllExpermentsSection(screeningViewContext, material);
+                new MaterialFeaturesFromAllExpermentsSection(screeningViewContext, material,
+                        experimentCriteria);
         sections.add(featuresFromAllExperimentsSection);
         return sections;
     }
 
+    private static boolean isRestrictGlobalScopeLinkToProject(
+            ExperimentSearchCriteria experimentCriteriaOrNull)
+    {
+
+        if (experimentCriteriaOrNull == null)
+        {
+            return false;
+        } else
+        {
+            return experimentCriteriaOrNull.getRestrictGlobalSearchLinkToProject();
+        }
+    }
+
+    private static ExperimentSearchByProjectCriteria tryConvert(
+            ExperimentSearchCriteria experimentCriteriaOrNull)
+    {
+        if (experimentCriteriaOrNull == null)
+        {
+            return null;
+        } else
+        {
+            return experimentCriteriaOrNull.tryAsSearchByProjectCriteria();
+        }
+    }
+
     private String tryGetExperimentPermId()
     {
         if (experimentCriteriaOrNull != null)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialDisambiguationGrid.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialDisambiguationGrid.java
index 4ee85f27003..41cb88bc66d 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialDisambiguationGrid.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialDisambiguationGrid.java
@@ -221,7 +221,7 @@ public class MaterialDisambiguationGrid extends TypedTableGrid<Material>
                     {
                         public String tryGetLink(Material material, ISerializableComparable value)
                         {
-                            return ScreeningLinkExtractor.tryCreateMaterialDetailsLink(material,
+                            return ScreeningLinkExtractor.createMaterialDetailsLink(material,
                                     searchCriteria.getExperimentCriteria());
                         }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsGrid.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsGrid.java
index cc5198251ad..170c59d756e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsGrid.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsGrid.java
@@ -38,8 +38,8 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.D
 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.ExperimentReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.MaterialSimpleFeatureVectorSummary;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchByProjectCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.MaterialFeatureVectorsFromAllExperimentsGridColumnIDs;
 
 /**
@@ -96,14 +96,16 @@ public class MaterialFeaturesFromAllExperimentsGrid extends
                                 boolean specialKeyPressed)
                         {
                             ClientPluginFactory.openImagingExperimentViewer(rowItem
-                                    .getObjectOrNull().getExperiment(), screeningViewContext);
+                                    .getObjectOrNull().getExperiment(),
+                                    getRestrictGlobalScopeLinkToProject(), screeningViewContext);
                         }
 
                         public String tryGetLink(MaterialSimpleFeatureVectorSummary entity,
                                 ISerializableComparable value)
                         {
                             return ClientPluginFactory.createImagingExperimentViewerLink(
-                                    entity.getExperiment(), screeningViewContext);
+                                    entity.getExperiment(), getRestrictGlobalScopeLinkToProject(),
+                                    screeningViewContext);
                         }
                     });
     }
@@ -126,24 +128,31 @@ public class MaterialFeaturesFromAllExperimentsGrid extends
                             // in material detail view and the possibility of switching tabs is not
                             // implemented there.
                             MaterialReplicaSummaryViewer.openTab(screeningViewContext,
-                                    experimentPermId, new MaterialIdentifier(material));
+                                    experimentPermId, getRestrictGlobalScopeLinkToProject(),
+                                    new MaterialIdentifier(material));
                         }
 
                         public String tryGetLink(MaterialSimpleFeatureVectorSummary entity,
                                 ISerializableComparable value)
                         {
                             ExperimentSearchCriteria experiment = getExperimentCriteria(entity);
-                            return ScreeningLinkExtractor.tryCreateMaterialDetailsLink(material,
+                            return ScreeningLinkExtractor.createMaterialDetailsLink(material,
                                     experiment);
                         }
                     });
     }
 
-    private static ExperimentSearchCriteria getExperimentCriteria(
+    private boolean getRestrictGlobalScopeLinkToProject()
+    {
+        return experimentSearchCriteria.tryGetProjectIdentifier() != null;
+    }
+
+    private ExperimentSearchCriteria getExperimentCriteria(
             MaterialSimpleFeatureVectorSummary summary)
     {
         ExperimentReference experimentRef = summary.getExperiment();
-        return ExperimentSearchCriteria.createExperiment(experimentRef);
+        return ExperimentSearchCriteria.createExperiment(experimentRef,
+                getRestrictGlobalScopeLinkToProject());
     }
 
     @Override
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsViewer.java
index a7c6ebc6be0..ff908a3f943 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsViewer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsViewer.java
@@ -24,7 +24,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
@@ -85,8 +84,7 @@ public class MaterialFeaturesFromAllExperimentsViewer
                 @Override
                 public String getId()
                 {
-                    return ScreeningModule.ID
-                            + ScreeningLinkExtractor.MATERIAL_FEATURES_FROM_ALL_EXPERIMENTS_ACTION
+                    return ScreeningModule.ID + "MATERIAL_FEATURES_FROM_ALL_EXPERIMENTS"
                             + material.getPermId();
                 }
 
@@ -102,20 +100,8 @@ public class MaterialFeaturesFromAllExperimentsViewer
                 @Override
                 public String tryGetLink()
                 {
-                    String materialCode = material.getCode();
-                    String materialTypeCode = material.getEntityType().getCode();
-                    String spaceCodeOrNull = null;
-                    String projectCodeOrNull = null;
-                    BasicProjectIdentifier projectIdentifier =
-                            experimentCriteria.tryGetProjectIdentifier();
-                    if (projectIdentifier != null)
-                    {
-                        spaceCodeOrNull = projectIdentifier.getSpaceCode();
-                        projectCodeOrNull = projectIdentifier.getProjectCode();
-                    }
-
-                    return ScreeningLinkExtractor.createMaterialFeaturesFromAllExperimentsLink(
-                            materialCode, materialTypeCode, spaceCodeOrNull, projectCodeOrNull);
+                    return ScreeningLinkExtractor.createMaterialDetailsLink(material,
+                            experimentCriteria.asExtendedCriteria());
                 }
 
                 @Override
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExpermentsSection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExpermentsSection.java
index adc7441b7f1..f1af043ef38 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExpermentsSection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExpermentsSection.java
@@ -21,22 +21,26 @@ public class MaterialFeaturesFromAllExpermentsSection extends DisposableTabConte
 
     private final IEntityInformationHolderWithIdentifier material;
 
+    private final ExperimentSearchByProjectCriteria experimentCriteria;
+
     public MaterialFeaturesFromAllExpermentsSection(
             IViewContext<IScreeningClientServiceAsync> screeningViewContext,
-            IEntityInformationHolderWithIdentifier material)
+            IEntityInformationHolderWithIdentifier material,
+            ExperimentSearchByProjectCriteria experimentCriteria)
     {
         super(screeningViewContext.getMessage(Dict.MATERIAL_FEATURES_FROM_ALL_EXPERIMENTS_SECTION),
                 screeningViewContext, material);
         this.screeningViewContext = screeningViewContext;
         this.material = material;
+        this.experimentCriteria = experimentCriteria;
         setIds(DisplayTypeIDGenerator.MATERIAL_FEATURES_FROM_ALL_EXPERIMENTS_SECTION);
     }
 
     @Override
     protected IDisposableComponent createDisposableContent()
     {
-        return MaterialFeaturesFromAllExperimentsGrid.create(screeningViewContext, 
-                material, ExperimentSearchByProjectCriteria.createAllExperimentsForAllProjects());
+        return MaterialFeaturesFromAllExperimentsGrid.create(screeningViewContext, material,
+                experimentCriteria);
     }
 
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummaryComponent.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummaryComponent.java
index 55c529d44c5..3472dcfb3a5 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummaryComponent.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummaryComponent.java
@@ -45,8 +45,11 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ID
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.NotScrollableContainer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 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.basic.dto.DatabaseModificationKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ClientPluginFactory;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningDisplayTypeIDGenerator;
@@ -78,19 +81,26 @@ public class MaterialReplicaSummaryComponent
     private static final int ONE_IMAGE_SIZE_FACTOR_PX = 60;
 
     public static IDisposableComponent createViewer(
-            IViewContext<IScreeningClientServiceAsync> screeningViewContext,
-            IEntityInformationHolderWithPermId experiment, Material material)
+            IViewContext<IScreeningClientServiceAsync> screeningViewContext, Experiment experiment,
+            Material material, boolean restrictGlobalScopeLinkToProject)
     {
-        return new MaterialReplicaSummaryComponent(screeningViewContext).createViewer(experiment,
-                material);
+        return new MaterialReplicaSummaryComponent(screeningViewContext,
+                restrictGlobalScopeLinkToProject, experiment).createViewer(material);
     }
 
     private final IViewContext<IScreeningClientServiceAsync> screeningViewContext;
 
+    private final boolean restrictGlobalScopeLinkToProject;
+
+    private final Experiment experiment;
+
     private MaterialReplicaSummaryComponent(
-            IViewContext<IScreeningClientServiceAsync> screeningViewContext)
+            IViewContext<IScreeningClientServiceAsync> screeningViewContext,
+            boolean restrictGlobalScopeLinkToProject, Experiment experiment)
     {
         this.screeningViewContext = screeningViewContext;
+        this.restrictGlobalScopeLinkToProject = restrictGlobalScopeLinkToProject;
+        this.experiment = experiment;
     }
 
     private class ImagesFoundCallback extends AbstractAsyncCallback<List<WellReplicaImage>>
@@ -299,14 +309,13 @@ public class MaterialReplicaSummaryComponent
         return widgetWithListener.asWidget();
     }
 
-    private IDisposableComponent createViewer(IEntityInformationHolderWithPermId experiment,
-            Material material)
+    private IDisposableComponent createViewer(Material material)
     {
         final LayoutContainer panel = new LayoutContainer();
         panel.setLayout(new RowLayout(Orientation.VERTICAL));
         panel.setScrollMode(Scroll.AUTO);
 
-        Widget materialInfo = createMaterialInfo(screeningViewContext, experiment, material);
+        Widget materialInfo = createMaterialInfo(material);
         panel.add(materialInfo, new RowData(-1, -1, PropertiesUtil.createHeaderInfoMargin()));
 
         TechId materialTechId = new TechId(material);
@@ -348,14 +357,12 @@ public class MaterialReplicaSummaryComponent
             };
     }
 
-    private static Widget createMaterialInfo(
-            final IViewContext<IScreeningClientServiceAsync> viewContext,
-            final IEntityInformationHolderWithPermId experiment, final Material material)
+    private Widget createMaterialInfo(final Material material)
     {
         LayoutContainer panel = new LayoutContainer();
         panel.setLayout(new RowLayout());
 
-        Widget headerWidget = createHeaderWithLinks(viewContext, experiment, material);
+        Widget headerWidget = createHeaderWithLinks(material);
         panel.add(headerWidget, PropertiesUtil.createHeaderTitleLayoutData());
 
         LayoutContainer materialPropertiesPanel = createMaterialPropertiesPanel(material);
@@ -364,9 +371,7 @@ public class MaterialReplicaSummaryComponent
         return panel;
     }
 
-    private static Widget createHeaderWithLinks(
-            final IViewContext<IScreeningClientServiceAsync> viewContext,
-            final IEntityInformationHolderWithPermId experiment, final Material material)
+    private Widget createHeaderWithLinks(final Material material)
     {
         LayoutContainer headerPanel = new LayoutContainer();
         headerPanel.setLayout(new TableLayout(2));
@@ -380,28 +385,24 @@ public class MaterialReplicaSummaryComponent
 
         // in non-embedded mode there is a separate tab in material detail view with all assays
         // information, so we do not display this link there
-        if (viewContext.getModel().isEmbeddedMode())
+        if (screeningViewContext.getModel().isEmbeddedMode())
         {
-            Widget materialInAllAssaysSummaryLink =
-                    createMaterialInAllAssaysSummaryLink(viewContext, material);
+            Widget materialInAllAssaysSummaryLink = createMaterialInAllAssaysSummaryLink(material);
             rightLinksPanel.add(materialInAllAssaysSummaryLink, linkMargins);
         }
 
-        Widget assayAnalysisSummaryLink =
-                createAssayAnalysisSummaryLink(viewContext, experiment, material);
+        Widget assayAnalysisSummaryLink = createAssayAnalysisSummaryLink(material);
         rightLinksPanel.add(assayAnalysisSummaryLink, linkMargins);
 
         headerPanel.add(rightLinksPanel);
         return headerPanel;
     }
 
-    private static Widget createMaterialInAllAssaysSummaryLink(
-            final IViewContext<IScreeningClientServiceAsync> viewContext, final Material material)
+    private Widget createMaterialInAllAssaysSummaryLink(final Material material)
     {
-        // add link to feature vector summary for the experiment
+        final ExperimentSearchCriteria experimentCriteria = createAllAssaysExperimentCriteria();
         String linkUrl =
-                ClientPluginFactory.createImagingMaterialViewerLink(material,
-                        ExperimentSearchCriteria.createAllExperiments(), viewContext);
+                ScreeningLinkExtractor.createMaterialDetailsLink(material, experimentCriteria);
         String linkText =
                 "Find " + MaterialComponentUtils.getMaterialFullName(material, false)
                         + " in all assays";
@@ -409,13 +410,27 @@ public class MaterialReplicaSummaryComponent
             {
                 public void onClick(ClickEvent event)
                 {
-                    ClientPluginFactory.openImagingMaterialViewer(material,
-                            ExperimentSearchCriteria.createAllExperiments(), viewContext);
+                    ClientPluginFactory.openImagingMaterialViewer(material, experimentCriteria,
+                            screeningViewContext);
                 }
             }, linkUrl);
         return linkWidget;
     }
 
+    private ExperimentSearchCriteria createAllAssaysExperimentCriteria()
+    {
+        if (restrictGlobalScopeLinkToProject)
+        {
+            Project project = experiment.getProject();
+            BasicProjectIdentifier projectIdentifier =
+                    new BasicProjectIdentifier(project.getSpace().getCode(), project.getCode());
+            return ExperimentSearchCriteria.createAllExperimentsForProject(projectIdentifier);
+        } else
+        {
+            return ExperimentSearchCriteria.createAllExperiments();
+        }
+    }
+
     private static Html createHeaderTitle(final IEntityInformationHolderWithPermId experiment,
             final Material material)
     {
@@ -424,20 +439,19 @@ public class MaterialReplicaSummaryComponent
         return PropertiesUtil.createHeaderTitle(headingText);
     }
 
-    private static Widget createAssayAnalysisSummaryLink(
-            final IViewContext<IScreeningClientServiceAsync> viewContext,
-            final IEntityInformationHolderWithPermId experiment, final Material material)
+    private Widget createAssayAnalysisSummaryLink(final Material material)
     {
         // add link to feature vector summary for the experiment
         String linkUrl =
-                ScreeningLinkExtractor.createExperimentAnalysisSummaryBrowserLink(experiment
-                        .getPermId());
+                ClientPluginFactory.createImagingExperimentViewerLink(experiment,
+                        restrictGlobalScopeLinkToProject, screeningViewContext);
         String linkText = "Show assay " + experiment.getCode();
         Widget linkWidget = LinkRenderer.getLinkWidget(linkText, new ClickHandler()
             {
                 public void onClick(ClickEvent event)
                 {
-                    ClientPluginFactory.openImagingExperimentViewer(experiment, viewContext);
+                    ClientPluginFactory.openImagingExperimentViewer(experiment,
+                            restrictGlobalScopeLinkToProject, screeningViewContext);
                 }
             }, linkUrl);
         return linkWidget;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummarySection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummarySection.java
index 48b37409b9d..b96b8c2a36a 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummarySection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummarySection.java
@@ -4,8 +4,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict;
@@ -24,17 +23,20 @@ class MaterialReplicaSummarySection extends TabContent
 
     private final String experimentPermId;
 
+    private final boolean restrictGlobalScopeLinkToProject;
+
     private IDisposableComponent viewer;
 
     public MaterialReplicaSummarySection(
             IViewContext<IScreeningClientServiceAsync> screeningViewContext, Material material,
-            String experimentPermId)
+            String experimentPermId, boolean restrictGlobalScopeLinkToProject)
     {
         super(screeningViewContext.getMessage(Dict.MATERIAL_REPLICA_SUMMARY_SECTION_TITLE, ""),
                 screeningViewContext, material);
         this.screeningViewContext = screeningViewContext;
         this.material = material;
         this.experimentPermId = experimentPermId;
+        this.restrictGlobalScopeLinkToProject = restrictGlobalScopeLinkToProject;
 
         setHeaderVisible(false);
         setIds(DisplayTypeIDGenerator.REPLICA_SUMMARY_MATERIAL_SECTION);
@@ -43,12 +45,11 @@ class MaterialReplicaSummarySection extends TabContent
     @Override
     protected void showContent()
     {
-        screeningViewContext.getCommonService().getEntityInformationHolder(EntityKind.EXPERIMENT,
-                experimentPermId,
-                new AbstractAsyncCallback<IEntityInformationHolderWithPermId>(screeningViewContext)
+        screeningViewContext.getCommonService().getExperimentInfoByPermId(experimentPermId,
+                new AbstractAsyncCallback<Experiment>(screeningViewContext)
                     {
                         @Override
-                        protected void process(IEntityInformationHolderWithPermId experiment)
+                        protected void process(Experiment experiment)
                         {
                             setHeading(screeningViewContext.getMessage(
                                     Dict.MATERIAL_REPLICA_SUMMARY_SECTION_TITLE,
@@ -62,11 +63,11 @@ class MaterialReplicaSummarySection extends TabContent
                     });
     }
 
-    private void createAndShowViewer(IEntityInformationHolderWithPermId experiment)
+    private void createAndShowViewer(Experiment experiment)
     {
         this.viewer =
                 MaterialReplicaSummaryComponent.createViewer(screeningViewContext, experiment,
-                        material);
+                        material, restrictGlobalScopeLinkToProject);
         add(viewer.getComponent());
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummaryViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummaryViewer.java
index 4eac08af93f..ac2f43a63f1 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummaryViewer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialReplicaSummaryViewer.java
@@ -26,13 +26,14 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpP
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningModule;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.utils.MaterialComponentUtils;
 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.ExperimentSearchCriteria;
 
 /**
  * Opens an independent tab with {@link MaterialReplicaSummaryComponent}.
@@ -47,11 +48,12 @@ public class MaterialReplicaSummaryViewer
      * @param material should be enriched with properties
      */
     public static void openTab(IViewContext<IScreeningClientServiceAsync> screeningViewContext,
-            String experimentPermId, Material material)
+            String experimentPermId, boolean restrictGlobalScopeLinkToProject, Material material)
     {
         MaterialReplicaSummaryViewer viewer =
-                new MaterialReplicaSummaryViewer(screeningViewContext);
-        AbstractAsyncCallback<IEntityInformationHolderWithPermId> experimentFoundCallback =
+                new MaterialReplicaSummaryViewer(screeningViewContext,
+                        restrictGlobalScopeLinkToProject);
+        AbstractAsyncCallback<Experiment> experimentFoundCallback =
                 viewer.createExperimentFoundCallback(material);
         viewer.fetchExperimentByPermId(experimentPermId, experimentFoundCallback);
     }
@@ -60,38 +62,43 @@ public class MaterialReplicaSummaryViewer
      * Fetches material and experiment and opens a tab with {@link MaterialReplicaSummaryComponent}.
      */
     public static void openTab(IViewContext<IScreeningClientServiceAsync> screeningViewContext,
-            String experimentPermId, MaterialIdentifier materialIdentifier)
+            String experimentPermId, boolean restrictGlobalScopeLinkToProject,
+            MaterialIdentifier materialIdentifier)
     {
         MaterialReplicaSummaryViewer viewer =
-                new MaterialReplicaSummaryViewer(screeningViewContext);
-        AbstractAsyncCallback<IEntityInformationHolderWithPermId> experimentFoundCallback =
+                new MaterialReplicaSummaryViewer(screeningViewContext,
+                        restrictGlobalScopeLinkToProject);
+        AbstractAsyncCallback<Experiment> experimentFoundCallback =
                 viewer.createExperimentFoundCallback(materialIdentifier);
         viewer.fetchExperimentByPermId(experimentPermId, experimentFoundCallback);
     }
 
     private final IViewContext<IScreeningClientServiceAsync> screeningViewContext;
 
+    private final boolean restrictGlobalScopeLinkToProject;
+
     private MaterialReplicaSummaryViewer(
-            IViewContext<IScreeningClientServiceAsync> screeningViewContext)
+            IViewContext<IScreeningClientServiceAsync> screeningViewContext,
+            boolean restrictGlobalScopeLinkToProject)
     {
         this.screeningViewContext = screeningViewContext;
+        this.restrictGlobalScopeLinkToProject = restrictGlobalScopeLinkToProject;
     }
 
     private void fetchExperimentByPermId(String experimentPermId,
-            AbstractAsyncCallback<IEntityInformationHolderWithPermId> experimentFoundCallback)
+            AbstractAsyncCallback<Experiment> experimentFoundCallback)
     {
-        screeningViewContext.getCommonService().getEntityInformationHolder(EntityKind.EXPERIMENT,
-                experimentPermId, experimentFoundCallback);
+        screeningViewContext.getCommonService().getExperimentInfoByPermId(experimentPermId,
+                experimentFoundCallback);
     }
 
     // NOTE: material is already fetched
-    private AbstractAsyncCallback<IEntityInformationHolderWithPermId> createExperimentFoundCallback(
-            final Material material)
+    private AbstractAsyncCallback<Experiment> createExperimentFoundCallback(final Material material)
     {
-        return new AbstractAsyncCallback<IEntityInformationHolderWithPermId>(screeningViewContext)
+        return new AbstractAsyncCallback<Experiment>(screeningViewContext)
             {
                 @Override
-                protected void process(IEntityInformationHolderWithPermId experiment)
+                protected void process(Experiment experiment)
                 {
                     openTab(experiment, material);
                 }
@@ -99,13 +106,13 @@ public class MaterialReplicaSummaryViewer
     }
 
     // NOTE: material has to be still fetched
-    private AbstractAsyncCallback<IEntityInformationHolderWithPermId> createExperimentFoundCallback(
+    private AbstractAsyncCallback<Experiment> createExperimentFoundCallback(
             final MaterialIdentifier materialIdentifier)
     {
-        return new AbstractAsyncCallback<IEntityInformationHolderWithPermId>(screeningViewContext)
+        return new AbstractAsyncCallback<Experiment>(screeningViewContext)
             {
                 @Override
-                protected void process(IEntityInformationHolderWithPermId experiment)
+                protected void process(Experiment experiment)
                 {
                     viewContext.getCommonService().getMaterialInformationHolder(materialIdentifier,
                             new MaterialFoundCallback(experiment));
@@ -116,9 +123,9 @@ public class MaterialReplicaSummaryViewer
     private class MaterialFoundCallback extends
             AbstractAsyncCallback<IEntityInformationHolderWithPermId>
     {
-        private final IEntityInformationHolderWithPermId experiment;
+        private final Experiment experiment;
 
-        MaterialFoundCallback(IEntityInformationHolderWithPermId experiment)
+        MaterialFoundCallback(Experiment experiment)
         {
             super(screeningViewContext);
             this.experiment = experiment;
@@ -139,24 +146,22 @@ public class MaterialReplicaSummaryViewer
         }
     }
 
-    private void openTab(IEntityInformationHolderWithPermId experiment, Material material)
+    private void openTab(Experiment experiment, Material material)
     {
         AbstractTabItemFactory factory = createTabFactory(experiment, material);
         DispatcherHelper.dispatchNaviEvent(factory);
     }
 
-    private AbstractTabItemFactory createTabFactory(
-            final IEntityInformationHolderWithPermId experiment, final Material material)
+    private AbstractTabItemFactory createTabFactory(final Experiment experiment,
+            final Material material)
     {
         return new AbstractTabItemFactory()
             {
-
                 @Override
                 public String getId()
                 {
-                    return ScreeningModule.ID
-                            + ScreeningLinkExtractor.MATERIAL_REPLICA_SUMMARY_ACTION
-                            + experiment.getCode() + material.getPermId();
+                    return ScreeningModule.ID + "MATERIAL_REPLICA_SUMMARY" + experiment.getPermId()
+                            + "-" + material.getPermId();
                 }
 
                 @Override
@@ -164,15 +169,18 @@ public class MaterialReplicaSummaryViewer
                 {
                     IDisposableComponent tabComponent =
                             MaterialReplicaSummaryComponent.createViewer(screeningViewContext,
-                                    experiment, material);
+                                    experiment, material, restrictGlobalScopeLinkToProject);
                     return DefaultTabItem.create(getTabTitle(), tabComponent, screeningViewContext);
                 }
 
                 @Override
                 public String tryGetLink()
                 {
-                    return ScreeningLinkExtractor.createMaterialReplicaSummaryLink(experiment
-                            .getPermId(), material.getCode(), material.getEntityType().getCode());
+                    ExperimentSearchCriteria experimentCriteria =
+                            ExperimentSearchCriteria.createExperiment(experiment,
+                                    restrictGlobalScopeLinkToProject);
+                    return ScreeningLinkExtractor.createMaterialDetailsLink(material,
+                            experimentCriteria);
                 }
 
                 @Override
@@ -190,5 +198,4 @@ public class MaterialReplicaSummaryViewer
 
             };
     }
-
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellContentDialog.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellContentDialog.java
index f0ebd4f8193..9dbad35db48 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellContentDialog.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellContentDialog.java
@@ -425,18 +425,17 @@ public class WellContentDialog extends Dialog
             final IEntityInformationHolderWithPermId material)
     {
         final String href =
-                ScreeningLinkExtractor.tryCreateMaterialDetailsLink(material,
-                        experimentCriteria.getExperimentIdentifier());
+                ScreeningLinkExtractor.createMaterialDetailsLink(material, getExperimentCriteria());
         final ClickHandler listener = new ClickHandler()
             {
                 public void onClick(ClickEvent event)
                 {
                     WellContentDialog.this.hide();
                     ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ClientPluginFactory
-                            .openImagingMaterialViewer(material,
-                                    ExperimentSearchCriteria.createExperiment(experimentCriteria),
+                            .openImagingMaterialViewer(material, getExperimentCriteria(),
                                     viewContext);
                 }
+
             };
         Anchor link = (Anchor) LinkRenderer.getLinkWidget(material.getCode(), listener, href);
         if (viewContext.isSimpleOrEmbeddedMode())
@@ -452,6 +451,11 @@ public class WellContentDialog extends Dialog
         return link;
     }
 
+    private ExperimentSearchCriteria getExperimentCriteria()
+    {
+        return ExperimentSearchCriteria.createExperiment(experimentCriteria, false);
+    }
+
     private Widget createEntityLink(IEntityInformationHolderWithPermId entity)
     {
         final ClickHandler listener = new OpenEntityDetailsTabClickListener(entity, viewContext);
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 9aa497c7870..4f8179277ce 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
@@ -61,6 +61,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetCo
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
@@ -79,7 +80,6 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.d
 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;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetReference;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ExperimentReference;
 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;
@@ -362,17 +362,26 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
 
     private static String tryCreateMaterialDetailsLink(WellContent wellContent, Material material)
     {
-        String experimentIdentifier = wellContent.getExperiment().getIdentifier();
-        return ScreeningLinkExtractor.tryCreateMaterialDetailsLink(material, experimentIdentifier);
+        return ScreeningLinkExtractor.createMaterialDetailsLink(material,
+                getExperimentCriteria(wellContent));
     }
 
-    private void openImagingMaterialViewer(WellContent wellContent, Material material)
+    private static ExperimentSearchCriteria getExperimentCriteria(WellContent wellContent)
     {
-        ExperimentReference experiment = wellContent.getExperiment();
-        ExperimentSearchCriteria experimentCriteria =
-                ExperimentSearchCriteria.createExperiment(experiment);
+        IEntityInformationHolderWithIdentifier experiment = wellContent.getExperiment();
+        return getExperimentCriteria(experiment);
+    }
 
-        ClientPluginFactory.openImagingMaterialViewer(material, experimentCriteria, viewContext);
+    private static ExperimentSearchCriteria getExperimentCriteria(
+            IEntityInformationHolderWithIdentifier experiment)
+    {
+        return ExperimentSearchCriteria.createExperiment(experiment);
+    }
+
+    private void openImagingMaterialViewer(WellContent wellContent, Material material)
+    {
+        ClientPluginFactory.openImagingMaterialViewer(material, getExperimentCriteria(wellContent),
+                viewContext);
     }
 
     private void linkExperiment()
@@ -528,16 +537,17 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
         ExperimentChooserFieldAdaptor experimentChooser =
                 ExperimentChooserField.create("", true, null, viewContext.getCommonViewContext());
         final ExperimentChooserField chooserField = experimentChooser.getChooserField();
-        chooserField.addChosenEntityListener(new IChosenEntityListener<TableModelRowWithObject<Experiment>>()
-            {
-                public void entityChosen(TableModelRowWithObject<Experiment> row)
-                {
-                    if (row != null)
+        chooserField
+                .addChosenEntityListener(new IChosenEntityListener<TableModelRowWithObject<Experiment>>()
                     {
-                        chooseSingleExperiment(chooserField, row.getObjectOrNull());
-                    }
-                }
-            });
+                        public void entityChosen(TableModelRowWithObject<Experiment> row)
+                        {
+                            if (row != null)
+                            {
+                                chooseSingleExperiment(chooserField, row.getObjectOrNull());
+                            }
+                        }
+                    });
 
         chooserField.setEditable(false);
         if (experimentCriteriaOrNull != null && experimentCriteriaOrNull.tryGetExperiment() != null)
@@ -567,7 +577,8 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
                 new SingleExperimentSearchCriteria(experiment.getId(), experiment.getPermId(),
                         experiment.getIdentifier());
         updateSingleExperimentChooser(chooserField, singleExperiment);
-        this.experimentCriteriaOrNull = ExperimentSearchCriteria.createExperiment(singleExperiment);
+        this.experimentCriteriaOrNull =
+                ExperimentSearchCriteria.createExperiment(singleExperiment);
         refresh();
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ExperimentAnalysisSummaryResolver.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ExperimentAnalysisSummaryResolver.java
index ee700888df8..1755c635664 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ExperimentAnalysisSummaryResolver.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ExperimentAnalysisSummaryResolver.java
@@ -29,8 +29,11 @@ public class ExperimentAnalysisSummaryResolver extends AbstractViewLocatorResolv
                 getMandatoryParameter(
                         locator,
                         ScreeningLinkExtractor.EXPERIMENT_ANALYSIS_SUMMARY_EXPERIMENT_PERMID_PARAMETER_KEY);
-
-        ExperimentAnalysisSummaryViewer.openTab(viewContext, experimentPermId);
+        boolean restrictGlobalScopeLinkToProject =
+                getOptionalBooleanParameter(locator,
+                        ScreeningLinkExtractor.RESTRICT_GLOBAL_SEARCH_TO_PROJECT, false);
+        ExperimentAnalysisSummaryViewer.openTab(viewContext, experimentPermId,
+                restrictGlobalScopeLinkToProject);
 
     }
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ImagingMaterialLocatorResolver.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ImagingMaterialLocatorResolver.java
index 57c52812dbf..47852aec211 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ImagingMaterialLocatorResolver.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/ImagingMaterialLocatorResolver.java
@@ -1,7 +1,5 @@
 package ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator;
 
-import java.util.Map;
-
 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.IViewContext;
@@ -9,6 +7,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.Ma
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
@@ -41,33 +40,44 @@ public class ImagingMaterialLocatorResolver extends MaterialLocatorResolver
         assert (EntityKind.MATERIAL.name().equals(locator.tryGetEntity()));
 
         ExperimentIdentifierSearchCriteria experimentCriteriaOrNull =
-                tryGetExperimentIdentifierSearchCriteria(locator.getParameters());
+                tryGetExperimentIdentifierSearchCriteria(locator);
         openInitialMaterialViewer(extractMaterialIdentifier(locator), experimentCriteriaOrNull);
     }
 
     private static ExperimentIdentifierSearchCriteria tryGetExperimentIdentifierSearchCriteria(
-            Map<String, String> parameters)
+            ViewLocator locator)
     {
+        // one experiment
         String experimentIdentifierOrNull =
-                parameters
-                        .get(ScreeningLinkExtractor.MATERIAL_DETAIL_EXPERIMENT_IDENT_PARAMETER_KEY);
-        if (experimentIdentifierOrNull == null)
+                getOptionalParameter(locator,
+                        ScreeningLinkExtractor.MATERIAL_DETAIL_EXPERIMENT_IDENT_PARAMETER_KEY);
+        if (experimentIdentifierOrNull != null)
         {
-            String searchAllExp =
-                    parameters
-                            .get(ScreeningLinkExtractor.MATERIAL_DETAIL_SEARCH_ALL_EXPERIMENTS_PARAMETER_KEY);
-            if (StringUtils.isBlank(searchAllExp) == false
-                    && searchAllExp.equalsIgnoreCase("false") == false)
-            {
-                return ExperimentIdentifierSearchCriteria.createSearchAll();
-            } else
-            {
-                return null;
-            }
-        } else
+            boolean restrictGlobalSearchToProject =
+                    getOptionalBooleanParameter(locator,
+                            ScreeningLinkExtractor.RESTRICT_GLOBAL_SEARCH_TO_PROJECT, false);
+            return ExperimentIdentifierSearchCriteria.createExperimentScope(
+                    experimentIdentifierOrNull, restrictGlobalSearchToProject);
+        }
+        // project
+        String space = getOptionalParameter(locator, ScreeningLinkExtractor.SPACE_CODE_KEY);
+        String project = getOptionalParameter(locator, ScreeningLinkExtractor.PROJECT_CODE_KEY);
+        if (StringUtils.isBlank(space) == false && StringUtils.isBlank(project) == false)
         {
-            return new ExperimentIdentifierSearchCriteria(experimentIdentifierOrNull);
+            return ExperimentIdentifierSearchCriteria
+                    .createProjectScope(new BasicProjectIdentifier(space, project));
         }
+        // all experiments
+        boolean searchAllExp =
+                getOptionalBooleanParameter(
+                        locator,
+                        ScreeningLinkExtractor.MATERIAL_DETAIL_SEARCH_ALL_EXPERIMENTS_PARAMETER_KEY,
+                        false);
+        if (searchAllExp)
+        {
+            return ExperimentIdentifierSearchCriteria.createSearchAll();
+        }
+        return null;
     }
 
     /**
@@ -87,15 +97,15 @@ public class ImagingMaterialLocatorResolver extends MaterialLocatorResolver
     {
         private final IViewContext<IScreeningClientServiceAsync> viewContext;
 
-        private final ExperimentIdentifierSearchCriteria experimentCriteriaOrNull;
+        private final ExperimentIdentifierSearchCriteria scopeOrNull;
 
         private OpenEntityDetailsTabCallback(
                 final IViewContext<IScreeningClientServiceAsync> viewContext,
-                ExperimentIdentifierSearchCriteria experimentCriteriaOrNull)
+                ExperimentIdentifierSearchCriteria scopeOrNull)
         {
             super(viewContext);
             this.viewContext = viewContext;
-            this.experimentCriteriaOrNull = experimentCriteriaOrNull;
+            this.scopeOrNull = scopeOrNull;
         }
 
         //
@@ -108,19 +118,25 @@ public class ImagingMaterialLocatorResolver extends MaterialLocatorResolver
         @Override
         protected final void process(final IEntityInformationHolderWithPermId material)
         {
-            if (experimentCriteriaOrNull == null)
+            if (scopeOrNull == null)
             {
                 openImagingMaterialViewer(material, null);
             } else
             {
-                if (experimentCriteriaOrNull.searchAllExperiments())
+                String experimentIdentifier = scopeOrNull.tryGetExperimentIdentifier();
+                BasicProjectIdentifier project = scopeOrNull.tryGetProject();
+                if (experimentIdentifier != null)
+                {
+                    fetchExperimentAndShowLocations(material, experimentIdentifier);
+                } else if (project != null)
                 {
                     openImagingMaterialViewer(material,
-                            ExperimentSearchCriteria.createAllExperiments());
+                            ExperimentSearchCriteria
+                                    .createAllExperimentsForProject(project));
                 } else
                 {
-                    fetchExperimentAndShowLocations(material,
-                            experimentCriteriaOrNull.tryGetExperimentIdentifier());
+                    openImagingMaterialViewer(material,
+                            ExperimentSearchCriteria.createAllExperiments());
                 }
             }
         }
@@ -135,7 +151,9 @@ public class ImagingMaterialLocatorResolver extends MaterialLocatorResolver
                             protected void process(Experiment experiment)
                             {
                                 ExperimentSearchCriteria experimentCriteria =
-                                        ExperimentSearchCriteria.createExperiment(experiment);
+                                        ExperimentSearchCriteria.createExperiment(
+                                                experiment,
+                                                scopeOrNull.getRestrictGlobalSearchLinkToProject());
                                 openImagingMaterialViewer(material, experimentCriteria);
                             }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/MaterialFeaturesFromAllExperimentsResolver.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/MaterialFeaturesFromAllExperimentsResolver.java
deleted file mode 100644
index 1f8d457fb30..00000000000
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/MaterialFeaturesFromAllExperimentsResolver.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator;
-
-import static ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific.ScreeningLinkExtractor.MATERIAL_CODE_KEY;
-import static ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific.ScreeningLinkExtractor.MATERIAL_TYPE_CODE_KEY;
-import static ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific.ScreeningLinkExtractor.PROJECT_CODE_KEY;
-import static ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific.ScreeningLinkExtractor.SPACE_CODE_KEY;
-
-import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.AbstractViewLocatorResolver;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocator;
-import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
-import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
-import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.MaterialFeaturesFromAllExperimentsViewer;
-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.ExperimentSearchByProjectCriteria;
-
-/**
- * Locator resolver for material summary from all experiments.
- * 
- * @author Kaloyan Enimanev
- */
-public class MaterialFeaturesFromAllExperimentsResolver extends AbstractViewLocatorResolver
-{
-    private final IViewContext<IScreeningClientServiceAsync> viewContext;
-
-    public MaterialFeaturesFromAllExperimentsResolver(
-            IViewContext<IScreeningClientServiceAsync> viewContext)
-    {
-        super(ScreeningLinkExtractor.MATERIAL_FEATURES_FROM_ALL_EXPERIMENTS_ACTION);
-        this.viewContext = viewContext;
-    }
-
-    public void resolve(final ViewLocator locator) throws UserFailureException
-    {
-        String materialCode = getMandatoryParameter(locator, MATERIAL_CODE_KEY);
-
-        String materialTypeCode = getMandatoryParameter(locator, MATERIAL_TYPE_CODE_KEY);
-
-        MaterialIdentifier materialIdentifier =
-                new MaterialIdentifier(materialCode, materialTypeCode);
-
-        String projectCodeOrNull = getOptionalParameter(locator, PROJECT_CODE_KEY);
-        String spaceCodeOrNull = getOptionalParameter(locator, SPACE_CODE_KEY);
-        
-        
-        ExperimentSearchByProjectCriteria experimentCriteria = null;
-        if (StringUtils.isBlank(projectCodeOrNull) || StringUtils.isBlank(spaceCodeOrNull))
-        {
-            experimentCriteria =
-                    ExperimentSearchByProjectCriteria.createAllExperimentsForAllProjects();
-        } else
-        {
-            BasicProjectIdentifier projectIdentifier =
-                    new BasicProjectIdentifier(spaceCodeOrNull, projectCodeOrNull);
-            experimentCriteria =
-                    ExperimentSearchByProjectCriteria
-                            .createAllExperimentsForProject(projectIdentifier);
-        }
-
-        MaterialFeaturesFromAllExperimentsViewer.openTab(viewContext, materialIdentifier,
-                experimentCriteria);
-
-    }
-}
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/MaterialReplicaSummaryResolver.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/MaterialReplicaSummaryResolver.java
deleted file mode 100644
index 686a9e59190..00000000000
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/locator/MaterialReplicaSummaryResolver.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.locator;
-
-import static ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific.ScreeningLinkExtractor.MATERIAL_REPLICA_SUMMARY_EXPERIMENT_PERM_ID_KEY;
-import static ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific.ScreeningLinkExtractor.MATERIAL_CODE_KEY;
-import static ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific.ScreeningLinkExtractor.MATERIAL_TYPE_CODE_KEY;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.AbstractViewLocatorResolver;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocator;
-import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
-import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
-import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.MaterialReplicaSummaryViewer;
-import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific.ScreeningLinkExtractor;
-
-/**
- * Locator resolver for material replica summary view.
- * 
- * @author Kaloyan Enimanev
- */
-public class MaterialReplicaSummaryResolver extends AbstractViewLocatorResolver
-{
-    private final IViewContext<IScreeningClientServiceAsync> viewContext;
-
-    public MaterialReplicaSummaryResolver(IViewContext<IScreeningClientServiceAsync> viewContext)
-    {
-        super(ScreeningLinkExtractor.MATERIAL_REPLICA_SUMMARY_ACTION);
-        this.viewContext = viewContext;
-    }
-
-    public void resolve(final ViewLocator locator) throws UserFailureException
-    {
-        String experimentPermId =
-                getMandatoryParameter(locator, MATERIAL_REPLICA_SUMMARY_EXPERIMENT_PERM_ID_KEY);
-
-        String materialCode =
-                getMandatoryParameter(locator, MATERIAL_CODE_KEY);
-
-        String materialTypeCode =
-                getMandatoryParameter(locator, MATERIAL_TYPE_CODE_KEY);
-
-        MaterialIdentifier materialIdentifier =
-                new MaterialIdentifier(materialCode, materialTypeCode);
-
-        MaterialReplicaSummaryViewer.openTab(viewContext, experimentPermId, materialIdentifier);
-
-    }
-}
\ No newline at end of file
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 e106ce6684b..3a4a7226536 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
@@ -6,6 +6,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.Ab
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.locator.ViewLocator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.URLListEncoder;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
+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;
@@ -34,6 +35,9 @@ public class WellSearchLocatorResolver extends AbstractViewLocatorResolver
         String experimentPermId =
                 getOptionalParameter(locator,
                         ScreeningLinkExtractor.WELL_SEARCH_EXPERIMENT_PERM_ID_PARAMETER_KEY);
+        String projectCode = getOptionalParameter(locator, ScreeningLinkExtractor.PROJECT_CODE_KEY);
+        String spaceCode = getOptionalParameter(locator, ScreeningLinkExtractor.SPACE_CODE_KEY);
+
         String materialCodesOrProperties =
                 getMandatoryParameter(locator,
                         ScreeningLinkExtractor.WELL_SEARCH_MATERIAL_ITEMS_PARAMETER_KEY);
@@ -56,8 +60,19 @@ public class WellSearchLocatorResolver extends AbstractViewLocatorResolver
                 MaterialSearchCriteria.create(materialCodesCriteria);
         if (StringUtils.isBlank(experimentPermId))
         {
-            WellSearchGrid.openTab(viewContext, ExperimentSearchCriteria.createAllExperiments(),
-                    materialSearchCriteria, showCombinedResults);
+            ExperimentSearchCriteria criteria;
+            if (StringUtils.isBlank(projectCode) || StringUtils.isBlank(spaceCode))
+            {
+                criteria = ExperimentSearchCriteria.createAllExperiments();
+            } else
+            {
+                criteria =
+                        ExperimentSearchCriteria
+                                .createAllExperimentsForProject(new BasicProjectIdentifier(
+                                        spaceCode, projectCode));
+            }
+            WellSearchGrid.openTab(viewContext, criteria, materialSearchCriteria,
+                    showCombinedResults);
         } else
         {
             WellSearchGrid.openTab(viewContext, experimentPermId, materialSearchCriteria,
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ui/columns/specific/ScreeningLinkExtractor.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ui/columns/specific/ScreeningLinkExtractor.java
index c82d6ac543a..c859c699825 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ui/columns/specific/ScreeningLinkExtractor.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/ui/columns/specific/ScreeningLinkExtractor.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ui.columns.specific;
 
-import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.URLListEncoder;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils;
@@ -24,6 +23,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.PermlinkUtilities;
 import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.dto.ExperimentIdentifierSearchCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
@@ -52,7 +52,7 @@ public class ScreeningLinkExtractor extends LinkExtractor
 
     public final static String WELL_SEARCH_ACTION = "WELL_SEARCH";
 
-    /** If not given then all experiments are searched. */
+    /** If not given then all experiments or experiments in the specified project are searched. */
     public final static String WELL_SEARCH_EXPERIMENT_PERM_ID_PARAMETER_KEY = "experimentPermId";
 
     public final static String WELL_SEARCH_IS_EXACT_PARAMETER_KEY = "isExactSearch";
@@ -72,21 +72,19 @@ public class ScreeningLinkExtractor extends LinkExtractor
     public final static String EXPERIMENT_ANALYSIS_SUMMARY_EXPERIMENT_PERMID_PARAMETER_KEY =
             "experimentPermId";
 
-    public final static String MATERIAL_REPLICA_SUMMARY_ACTION = "MATERIAL_REPLICA_SUMMARY";
-
     public final static String MATERIAL_REPLICA_SUMMARY_EXPERIMENT_PERM_ID_KEY = "experimentPermId";
 
     public final static String MATERIAL_CODE_KEY = "materialCode";
 
     public final static String MATERIAL_TYPE_CODE_KEY = "materialTypeCode";
 
-    public final static String MATERIAL_FEATURES_FROM_ALL_EXPERIMENTS_ACTION =
-            "MATERIAL_FEATURES_FROM_ALL_EXPERIMENTS";
-
     public final static String PROJECT_CODE_KEY = "projectCode";
 
     public final static String SPACE_CODE_KEY = "spaceCode";
 
+    // false by default
+    public static final String RESTRICT_GLOBAL_SEARCH_TO_PROJECT = "restrictGlobalSearchToProject";
+
     public static final String createPlateMetadataBrowserLink(String platePermId)
     {
         URLMethodWithParameters url = new URLMethodWithParameters("");
@@ -95,46 +93,17 @@ public class ScreeningLinkExtractor extends LinkExtractor
         return tryPrint(url);
     }
 
-    public static final String createExperimentAnalysisSummaryBrowserLink(String experimentPermId)
+    public static final String createExperimentAnalysisSummaryBrowserLink(String experimentPermId,
+            boolean restrictGlobalScopeLinkToProject)
     {
         URLMethodWithParameters url = new URLMethodWithParameters("");
         url.addParameter(BasicConstant.LOCATOR_ACTION_PARAMETER, EXPERIMENT_ANALYSIS_SUMMARY_ACTION);
         url.addParameter(EXPERIMENT_ANALYSIS_SUMMARY_EXPERIMENT_PERMID_PARAMETER_KEY,
                 experimentPermId);
-        return tryPrint(url);
-    }
-
-    public static final String createMaterialReplicaSummaryLink(String experimentPermId,
-            String materialCode, String materialTypeCode)
-    {
-        URLMethodWithParameters url = new URLMethodWithParameters("");
-        url.addParameter(BasicConstant.LOCATOR_ACTION_PARAMETER, MATERIAL_REPLICA_SUMMARY_ACTION);
-        url.addParameter(MATERIAL_REPLICA_SUMMARY_EXPERIMENT_PERM_ID_KEY, experimentPermId);
-        url.addParameter(MATERIAL_CODE_KEY, materialCode);
-        url.addParameter(MATERIAL_TYPE_CODE_KEY, materialTypeCode);
-        return tryPrint(url);
-    }
-
-    public static final String createMaterialFeaturesFromAllExperimentsLink(String materialCode,
-            String materialTypeCode)
-    {
-        return createMaterialFeaturesFromAllExperimentsLink(materialCode, materialTypeCode, null,
-                null);
-    }
-
-    public static final String createMaterialFeaturesFromAllExperimentsLink(String materialCode,
-            String materialTypeCode, String spaceCodeOrNull, String projectCodeOrNull)
-    {
-        URLMethodWithParameters url = new URLMethodWithParameters("");
-        url.addParameter(BasicConstant.LOCATOR_ACTION_PARAMETER,
-                MATERIAL_FEATURES_FROM_ALL_EXPERIMENTS_ACTION);
-        url.addParameter(MATERIAL_CODE_KEY, materialCode);
-        url.addParameter(MATERIAL_TYPE_CODE_KEY, materialTypeCode);
-        if (false == StringUtils.isBlank(spaceCodeOrNull)
-                && false == StringUtils.isBlank(projectCodeOrNull))
+        if (restrictGlobalScopeLinkToProject)
         {
-            url.addParameter(SPACE_CODE_KEY, spaceCodeOrNull);
-            url.addParameter(PROJECT_CODE_KEY, projectCodeOrNull);
+            url.addParameterWithoutEncoding(RESTRICT_GLOBAL_SEARCH_TO_PROJECT,
+                    restrictGlobalScopeLinkToProject);
         }
         return tryPrint(url);
     }
@@ -154,71 +123,22 @@ public class ScreeningLinkExtractor extends LinkExtractor
                 materialCodesOrProperties, showCombinedResults);
     }
 
-    public static String createWellsSearchLink(ExperimentSearchCriteria experimentSearchCriteria,
+    public static String createWellsSearchLink(ExperimentSearchCriteria experimentCriteria,
             MaterialSearchCodesCriteria materialCodesCriteria, Boolean showCombinedResults)
-    {
-        ExperimentPermIdSearchCriteria experimentCriteria =
-                convertToPermIdExperimentCriteria(experimentSearchCriteria);
-        return createWellsSearchLink(experimentCriteria, materialCodesCriteria, showCombinedResults);
-    }
-
-    private static class ExperimentPermIdSearchCriteria
-    {
-        public static ExperimentPermIdSearchCriteria createSearchAll()
-        {
-            return new ExperimentPermIdSearchCriteria(null);
-        }
-
-        // if null, all experiments are taken into account
-        private final String experimentPermIdOrNull;
-
-        public ExperimentPermIdSearchCriteria(String experimentPermIdOrNull)
-        {
-            this.experimentPermIdOrNull = experimentPermIdOrNull;
-        }
-
-        public String tryGetExperimentPermId()
-        {
-            return experimentPermIdOrNull;
-        }
-    }
-
-    private static ExperimentPermIdSearchCriteria convertToPermIdExperimentCriteria(
-            ExperimentSearchCriteria experimentSearchCriteria)
-    {
-        SingleExperimentSearchCriteria expOrNull = experimentSearchCriteria.tryGetExperiment();
-        if (expOrNull == null)
-        {
-            return ExperimentPermIdSearchCriteria.createSearchAll();
-        } else
-        {
-            return new ExperimentPermIdSearchCriteria(expOrNull.getExperimentPermId());
-        }
-    }
-
-    private static ExperimentIdentifierSearchCriteria convertToIdentifierExperimentCriteria(
-            ExperimentSearchCriteria experimentSearchCriteria)
-    {
-        SingleExperimentSearchCriteria experiment = experimentSearchCriteria.tryGetExperiment();
-        if (experiment != null)
-        {
-            return new ExperimentIdentifierSearchCriteria(experiment.getExperimentIdentifier());
-        } else
-        {
-            return ExperimentIdentifierSearchCriteria.createSearchAll();
-        }
-    }
-
-    public static String createWellsSearchLink(
-            final ExperimentPermIdSearchCriteria experimentCriteria,
-            final MaterialSearchCodesCriteria materialCodesCriteria, boolean showCombinedResults)
     {
         URLMethodWithParameters url = new URLMethodWithParameters("");
         url.addParameter(BasicConstant.LOCATOR_ACTION_PARAMETER, WELL_SEARCH_ACTION);
-        if (false == StringUtils.isBlank(experimentCriteria.tryGetExperimentPermId()))
+        SingleExperimentSearchCriteria experiment = experimentCriteria.tryGetExperiment();
+        BasicProjectIdentifier project = experimentCriteria.tryGetProjectIdentifier();
+        if (experiment != null)
         {
             url.addParameter(WELL_SEARCH_EXPERIMENT_PERM_ID_PARAMETER_KEY,
-                    experimentCriteria.tryGetExperimentPermId());
+                    experiment.getExperimentPermId());
+        }
+        if (project != null)
+        {
+            url.addParameterWithoutEncoding(SPACE_CODE_KEY, project.getSpaceCode());
+            url.addParameterWithoutEncoding(PROJECT_CODE_KEY, project.getProjectCode());
         }
         url.addParameter(WELL_SEARCH_IS_EXACT_PARAMETER_KEY,
                 materialCodesCriteria.isExactMatchOnly());
@@ -232,38 +152,49 @@ public class ScreeningLinkExtractor extends LinkExtractor
         return tryPrint(url);
     }
 
-    /** Creates a link for material detail view where a single experiment is chosen */
-    public static final String tryCreateMaterialDetailsLink(IEntityInformationHolder material,
-            String experimentIdentifier)
+    private static ExperimentIdentifierSearchCriteria convertToIdentifierExperimentCriteria(
+            ExperimentSearchCriteria experimentSearchCriteria)
     {
-        assert experimentIdentifier != null : "experimentIdentifier is null";
-        return tryCreateMaterialDetailsLink(material, new ExperimentIdentifierSearchCriteria(
-                experimentIdentifier));
+        SingleExperimentSearchCriteria experiment = experimentSearchCriteria.tryGetExperiment();
+        BasicProjectIdentifier project = experimentSearchCriteria.tryGetProjectIdentifier();
+        if (experiment != null)
+        {
+            return ExperimentIdentifierSearchCriteria.createExperimentScope(
+                    experiment.getExperimentIdentifier(),
+                    experimentSearchCriteria.getRestrictGlobalSearchLinkToProject());
+        } else if (project != null)
+        {
+            return ExperimentIdentifierSearchCriteria.createProjectScope(project);
+        } else
+        {
+            return ExperimentIdentifierSearchCriteria.createSearchAll();
+        }
     }
 
     /**
-     * Creates a link for material detail.
+     * Creates a link for material detail view.
      * 
      * @param experimentCriteriaOrNull if null, no search for data about locations of the material
      *            takes place. Otherwise the search is performed in all or a single experiment.
      */
-    public static final String tryCreateMaterialDetailsLink(IEntityInformationHolder material,
+    public static final String createMaterialDetailsLink(IEntityInformationHolder material,
             ExperimentIdentifierSearchCriteria experimentCriteriaOrNull)
     {
         URLMethodWithParameters url =
-                tryCreateMaterialDetailsLink(material.getCode(),
-                        material.getEntityType().getCode(), experimentCriteriaOrNull);
+                createMaterialDetailsLink(material.getCode(), material.getEntityType().getCode(),
+                        experimentCriteriaOrNull);
         return tryPrint(url);
     }
 
-    private static final URLMethodWithParameters tryCreateMaterialDetailsLink(String materialCode,
+    private static final URLMethodWithParameters createMaterialDetailsLink(String materialCode,
             String materialTypeCode, ExperimentIdentifierSearchCriteria experimentCriteriaOrNull)
     {
-        if (materialCode == null || materialTypeCode == null)
-        {
-            return null;
-        }
+        assert materialCode != null;
+        assert materialTypeCode != null;
+
         URLMethodWithParameters url = tryCreateMaterialLink(materialCode, materialTypeCode);
+        assert url != null : "url is null";
+
         if (experimentCriteriaOrNull != null)
         {
             if (experimentCriteriaOrNull.searchAllExperiments())
@@ -272,24 +203,37 @@ public class ScreeningLinkExtractor extends LinkExtractor
                         MATERIAL_DETAIL_SEARCH_ALL_EXPERIMENTS_PARAMETER_VALUE);
             } else
             {
-                // We know that experiment identifier cannot contain characters that should be
-                // encoded
-                // apart from '/'. Encoding '/' makes the URL less readable and on the other hand
-                // leaving it as it is doesn't cause us any problems.
-                url.addParameterWithoutEncoding(MATERIAL_DETAIL_EXPERIMENT_IDENT_PARAMETER_KEY,
-                        StringEscapeUtils.unescapeHtml(experimentCriteriaOrNull
-                                .tryGetExperimentIdentifier()));
+                BasicProjectIdentifier project = experimentCriteriaOrNull.tryGetProject();
+                if (project != null)
+                {
+                    url.addParameterWithoutEncoding(SPACE_CODE_KEY, project.getSpaceCode());
+                    url.addParameterWithoutEncoding(PROJECT_CODE_KEY, project.getProjectCode());
+                } else
+                {
+                    // We know that experiment identifier cannot contain characters that should be
+                    // encoded
+                    // apart from '/'. Encoding '/' makes the URL less readable and on the other
+                    // hand
+                    // leaving it as it is doesn't cause us any problems.
+                    url.addParameterWithoutEncoding(MATERIAL_DETAIL_EXPERIMENT_IDENT_PARAMETER_KEY,
+                            StringEscapeUtils.unescapeHtml(experimentCriteriaOrNull
+                                    .tryGetExperimentIdentifier()));
+                    if (experimentCriteriaOrNull.getRestrictGlobalSearchLinkToProject())
+                    {
+                        url.addParameterWithoutEncoding(RESTRICT_GLOBAL_SEARCH_TO_PROJECT, "true");
+                    }
+                }
             }
         }
         return url;
     }
 
-    public static String tryCreateMaterialDetailsLink(IEntityInformationHolder material,
+    public static String createMaterialDetailsLink(IEntityInformationHolder material,
             ExperimentSearchCriteria experimentSearchCriteria)
     {
         ExperimentIdentifierSearchCriteria experimentCriteria =
                 convertToIdentifierExperimentCriteria(experimentSearchCriteria);
-        return tryCreateMaterialDetailsLink(material, experimentCriteria);
+        return createMaterialDetailsLink(material, experimentCriteria);
     }
 
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/dto/ExperimentIdentifierSearchCriteria.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/dto/ExperimentIdentifierSearchCriteria.java
index 58de6a1ea07..187b65ce721 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/dto/ExperimentIdentifierSearchCriteria.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/dto/ExperimentIdentifierSearchCriteria.java
@@ -17,25 +17,47 @@
 package ch.systemsx.cisd.openbis.plugin.screening.client.web.client.dto;
 
 import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 
 /**
  * Allows to search in one experiment (given by identifier) or in all of them.
  * 
  * @author Tomasz Pylak
  */
+// TODO 2011-06-07, Tomasz Pylak: rename to MaterialDetailViewScope
 public class ExperimentIdentifierSearchCriteria
 {
     public static ExperimentIdentifierSearchCriteria createSearchAll()
     {
-        return new ExperimentIdentifierSearchCriteria(null);
+        return new ExperimentIdentifierSearchCriteria(null, null, false);
+    }
+
+    public static ExperimentIdentifierSearchCriteria createProjectScope(
+            BasicProjectIdentifier project)
+    {
+        return new ExperimentIdentifierSearchCriteria(null, project, false);
+    }
+
+    public static ExperimentIdentifierSearchCriteria createExperimentScope(
+            String experimentIdentifier, boolean restrictGlobalScopeLinkToProject)
+    {
+        return new ExperimentIdentifierSearchCriteria(experimentIdentifier, null,
+                restrictGlobalScopeLinkToProject);
     }
 
     // if null, all experiments are taken into account
     private final String experimentIdentifierOrNull;
 
-    public ExperimentIdentifierSearchCriteria(String experimentIdentifierOrNull)
+    private final BasicProjectIdentifier projectOrNull;
+
+    private final boolean restrictGlobalScopeLinkToProject;
+
+    private ExperimentIdentifierSearchCriteria(String experimentIdentifierOrNull,
+            BasicProjectIdentifier projectOrNull, boolean restrictGlobalScopeLinkToProject)
     {
         this.experimentIdentifierOrNull = experimentIdentifierOrNull;
+        this.projectOrNull = projectOrNull;
+        this.restrictGlobalScopeLinkToProject = restrictGlobalScopeLinkToProject;
     }
 
     public String tryGetExperimentIdentifier()
@@ -43,9 +65,27 @@ public class ExperimentIdentifierSearchCriteria
         return experimentIdentifierOrNull;
     }
 
+    /**
+     * Valid only if experiment identifier is present ({@link #tryGetExperimentIdentifier} is not
+     * null).<br>
+     * It determines the behavior of the link from material detail view in a single experiment
+     * context to the material detail view in 'global' context. If this parameter is true, the
+     * context will be the project to which the current experiment belongs, otherwise the context
+     * will be switched to all experiments.
+     */
+    public boolean getRestrictGlobalSearchLinkToProject()
+    {
+        return restrictGlobalScopeLinkToProject;
+    }
+
+    public BasicProjectIdentifier tryGetProject()
+    {
+        return projectOrNull;
+    }
+
     public boolean searchAllExperiments()
     {
-        return StringUtils.isBlank(experimentIdentifierOrNull);
+        return StringUtils.isBlank(experimentIdentifierOrNull) && projectOrNull == null;
     }
 
 }
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 7941bbd2ec5..cb7254342b1 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
@@ -49,6 +49,7 @@ import ch.systemsx.cisd.openbis.generic.server.plugin.ISampleTypeSlaveServerPlug
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
 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.basic.dto.CodeAndLabel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
@@ -317,21 +318,32 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
         Session session = getSession(sessionToken);
         // NOTE: we want the settings to be passed form the client in future
         MaterialSummarySettings settings = createDefaultSettings();
-        
-        TechId projectTechIdOrNull;
-        if (experimentCriteria.isAllExperiments()) {
-            projectTechIdOrNull = null;
-        } else {
-            ProjectIdentifier projectIdentifier =
-                    new ProjectIdentifier(experimentCriteria.tryGetProjectIdentifier());
-            Project project = commonServer.getProjectInfo(sessionToken, projectIdentifier);
-            projectTechIdOrNull = new TechId(project);
-        }
+
+        TechId projectTechIdOrNull = tryFetchProjectId(sessionToken, experimentCriteria);
         return MaterialAllAssaysFeatureVectorSummaryLoader.loadMaterialFeatureVectorsFromAllAssays(
                 session, businessObjectFactory, getDAOFactory(), materialId, projectTechIdOrNull,
                 settings);
     }
 
+    private TechId tryFetchProjectId(String sessionToken,
+            WellSearchCriteria.ExperimentSearchByProjectCriteria experimentCriteria)
+    {
+        if (experimentCriteria == null || experimentCriteria.isAllExperiments())
+        {
+            return null;
+        } else
+        {
+            return fetchProjectId(sessionToken, experimentCriteria.tryGetProjectIdentifier());
+        }
+    }
+
+    private TechId fetchProjectId(String sessionToken, BasicProjectIdentifier basicProjectIdentifier)
+    {
+        ProjectIdentifier projectIdentifier = new ProjectIdentifier(basicProjectIdentifier);
+        Project project = commonServer.getProjectInfo(sessionToken, projectIdentifier);
+        return new TechId(project);
+    }
+
     public static MaterialSummarySettings createDefaultSettings()
     {
         MaterialSummarySettings settings = new MaterialSummarySettings();
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 20b378faf39..fc63e1dd5ee 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
@@ -74,6 +74,15 @@ public interface IScreeningQuery extends BaseQuery
     public DataIterator<WellContentQueryResult> getPlateLocationsForMaterialId(long materialId,
             long experimentId);
 
+    /**
+     * @return well locations which are connected to a given material (e.g. gene) and belong to the
+     *         experiments within a given project.
+     */
+    @Select(sql = WELLS_FOR_MATERIAL_ID_SELECT
+            + " where well_material.id = ?{1} and spaces.code = ?{2} and projects.code = ?{3}")
+    public DataIterator<WellContentQueryResult> getPlateLocationsForMaterialId(long materialId,
+            String spaceCode, String projectCode);
+
     /**
      * @return well locations which are connected to a given material (e.g. gene) with the specified
      *         id.
@@ -90,6 +99,18 @@ public interface IScreeningQuery extends BaseQuery
     public DataIterator<WellContentQueryResult> getPlateLocationsForMaterialAndProjectIds(
             long materialId, long projectId);
 
+    /**
+     * @return well locations which belong to a parent plate connected to any experiment in the
+     *         specified project. Each well will have a material property (e.g. gene) with one of
+     *         the specified codes. The connected material will have one of the specified types.
+     */
+    @Select(sql = WELLS_FOR_MATERIAL_ID_SELECT + " where well_material.id = any(?{1}) and "
+            + "well_material_type.code = any(?{2}) and spaces.code = ?{3} and projects.code = ?{4}", parameterBindings =
+        { LongArrayMapper.class, StringArrayMapper.class, TypeMapper.class /* default mapper */,
+                TypeMapper.class })
+    public DataIterator<WellContentQueryResult> getPlateLocationsForMaterialCodesInProject(
+            long[] materialIds, String[] materialTypeCodes, String spaceCode, String projectCode);
+
     /**
      * @return well locations which belong to a parent plate connected to a specified experiment.
      *         Each well will have a material property (e.g. gene) with one of the specified codes.
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java
index 1337d3c2f4e..2fd5caa4e82 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java
@@ -40,6 +40,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.materiallister.IMater
 import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 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.basic.dto.DetailedSearchAssociationCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion;
@@ -736,14 +737,18 @@ public class WellContentLoader extends AbstractContentLoader
         Iterable<WellContentQueryResult> locations;
         MaterialSearchCriteria materialSearchCriteria =
                 materialCriteria.getMaterialSearchCriteria();
-        ExperimentSearchCriteria experiment = materialCriteria.getExperimentCriteria();
+
+        ExperimentSearchCriteria experimentCriteria =
+                materialCriteria.getExperimentCriteria();
+        SingleExperimentSearchCriteria experimentOrNull = experimentCriteria.tryGetExperiment();
+        BasicProjectIdentifier projectOrNull = experimentCriteria.tryGetProjectIdentifier();
+
         IScreeningQuery dao = createDAO(daoFactory);
         if (materialSearchCriteria.tryGetMaterialCodesOrProperties() != null)
         {
             MaterialSearchCodesCriteria codesCriteria =
                     materialSearchCriteria.tryGetMaterialCodesOrProperties();
 
-            Long expId = tryGetExperimentId(experiment);
             long start = System.currentTimeMillis();
             long[] materialIds = findMaterialIds(codesCriteria);
 
@@ -753,28 +758,39 @@ public class WellContentLoader extends AbstractContentLoader
                     abbreviate(materialIds, 100)));
             start = System.currentTimeMillis();
 
-            if (expId == null)
+            if (experimentOrNull != null)
             {
                 locations =
-                        dao.getPlateLocationsForMaterialCodes(materialIds,
-                                codesCriteria.getMaterialTypeCodes());
+                        dao.getPlateLocationsForMaterialCodes(materialIds, codesCriteria
+                                .getMaterialTypeCodes(), experimentOrNull.getExperimentId().getId());
+            } else if (projectOrNull != null)
+            {
+                locations =
+                        dao.getPlateLocationsForMaterialCodesInProject(materialIds,
+                                codesCriteria.getMaterialTypeCodes(), projectOrNull.getSpaceCode(),
+                                projectOrNull.getProjectCode());
             } else
             {
                 locations =
                         dao.getPlateLocationsForMaterialCodes(materialIds,
-                                codesCriteria.getMaterialTypeCodes(), expId);
+                                codesCriteria.getMaterialTypeCodes());
             }
-
         } else if (materialSearchCriteria.tryGetMaterialId() != null)
         {
             long materialId = materialSearchCriteria.tryGetMaterialId().getId();
-            Long expId = tryGetExperimentId(experiment);
-            if (expId == null)
+            if (experimentOrNull != null)
             {
-                locations = dao.getPlateLocationsForMaterialId(materialId);
+                locations =
+                        dao.getPlateLocationsForMaterialId(materialId, experimentOrNull
+                                .getExperimentId().getId());
+            } else if (projectOrNull != null)
+            {
+                locations =
+                        dao.getPlateLocationsForMaterialId(materialId,
+                                projectOrNull.getSpaceCode(), projectOrNull.getProjectCode());
             } else
             {
-                locations = dao.getPlateLocationsForMaterialId(materialId, expId);
+                locations = dao.getPlateLocationsForMaterialId(materialId);
             }
         } else
         {
@@ -863,12 +879,6 @@ public class WellContentLoader extends AbstractContentLoader
         return criterion;
     }
 
-    private Long tryGetExperimentId(ExperimentSearchCriteria experiment)
-    {
-        SingleExperimentSearchCriteria exp = experiment.tryGetExperiment();
-        return exp == null ? null : exp.getExperimentId().getId();
-    }
-
     private List<WellContent> loadLocations(TechId geneMaterialId, TechId experimentId)
     {
         DataIterator<WellContentQueryResult> locations =
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 722f39481c8..3d9a6d6d498 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,40 +16,76 @@
 
 package ch.systemsx.cisd.openbis.plugin.screening.shared.authorization;
 
-import ch.systemsx.cisd.openbis.generic.shared.authorization.predicate.DelegatedPredicate;
+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;
+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
  */
-public final class WellSearchCriteriaPredicate extends
-        DelegatedPredicate<TechId, WellSearchCriteria>
+public final class WellSearchCriteriaPredicate implements IPredicate<WellSearchCriteria>
 {
+    private final IPredicate<TechId> experimentPredicate;
+
+    private final SpaceIdentifierPredicate spacePredicate;
+
     public WellSearchCriteriaPredicate()
     {
-        super(new ExperimentTechIdPredicate());
+        this.experimentPredicate = new ExperimentTechIdPredicate();
+        this.spacePredicate = new SpaceIdentifierPredicate();
     }
 
-    @Override
-    public final String getCandidateDescription()
+    public final void init(IAuthorizationDataProvider provider)
     {
-        return "plate materials search criteria";
+        experimentPredicate.init(provider);
+        spacePredicate.init(provider);
     }
 
-    @Override
-    public TechId tryConvert(WellSearchCriteria value)
+    public final Status evaluate(final PersonPE person,
+            final List<RoleWithIdentifier> allowedRoles, final WellSearchCriteria value)
     {
-        SingleExperimentSearchCriteria exp = value.getExperimentCriteria().tryGetExperiment();
-        if (exp != null)
+        assert person != null : "Unspecified person";
+        assert allowedRoles != null : "Unspecified allowed roles";
+        if (value == null)
         {
-            return exp.getExperimentId();
-        } else
+            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)
         {
-            return null;
+            throw new UserFailureException(ex.getMessage(), ex);
         }
     }
-
 }
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 3b7aee83ab6..2bcd06311fb 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
@@ -55,6 +55,11 @@ public class WellSearchCriteria implements ISerializable
         {
         }
 
+        public SingleExperimentSearchCriteria(IEntityInformationHolderWithIdentifier experiment)
+        {
+            this(experiment.getId(), experiment.getPermId(), experiment.getIdentifier());
+        }
+
         public SingleExperimentSearchCriteria(long experimentId, String experimentPermId,
                 String experimentIdentifier)
         {
@@ -85,54 +90,117 @@ public class WellSearchCriteria implements ISerializable
         }
     }
 
-    /** points to one experiment or all of them */
-    public static class ExperimentSearchCriteria implements IsSerializable, Serializable
+    /** Points to one experiment, all experiments of a project or all accessible experiments. */
+    public static final class ExperimentSearchCriteria implements IsSerializable, Serializable
     {
         private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
-        // if null, all experiments are taken into account
+        // if null, all experiments are taken into account (from one or all projects)
         private SingleExperimentSearchCriteria experimentOrNull;
 
-        public static final ExperimentSearchCriteria createAllExperiments()
+        private BasicProjectIdentifier projectIdOrNull;
+
+        /**
+         * Valid only if single experiment is used as a criteria.
+         */
+        // TODO 2011-06-07, Tomasz Pylak: Determines UI behaviour, should be refactored out from
+        // this server side DTO.
+        private boolean restrictGlobalScopeLinkToProject = false;
+
+        // GWT only
+        private ExperimentSearchCriteria()
+        {
+        }
+
+        public SingleExperimentSearchCriteria tryGetExperiment()
+        {
+            return experimentOrNull;
+        }
+
+        private ExperimentSearchCriteria(SingleExperimentSearchCriteria experimentOrNull,
+                boolean restrictGlobalScopeLinkToProject)
         {
-            return new ExperimentSearchCriteria(null);
+            this.experimentOrNull = experimentOrNull;
+            this.projectIdOrNull = null;
+            this.restrictGlobalScopeLinkToProject = restrictGlobalScopeLinkToProject;
+        }
 
+        private ExperimentSearchCriteria(BasicProjectIdentifier projectIdOrNull)
+        {
+            this.projectIdOrNull = projectIdOrNull;
         }
 
         public static ExperimentSearchCriteria createExperiment(
                 SingleExperimentSearchCriteria experiment)
         {
-            assert experiment != null : "experiment not specified";
-            return new ExperimentSearchCriteria(experiment);
+            return createExperiment(experiment);
+        }
+
+        public static ExperimentSearchCriteria createExperiment(
+                SingleExperimentSearchCriteria experiment, boolean restrictGlobalScopeLinkToProject)
+        {
+            return new ExperimentSearchCriteria(experiment, restrictGlobalScopeLinkToProject);
         }
 
-        public static final ExperimentSearchCriteria createExperiment(
+        public static ExperimentSearchCriteria createExperiment(
                 IEntityInformationHolderWithIdentifier experiment)
         {
-            return createExperiment(experiment.getId(), experiment.getPermId(),
-                    experiment.getIdentifier());
+            return createExperiment(experiment, false);
         }
 
-        private static final ExperimentSearchCriteria createExperiment(long experimentId,
-                String experimentPermId, String experimentIdentifier)
+        public static ExperimentSearchCriteria createExperiment(
+                IEntityInformationHolderWithIdentifier experiment,
+                boolean restrictGlobalScopeLinkToProject)
         {
-            return new ExperimentSearchCriteria(new SingleExperimentSearchCriteria(experimentId,
-                    experimentPermId, experimentIdentifier));
+            return createExperiment(new SingleExperimentSearchCriteria(experiment),
+                    restrictGlobalScopeLinkToProject);
         }
 
-        // GWT only
-        private ExperimentSearchCriteria()
+        public static ExperimentSearchCriteria createAllExperiments()
         {
+            return new ExperimentSearchCriteria(null, false);
         }
 
-        private ExperimentSearchCriteria(SingleExperimentSearchCriteria experimentOrNull)
+        public static final ExperimentSearchCriteria createAllExperimentsForProject(
+                BasicProjectIdentifier projectIdentifier)
         {
-            this.experimentOrNull = experimentOrNull;
+            if (projectIdentifier == null)
+            {
+                throw new IllegalArgumentException("Project identifier cannot be null");
+            }
+            return new ExperimentSearchCriteria(projectIdentifier);
         }
 
-        public SingleExperimentSearchCriteria tryGetExperiment()
+        public BasicProjectIdentifier tryGetProjectIdentifier()
         {
-            return experimentOrNull;
+            return projectIdOrNull;
+        }
+
+        /**
+         * Valid only if single experiment is used as a criteria.<br>
+         * It determines the behavior of the link from material detail view in a single experiment
+         * context to the material detail view in 'global' context. If this parameter is true, the
+         * context will be the project to which the current experiment belongs, otherwise the
+         * context will be switched to all experiments.
+         */
+        public boolean getRestrictGlobalSearchLinkToProject()
+        {
+            return restrictGlobalScopeLinkToProject;
+        }
+
+        public ExperimentSearchByProjectCriteria tryAsSearchByProjectCriteria()
+        {
+            if (tryGetExperiment() != null)
+            {
+                return null;
+            } else if (projectIdOrNull != null)
+            {
+                return ExperimentSearchByProjectCriteria
+                        .createAllExperimentsForProject(projectIdOrNull);
+            } else
+            {
+                return ExperimentSearchByProjectCriteria.createAllExperimentsForAllProjects();
+            }
         }
 
         @Override
@@ -140,12 +208,19 @@ public class WellSearchCriteria implements ISerializable
         {
             if (experimentOrNull == null)
             {
-                return "all experiments";
+                if (projectIdOrNull == null)
+                {
+                    return "all experiments";
+                } else
+                {
+                    return "all experiments from project " + projectIdOrNull;
+                }
             } else
             {
                 return experimentOrNull.toString();
             }
         }
+
     }
 
     public static final class ExperimentSearchByProjectCriteria implements IsSerializable,
@@ -171,10 +246,11 @@ public class WellSearchCriteria implements ISerializable
             return new ExperimentSearchByProjectCriteria(null);
         }
 
+        // GWT only
         private ExperimentSearchByProjectCriteria()
         {
         }
-        
+
         private ExperimentSearchByProjectCriteria(BasicProjectIdentifier projectIdOrNull)
         {
             this.projectIdOrNull = projectIdOrNull;
@@ -190,6 +266,17 @@ public class WellSearchCriteria implements ISerializable
             return projectIdOrNull == null;
         }
 
+        public ExperimentSearchCriteria asExtendedCriteria()
+        {
+            if (projectIdOrNull != null)
+            {
+                return ExperimentSearchCriteria.createAllExperimentsForProject(projectIdOrNull);
+            } else
+            {
+                return ExperimentSearchCriteria.createAllExperiments();
+            }
+        }
+
         @Override
         public String toString()
         {
diff --git a/screening/sourceTest/java/BiozentrumMatLabApiTest.java b/screening/sourceTest/java/BiozentrumMatLabApiTest.java
index 14e109d8d25..73d5620e5ab 100644
--- a/screening/sourceTest/java/BiozentrumMatLabApiTest.java
+++ b/screening/sourceTest/java/BiozentrumMatLabApiTest.java
@@ -41,19 +41,109 @@ public class BiozentrumMatLabApiTest
             mountPoint = args[2];
         }
 
-        OpenBISScreeningML.login("admin", passwd, "http://bc2-openbis01.bc2.unibas.ch:8443");
+        OpenBISScreeningML.login("cisd", passwd, "http://bc2-openbis01.bc2.unibas.ch:8443");
 
+        String experiment = "/TEST/TEST-USER/MY-ASSAY";
+        Object[][] channels = OpenBISScreeningML.listChannels(experiment);
+        print2DArray(channels);
+
+        testLoadFeatures(chosenPlate, experiment);
+
+        testImagesMetadata(chosenPlate);
+        testLoadImage(chosenPlate);
+        testWellProperties(chosenPlate);
+        testLoadDataset(chosenPlate, mountPoint, datasetTypePattern);
+
+        OpenBISScreeningML.logout();
+    }
+
+    private static void testLoadFeatures(String chosenPlate, String experiment)
+    {
+        Object[][] features = OpenBISScreeningML.listFeatures(experiment);
+        print2DArray(features);
+
+        Object[][][] featureMatrix = OpenBISScreeningML.getFeatureMatrixForPlate(chosenPlate);
+        System.out.println("per plate features -------------------------------");
+        print3DArray(featureMatrix);
+
+        String[] featureNames = new String[]
+            { "OOF" };
+        featureMatrix = OpenBISScreeningML.getFeatureMatrixForPlate(chosenPlate, featureNames);
+        System.out.println("one per plate feature -------------------------------");
+        print3DArray(featureMatrix);
+
+        featureMatrix = OpenBISScreeningML.getFeatureMatrix(experiment, "149420", featureNames);
+        System.out.println("one per gene feature -------------------------------");
+        print3DArray(featureMatrix);
+    }
+
+    private static void print3DArray(Object[][][] array)
+    {
+        System.out.println("{");
+        for (int i = 0; i < array.length; i++)
+        {
+            print2DArray(array[i]);
+        }
+        System.out.println("}");
+    }
+
+    private static void print2DArray(Object[][] array)
+    {
+        System.out.println("[");
+        for (int i = 0; i < array.length; i++)
+        {
+            printAsRow(array[i]);
+        }
+        System.out.println("]");
+    }
+
+    private static void printAsRow(Object[] objects)
+    {
+        StringBuffer sb = new StringBuffer();
+        sb.append("[");
+        for (int i = 0; i < objects.length; i++)
+        {
+            sb.append(objects[i]);
+            sb.append(",");
+        }
+        sb.append("]");
+        System.out.println(sb.toString());
+    }
+
+    private static void testImagesMetadata(String chosenPlate)
+    {
         Object[][] meta = OpenBISScreeningML.getImagesMetadata(chosenPlate);
-        System.out.println(String.format("Number of tiles: %s. Plate geometry %sx%s", meta[1][3],
-                meta[1][6], meta[1][7]));
+        System.out.println(String.format("Number of tiles: %s. Plate geometry %sx%s", meta[0][2],
+                meta[0][5], meta[0][6]));
+    }
+
+    private static void testLoadDataset(String chosenPlate, String mountPoint,
+            String datasetTypePattern)
+    {
+        // Loads dataset with classification results.
+        // OpenBIS store diretcory is mounted locally in "/mount/openbis/store", so no data are
+        // copied and just a path to the appropriate location
+        // is returned.
+        Object[][] datasets =
+                OpenBISScreeningML.loadDataSets(chosenPlate, datasetTypePattern, mountPoint);
+        System.out.println("Path to the first downloaded dataset: " + datasets[0][1]);
+    }
 
+    private static void testLoadImage(String chosenPlate)
+    {
         // fetch 3ed tile of well (1,1). The second call to fetch this image will return it from the
         // local cache.
         // The last optional parameter can specify a list of channels to load (otherwise all
         // channels are loaded).
-        Object[][][] images = OpenBISScreeningML.loadImages(chosenPlate, 1, 1, 3);
-        System.out.println("Image path: " + images[1][1]);
+        long start = System.currentTimeMillis();
+        Object[][][] images = OpenBISScreeningML.loadImages(chosenPlate, 1, 1, 3, new String[]
+            { "CY3" });
+        System.out.println("Image path: " + images[0][0][0]);
+        System.out.println("Took: " + (System.currentTimeMillis() - start));
+    }
 
+    private static void testWellProperties(String chosenPlate)
+    {
         // properties of well (2,4)
         Object[][] props = OpenBISScreeningML.getWellProperties(chosenPlate, 2, 4);
         for (int i = 0; i < props.length; i++)
@@ -66,13 +156,5 @@ public class BiozentrumMatLabApiTest
             {
                 { "DESCRIPTION", "hello example" } };
         OpenBISScreeningML.updateWellProperties(chosenPlate, 2, 4, props);
-
-        // Loads dataset with classification results.
-        // OpenBIS store diretcory is mounted locally in "/mount/openbis/store", so no data are
-        // copied and just a path to the appropriate location
-        // is returned.
-        Object[][] datasets =
-                OpenBISScreeningML.loadDataSets(chosenPlate, datasetTypePattern, mountPoint);
-        System.out.println("Path to the first downloaded dataset: " + datasets[0][1]);
     }
 }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java
index e8b91ae00bc..271c6da2bf0 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java
@@ -33,9 +33,9 @@ public class EntityTypeLabelUtilsTest extends AssertJUnit
     @Test
     public void test()
     {
-        assertEquals("2011-05-30, Raw (DAT)", createLabel("HCS_IMAGE_RAW", true));
-        assertEquals("2011-05-30, Features", createLabel("HCS_ANALYSIS_WELL_FEATURES", false));
-        assertEquals("2011-05-30, Analysis cell classifications (DAT)",
+        assertEquals("Raw (DAT), 2011-05-30 12:34", createLabel("HCS_IMAGE_RAW", true));
+        assertEquals("Features, 2011-05-30 12:34", createLabel("HCS_ANALYSIS_WELL_FEATURES", false));
+        assertEquals("Analysis cell classifications (DAT), 2011-05-30 12:34",
                 createLabel("HCS_ANALYSIS_CELL_CLASSIFICATIONS", true));
 
     }
@@ -44,7 +44,7 @@ public class EntityTypeLabelUtilsTest extends AssertJUnit
     {
         DatasetReference ref =
                 new DatasetReference(0, "code", typeCode, null, "DAT", null, null, null, null);
-        return EntityTypeLabelUtils.createDatasetLabel(ref, withFileType, "2011-05-30");
+        return EntityTypeLabelUtils.createDatasetLabel(ref, withFileType, "2011-05-30 12:34");
     }
 
 }
\ No newline at end of file
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/ScreeningDAOTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/ScreeningDAOTest.java
index b03d89a8166..f589680be44 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/ScreeningDAOTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/dataaccess/ScreeningDAOTest.java
@@ -79,11 +79,22 @@ public class ScreeningDAOTest extends AbstractScreeningDAOTest
         AssertJUnit.assertEquals(0, locations.size());
     }
 
+    @Test
+    public void testGetPlateLocationsForOneMaterialAllExperimentsFromProject()
+    {
+        // it just tests if the sql runs
+        List<WellContentQueryResult> locations =
+                EntityListingTestUtils.asList(query.getPlateLocationsForMaterialId(1, "space",
+                        "project"));
+        AssertJUnit.assertEquals(0, locations.size());
+    }
+
     @Test
     public void testGetPlateMappingAllTypes()
     {
         // it just tests if the sql runs
-        List<WellContentQueryResult> locations = EntityListingTestUtils.asList(query.getPlateMapping("xxx"));
+        List<WellContentQueryResult> locations =
+                EntityListingTestUtils.asList(query.getPlateMapping("xxx"));
         AssertJUnit.assertEquals(0, locations.size());
     }
 
@@ -148,6 +159,12 @@ public class ScreeningDAOTest extends AbstractScreeningDAOTest
                         materialTypeCodes, 1));
         AssertJUnit.assertEquals(0, locations.size());
 
+        // one project
+        locations =
+                EntityListingTestUtils.asList(query.getPlateLocationsForMaterialCodesInProject(ids,
+                        materialTypeCodes, "space", "project"));
+        AssertJUnit.assertEquals(0, locations.size());
+
         // all experiments
         locations =
                 EntityListingTestUtils.asList(query.getPlateLocationsForMaterialCodes(ids,
-- 
GitLab