diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractClientPluginFactory.java
index a2ae67dc87bb3d906aa4c249cb2fcf0da59c30b9..32d2eba41cffa159925a0c100b8b08f33ac0e0cc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AbstractClientPluginFactory.java
@@ -26,10 +26,10 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IMo
  * 
  * @author Christian Ribeaud
  */
-public abstract class AbstractClientPluginFactory<S extends IClientServiceAsync> implements
-        IClientPluginFactory
+public abstract class AbstractClientPluginFactory<V extends IViewContext<? extends IClientServiceAsync>>
+        implements IClientPluginFactory
 {
-    private final IViewContext<S> viewContext;
+    private final V viewContext;
 
     protected AbstractClientPluginFactory(
             final IViewContext<ICommonClientServiceAsync> originalViewContext)
@@ -37,10 +37,10 @@ public abstract class AbstractClientPluginFactory<S extends IClientServiceAsync>
         this.viewContext = createViewContext(originalViewContext);
     }
 
-    protected abstract IViewContext<S> createViewContext(
+    protected abstract V createViewContext(
             IViewContext<ICommonClientServiceAsync> originalViewContext);
 
-    public final IViewContext<S> getViewContext()
+    public final V getViewContext()
     {
         return viewContext;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
index 63c4e2f035e26cc48461c72d84fd4f7a530c4ded..22d61062b84e4a2ee28e1af0ee2ff1b630e63b85 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
@@ -42,6 +42,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.ICl
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
+import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
@@ -171,10 +172,10 @@ public abstract class AbstractViewer<D extends IEntityInformationHolder> extends
     }
 
     public static String getTitle(final IMessageProvider messageProvider,
-            final String entityKindDictKey, final IIdentifiable identifiable)
+            final String entityKindDictKey, final ICodeProvider codeProvider)
     {
         return messageProvider.getMessage(Dict.DETAILS_TITLE, messageProvider
-                .getMessage(entityKindDictKey), identifiable.getCode());
+                .getMessage(entityKindDictKey), codeProvider.getCode());
     }
 
     /** Updates data displayed in the browser (needed to open editor view). */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java
index 560d6832f5b3407a23a6d6a089bc5203fe9eeac7..0126cfc31e4411bddc994778781073a5aa29d594 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/client/web/client/application/ClientPluginFactory.java
@@ -42,7 +42,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
-import ch.systemsx.cisd.openbis.plugin.demo.client.web.client.IDemoClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.GenericViewContext;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.GenericSampleRegistrationForm;
 
@@ -54,7 +53,7 @@ import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sam
  * 
  * @author Christian Ribeaud
  */
-public final class ClientPluginFactory extends AbstractClientPluginFactory<IDemoClientServiceAsync>
+public final class ClientPluginFactory extends AbstractClientPluginFactory<DemoViewContext>
 {
 
     public ClientPluginFactory(final IViewContext<ICommonClientServiceAsync> originalViewContext)
@@ -67,7 +66,7 @@ public final class ClientPluginFactory extends AbstractClientPluginFactory<IDemo
     //
 
     @Override
-    protected final IViewContext<IDemoClientServiceAsync> createViewContext(
+    protected final DemoViewContext createViewContext(
             final IViewContext<ICommonClientServiceAsync> originalViewContext)
     {
         return new DemoViewContext(originalViewContext);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
index 21e58bf5158cbfd7972ab1f5471ef4aeed0c0a42..f0b3da90482c0ce79c7db48c66ded28722c7132b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/ClientPluginFactory.java
@@ -45,7 +45,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
-import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.GenericDataSetEditForm;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.GenericDataSetViewer;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment.GenericExperimentEditForm;
@@ -65,8 +64,7 @@ import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sam
  * 
  * @author Christian Ribeaud
  */
-public final class ClientPluginFactory extends
-        AbstractClientPluginFactory<IGenericClientServiceAsync>
+public final class ClientPluginFactory extends AbstractClientPluginFactory<GenericViewContext>
 {
     public ClientPluginFactory(final IViewContext<ICommonClientServiceAsync> originalViewContext)
     {
@@ -78,7 +76,7 @@ public final class ClientPluginFactory extends
     //
 
     @Override
-    protected final IViewContext<IGenericClientServiceAsync> createViewContext(
+    protected final GenericViewContext createViewContext(
             final IViewContext<ICommonClientServiceAsync> originalViewContext)
     {
         return new GenericViewContext(originalViewContext);
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java
index 665ec4a7ea8d77cce1aedc7b1057fbcbe1c8b90d..7b0daa45a54174b43743350a2c0a84f28515fc12 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ClientPluginFactory.java
@@ -45,13 +45,11 @@ import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.Gen
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment.GenericExperimentEditForm;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment.GenericExperimentRegistrationForm;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment.GenericExperimentViewer;
-import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientServiceAsync;
 
 /**
  * @author Franz-Josef Elmer
  */
-public class ClientPluginFactory extends
-        AbstractClientPluginFactory<IPhosphoNetXClientServiceAsync>
+public class ClientPluginFactory extends AbstractClientPluginFactory<ViewContext>
 {
 
     public ClientPluginFactory(IViewContext<ICommonClientServiceAsync> originalViewContext)
@@ -60,7 +58,7 @@ public class ClientPluginFactory extends
     }
 
     @Override
-    protected IViewContext<IPhosphoNetXClientServiceAsync> createViewContext(
+    protected ViewContext createViewContext(
             IViewContext<ICommonClientServiceAsync> originalViewContext)
     {
         return new ViewContext(originalViewContext);
@@ -103,7 +101,7 @@ public class ClientPluginFactory extends
         //
         // IViewClientPlugin
         //
-        
+
         @Override
         public final ITabItemFactory createEntityViewer(final IIdentifiable identifiable)
         {
@@ -147,7 +145,8 @@ public class ClientPluginFactory extends
                     public ITabItem create()
                     {
                         DatabaseModificationAwareComponent component =
-                                GenericExperimentEditForm.create(getGenericViewContext(), identifiable);
+                                GenericExperimentEditForm.create(getGenericViewContext(),
+                                        identifiable);
                         String title = getEditorTitle(Dict.EXPERIMENT, identifiable);
                         return DefaultTabItem.create(title, component, getViewContext(), true);
                     }
@@ -165,18 +164,20 @@ public class ClientPluginFactory extends
                     }
                 };
         }
-        
-        private String getViewerTitle(final String entityKindDictKey, final IIdentifiable identifiable)
+
+        private String getViewerTitle(final String entityKindDictKey,
+                final IIdentifiable identifiable)
         {
             return AbstractViewer.getTitle(getViewContext(), entityKindDictKey, identifiable);
         }
 
-        private String getEditorTitle(final String entityKindDictKey, final IIdentifiable identifiable)
+        private String getEditorTitle(final String entityKindDictKey,
+                final IIdentifiable identifiable)
         {
             return AbstractRegistrationForm.getEditTitle(getViewContext(), entityKindDictKey,
                     identifiable);
         }
-        
+
         private IViewContext<IGenericClientServiceAsync> getGenericViewContext()
         {
             return new GenericViewContext(getViewContext().getCommonViewContext());
@@ -184,4 +185,3 @@ public class ClientPluginFactory extends
     }
 
 }
-
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 d9794f6a26d3b59646ddab63d872acbb6a11e153..e319877f3b1964a4916c1491e11c007862c8fcb9 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
@@ -27,16 +27,21 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DefaultTabItem;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable;
 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.EntityType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.ScreeningConstants;
@@ -51,8 +56,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.d
  * 
  * @author Tomasz Pylak
  */
-public final class ClientPluginFactory extends
-        AbstractClientPluginFactory<IScreeningClientServiceAsync>
+public final class ClientPluginFactory extends AbstractClientPluginFactory<ScreeningViewContext>
 {
 
     public ClientPluginFactory(final IViewContext<ICommonClientServiceAsync> originalViewContext)
@@ -65,7 +69,7 @@ public final class ClientPluginFactory extends
     //
 
     @Override
-    protected final IViewContext<IScreeningClientServiceAsync> createViewContext(
+    protected final ScreeningViewContext createViewContext(
             final IViewContext<ICommonClientServiceAsync> originalViewContext)
     {
         return new ScreeningViewContext(originalViewContext);
@@ -93,7 +97,7 @@ public final class ClientPluginFactory extends
     public <T extends EntityType, I extends IIdentifiable> IClientPlugin<T, I> createClientPlugin(
             final EntityKind entityKind)
     {
-        IViewContext<IScreeningClientServiceAsync> viewContext = getViewContext();
+        ScreeningViewContext viewContext = getViewContext();
         if (EntityKind.MATERIAL.equals(entityKind))
         {
             return (IClientPlugin<T, I>) new MaterialClientPlugin(viewContext);
@@ -110,7 +114,7 @@ public final class ClientPluginFactory extends
     // Helper classes
     //
 
-    private final class MaterialClientPlugin extends DelegatedClientPlugin<SampleType>
+    private final class MaterialClientPlugin extends DelegatedClientPlugin<MaterialType>
     {
         private MaterialClientPlugin(IViewContext<IScreeningClientServiceAsync> viewContext)
         {
@@ -118,16 +122,16 @@ public final class ClientPluginFactory extends
         }
 
         @Override
-        public final ITabItemFactory createEntityViewer(final IIdentifiable identifiable)
+        public final ITabItemFactory createEntityViewer(final IIdentifiable materialId)
         {
-            final TechId materialId = TechId.create(identifiable);
             return new ITabItemFactory()
                 {
                     public ITabItem create()
                     {
+                        IViewContext<IScreeningClientServiceAsync> viewContext = getViewContext();
                         final DatabaseModificationAwareComponent viewer =
-                                GeneMaterialViewer.create(getViewContext(), materialId);
-                        return createViewerTab(viewer, identifiable, Dict.MATERIAL);
+                                GeneMaterialViewer.create(viewContext, materialId, null);
+                        return createMaterialViewerTab(materialId, viewer, viewContext);
                     }
 
                     public String getId()
@@ -137,17 +141,54 @@ public final class ClientPluginFactory extends
 
                     public HelpPageIdentifier getHelpPageIdentifier()
                     {
-                        return HelpPageIdentifier.createSpecific("Gene Material Viewer");
+                        return GeneMaterialViewer.getHelpPageIdentifier();
                     }
                 };
         }
     }
 
+    /** opens gene viewer with a selected experiment */
+    public static final void openGeneMaterialViewer(final IIdentifiable materialId,
+            final ExperimentIdentifier experimentIdentifier,
+            final IViewContext<IScreeningClientServiceAsync> viewContext)
+    {
+        ITabItemFactory tab = new ITabItemFactory()
+            {
+                public ITabItem create()
+                {
+                    final DatabaseModificationAwareComponent viewer =
+                            GeneMaterialViewer
+                                    .create(viewContext, materialId, experimentIdentifier);
+                    return createMaterialViewerTab(materialId, viewer, viewContext);
+                }
+
+                public String getId()
+                {
+                    return GeneMaterialViewer.createId(materialId);
+                }
+
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return GeneMaterialViewer.getHelpPageIdentifier();
+                }
+            };
+        DispatcherHelper.dispatchNaviEvent(tab);
+    }
+
+    private static ITabItem createMaterialViewerTab(final IIdentifiable materialId,
+            final DatabaseModificationAwareComponent viewer, IViewContext<?> viewContext)
+    {
+        return createViewerTab(viewer, materialId, Dict.MATERIAL, viewContext);
+    }
+
     private final class SampleClientPlugin extends DelegatedClientPlugin<SampleType>
     {
-        private SampleClientPlugin(IViewContext<IScreeningClientServiceAsync> viewContext)
+        private ScreeningViewContext screeningViewContext;
+
+        private SampleClientPlugin(ScreeningViewContext viewContext)
         {
             super(viewContext, EntityKind.SAMPLE);
+            this.screeningViewContext = viewContext;
         }
 
         @Override
@@ -158,8 +199,9 @@ public final class ClientPluginFactory extends
                     public ITabItem create()
                     {
                         final DatabaseModificationAwareComponent viewer =
-                                PlateSampleViewer.create(getViewContext(), identifiable);
-                        return createViewerTab(viewer, identifiable, Dict.SAMPLE);
+                                PlateSampleViewer.create(screeningViewContext, identifiable);
+                        return createViewerTab(viewer, identifiable, Dict.SAMPLE,
+                                screeningViewContext);
                     }
 
                     public String getId()
@@ -176,16 +218,17 @@ public final class ClientPluginFactory extends
         }
     }
 
-    private ITabItem createViewerTab(DatabaseModificationAwareComponent viewer,
-            IIdentifiable identifiable, String dictTitleKey)
+    private static ITabItem createViewerTab(DatabaseModificationAwareComponent viewer,
+            ICodeProvider codeProvider, String dictTitleKey, IViewContext<?> viewContext)
     {
-        String title = getViewerTitle(dictTitleKey, identifiable);
-        return DefaultTabItem.create(title, viewer, getViewContext(), false);
+        String title = getViewerTitle(dictTitleKey, codeProvider, viewContext);
+        return DefaultTabItem.create(title, viewer, viewContext, false);
     }
 
-    private String getViewerTitle(String dictTitleKey, IIdentifiable identifiable)
+    private static String getViewerTitle(String dictTitleKey, ICodeProvider codeProvider,
+            IMessageProvider messageProvider)
     {
-        return AbstractViewer.getTitle(getViewContext(), dictTitleKey, identifiable);
+        return AbstractViewer.getTitle(messageProvider, dictTitleKey, codeProvider);
     }
 
     /**
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/GeneMaterialViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/GeneMaterialViewer.java
index 8766ec9ec7fb216071a50601963b8923355512c5..55bfda87e2c3a9fd3d6fc86a673ce482e52cf0a3 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/GeneMaterialViewer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/GeneMaterialViewer.java
@@ -36,6 +36,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField;
@@ -44,6 +45,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.E
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabClickListener;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
@@ -67,10 +69,16 @@ public class GeneMaterialViewer extends AbstractViewer<Material>
 
     private static final String PREFIX = GenericConstants.ID_PREFIX + "ScreeningGeneViewer_";
 
+    /**
+     * @param experimentIdentifierOrNull if the experiment is specified, it will be chosen
+     *            automatically when the window opens.
+     */
     public static DatabaseModificationAwareComponent create(
-            final IViewContext<IScreeningClientServiceAsync> viewContext, final TechId materialId)
+            IViewContext<IScreeningClientServiceAsync> viewContext, IIdentifiable materialId,
+            ExperimentIdentifier experimentIdentifierOrNull)
     {
-        GeneMaterialViewer viewer = new GeneMaterialViewer(viewContext, materialId);
+        GeneMaterialViewer viewer =
+                new GeneMaterialViewer(viewContext, materialId, experimentIdentifierOrNull);
 
         return new DatabaseModificationAwareComponent(viewer, viewer.propertiesSection);
     }
@@ -81,26 +89,37 @@ public class GeneMaterialViewer extends AbstractViewer<Material>
 
     private final DefaultChannelState channelState;
 
-    protected GeneMaterialViewer(final IViewContext<IScreeningClientServiceAsync> viewContext,
-            final TechId materialId)
+    private GeneMaterialViewer(final IViewContext<IScreeningClientServiceAsync> viewContext,
+            final IIdentifiable materialId, ExperimentIdentifier experimentIdentifierOrNull)
     {
         super(viewContext, createId(materialId));
-        this.propertiesSection = new MaterialPropertiesComponent(viewContext, materialId, -1, 1)
-            {
-                @Override
-                protected void getMaterialInfo(AsyncCallback<Material> materialInfoCallback)
-                {
-                    viewContext.getService().getMaterialInfo(materialId, materialInfoCallback);
-                }
-            };
+        TechId materialTechId = TechId.create(materialId);
+        this.propertiesSection =
+                new MaterialPropertiesComponent(viewContext, materialTechId, -1, 1)
+                    {
+                        @Override
+                        protected void getMaterialInfo(AsyncCallback<Material> materialInfoCallback)
+                        {
+                            viewContext.getService().getMaterialInfo(materialId,
+                                    materialInfoCallback);
+                        }
+                    };
         this.viewContext = viewContext;
         this.channelState = new DefaultChannelState();
         setLayout(new BorderLayout());
         add(propertiesSection, createLeftBorderLayoutData());
-        add(createLocationsPanel(materialId), createRightBorderLayoutData());
+        LayoutContainer locationsPanel =
+                createLocationsPanel(materialTechId, experimentIdentifierOrNull);
+        add(locationsPanel, createRightBorderLayoutData());
+
+        if (experimentIdentifierOrNull != null)
+        {
+            loadGeneLocationsPanel(materialTechId, experimentIdentifierOrNull, locationsPanel);
+        }
     }
 
-    private Widget createLocationsPanel(final TechId materialId)
+    private LayoutContainer createLocationsPanel(final TechId materialId,
+            ExperimentIdentifier experimentIdentifierOrNull)
     {
         final LayoutContainer container = new LayoutContainer();
 
@@ -113,11 +132,18 @@ public class GeneMaterialViewer extends AbstractViewer<Material>
                 {
                     if (entity != null)
                     {
-                        loadGeneLocationsPanel(materialId, entity, container);
+                        ExperimentIdentifier experimentIdentifier =
+                                new ExperimentIdentifier(entity.getIdentifier());
+                        loadGeneLocationsPanel(materialId, experimentIdentifier, container);
                     }
                 }
             });
         chooserField.setEditable(false);
+        if (experimentIdentifierOrNull != null)
+        {
+            chooserField.updateValue(experimentIdentifierOrNull);
+        }
+
         container.add(GuiUtils.withLabel(experimentChooser.getField(), "Experiment:", 10));
         container.add(new Text(
                 "Choose an experiment to find wells where this gene has been suppressed."));
@@ -125,13 +151,12 @@ public class GeneMaterialViewer extends AbstractViewer<Material>
         return container;
     }
 
-    private void loadGeneLocationsPanel(TechId materialId, Experiment entity,
-            final LayoutContainer container)
+    private void loadGeneLocationsPanel(TechId materialId,
+            ExperimentIdentifier experimentIdentifier, final LayoutContainer container)
     {
         GuiUtils
                 .replaceLastItem(container, new Text(viewContext.getMessage(Dict.LOAD_IN_PROGRESS)));
-        viewContext.getService().getPlateLocations(materialId,
-                new ExperimentIdentifier(entity.getIdentifier()),
+        viewContext.getService().getPlateLocations(materialId, experimentIdentifier,
                 new AbstractAsyncCallback<List<WellContent>>(viewContext)
                     {
                         @Override
@@ -240,8 +265,13 @@ public class GeneMaterialViewer extends AbstractViewer<Material>
         return LinkRenderer.getLinkWidget(label, listener);
     }
 
-    public static final String createId(final TechId materialId)
+    public static final String createId(final IIdentifiable materialId)
+    {
+        return PREFIX + materialId.getId();
+    }
+
+    public static HelpPageIdentifier getHelpPageIdentifier()
     {
-        return PREFIX + materialId;
+        return HelpPageIdentifier.createSpecific("Gene Material Viewer");
     }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutSection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutSection.java
index 7d902fc1fccb43be77554a6479d4e8358cc009db..776f634fead01f5d0eab3854b7dfe6f515904e63 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutSection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutSection.java
@@ -58,6 +58,7 @@ 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.ScreeningConstants;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict;
+import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningViewContext;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.ChannelChooser.DefaultChannelState;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.PlateContent;
@@ -78,8 +79,7 @@ public class PlateLayoutSection extends SingleSectionPanel
 
     private final TechId sampleId;
 
-    public PlateLayoutSection(IViewContext<IScreeningClientServiceAsync> viewContext,
-            TechId sampleId)
+    public PlateLayoutSection(ScreeningViewContext viewContext, TechId sampleId)
     {
         super("Plate Layout");
         this.sampleId = sampleId;
@@ -89,7 +89,7 @@ public class PlateLayoutSection extends SingleSectionPanel
     }
 
     private AsyncCallback<PlateContent> createDisplayPlateCallback(
-            final IViewContext<IScreeningClientServiceAsync> context)
+            final ScreeningViewContext context)
     {
         return new AbstractAsyncCallback<PlateContent>(context)
             {
@@ -100,7 +100,7 @@ public class PlateLayoutSection extends SingleSectionPanel
                     setLayout(new RowLayout());
                     setScrollMode(Scroll.AUTO);
 
-                    renderPlate(plateContent, viewContext);
+                    renderPlate(plateContent, context);
                     addImageAnalysisButton(plateContent, viewContext);
 
                     addMetadataTable(plateContent, context);
@@ -164,7 +164,7 @@ public class PlateLayoutSection extends SingleSectionPanel
                 reportLabel, new String[] {}, dataset.getDatastoreCode());
     }
 
-    private void renderPlate(PlateContent plateContent, IViewContext<?> viewContext)
+    private void renderPlate(PlateContent plateContent, ScreeningViewContext viewContext)
     {
         LayoutContainer container = new LayoutContainer();
         Widget datasetNumberLegend = tryRenderImageDatasetsNumberLegend(plateContent, viewContext);
@@ -231,7 +231,8 @@ public class PlateLayoutSection extends SingleSectionPanel
         return legend;
     }
 
-    private LayoutContainer renderWellsMatrix(PlateContent plateContent, IViewContext<?> viewContext)
+    private LayoutContainer renderWellsMatrix(PlateContent plateContent,
+            ScreeningViewContext viewContext)
     {
         WellData[][] wellMatrix = createMatrix(plateContent);
         List<Widget> wellWidgets = createWellWidgets(wellMatrix, plateContent, viewContext);
@@ -248,7 +249,7 @@ public class PlateLayoutSection extends SingleSectionPanel
     }
 
     private static List<Widget> createWellWidgets(WellData[][] wellMatrix,
-            PlateContent plateContent, IViewContext<?> viewContext)
+            PlateContent plateContent, ScreeningViewContext viewContext)
     {
         List<Widget> wellWidgets = new ArrayList<Widget>();
         int rowsNum = wellMatrix.length;
@@ -333,7 +334,7 @@ public class PlateLayoutSection extends SingleSectionPanel
 
     private static Component createWellWidget(final WellData wellData,
             final PlateContent plateContent, final DefaultChannelState channelState,
-            final IViewContext<?> viewContext)
+            final ScreeningViewContext viewContext)
     {
         Component widget = createContentWell(wellData);
         widget.addListener(Events.OnMouseDown, new Listener<BaseEvent>()
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateSampleViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateSampleViewer.java
index 4cac5337ed741e951bcdb6f95c15e145168c5632..6dbd98312f6febb0d4716f9a7a606ea82c892e02 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateSampleViewer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateSampleViewer.java
@@ -21,14 +21,13 @@ import java.util.List;
 
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.SingleSectionPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.GenericSampleViewer;
-import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
+import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningViewContext;
 
 /**
  * The <i>screening</i> plate sample viewer.
@@ -37,8 +36,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningCli
  */
 public final class PlateSampleViewer extends GenericSampleViewer
 {
-    public static DatabaseModificationAwareComponent create(
-            final IViewContext<IScreeningClientServiceAsync> viewContext,
+    public static DatabaseModificationAwareComponent create(final ScreeningViewContext viewContext,
             final IIdentifiable identifiable)
     {
         PlateSampleViewer viewer = new PlateSampleViewer(viewContext, identifiable);
@@ -46,9 +44,9 @@ public final class PlateSampleViewer extends GenericSampleViewer
         return new DatabaseModificationAwareComponent(viewer, viewer);
     }
 
-    private final IViewContext<IScreeningClientServiceAsync> screeningViewContext;
+    private final ScreeningViewContext screeningViewContext;
 
-    public PlateSampleViewer(final IViewContext<IScreeningClientServiceAsync> viewContext,
+    public PlateSampleViewer(final ScreeningViewContext viewContext,
             final IIdentifiable identifiable)
     {
         super(viewContext, identifiable);
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 8d95e499eaca131bd5505f9ed2224a6d2033ee4b..e24e156d77935b5775562b5e33997d3a634a7ddd 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
@@ -26,6 +26,7 @@ import com.extjs.gxt.ui.client.widget.layout.FitLayout;
 import com.extjs.gxt.ui.client.widget.layout.RowLayout;
 import com.extjs.gxt.ui.client.widget.layout.TableData;
 import com.extjs.gxt.ui.client.widget.layout.TableLayout;
+import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.user.client.ui.Widget;
 
@@ -33,11 +34,13 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.renderers.SimpleImageHtmlRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabClickListener;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.ScreeningConstants;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict;
+import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningViewContext;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.ChannelChooser.DefaultChannelState;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.ChannelChooser.IChanneledViewerFactory;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellMetadata;
@@ -47,20 +50,17 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellMetadata;
  * 
  * @author Tomasz Pylak
  */
-public class WellContentDialog
+public class WellContentDialog extends Dialog
 {
-    private final WellMetadata metadataOrNull;
-
-    private final IViewContext<?> viewContext;
-
     public static void showContentDialog(final WellData wellData, DefaultChannelState channelState,
-            final IViewContext<?> viewContext)
+            final ScreeningViewContext viewContext)
     {
         final LayoutContainer container = new LayoutContainer();
         container.setLayout(new RowLayout());
 
         final WellContentDialog contentDialog =
-                new WellContentDialog(wellData.tryGetMetadata(), viewContext);
+                new WellContentDialog(wellData.tryGetMetadata(), wellData.getExperiment(),
+                        viewContext);
         LayoutContainer descriptionContainer = contentDialog.createContentDescription();
         container.add(descriptionContainer);
 
@@ -84,22 +84,35 @@ public class WellContentDialog
             dialogHeight = 160;
         }
         String title = "Well Content: " + wellData.getWellContentDescription();
-        showWellContentDialog(container, dialogWidth, dialogHeight, title);
+        contentDialog.setupContentAndShow(container, dialogWidth, dialogHeight, title);
     }
 
-    private static LayoutContainer createImageViewer(final WellImages images,
-            DefaultChannelState channelState, final IViewContext<?> viewContext,
-            final int imageWidth, final int imageHeight)
+    // ----------------
+
+    private final WellMetadata metadataOrNull;
+
+    private final ExperimentIdentifier experimentIdentifier;
+
+    private final ScreeningViewContext viewContext;
+
+    private WellContentDialog(WellMetadata metadataOrNull,
+            ExperimentIdentifier experimentIdentifier, ScreeningViewContext viewContext)
     {
-        final IChanneledViewerFactory viewerFactory = new IChanneledViewerFactory()
-            {
-                public LayoutContainer create(int channel)
-                {
-                    return createTilesGrid(images, channel, viewContext, imageWidth, imageHeight);
-                }
-            };
-        return ChannelChooser.createViewerWithChannelChooser(viewerFactory, channelState, images
-                .getChannelsNum());
+        this.metadataOrNull = metadataOrNull;
+        this.experimentIdentifier = experimentIdentifier;
+        this.viewContext = viewContext;
+    }
+
+    private void setupContentAndShow(LayoutContainer container, int width, int height, String title)
+    {
+        setHeading(title);
+        setLayout(new FitLayout());
+        setScrollMode(Scroll.AUTO);
+        setHideOnButtonClick(true);
+        add(container);
+        setWidth(width);
+        setHeight(height);
+        show();
     }
 
     private LayoutContainer createContentDescription()
@@ -122,7 +135,7 @@ public class WellContentDialog
                 if (gene != null)
                 {
                     container.add(new Text("Inhibited gene: "), cellLayout);
-                    container.add(createEntityLink(gene));
+                    container.add(createGeneViewerLink(gene));
 
                     container.add(new Text("Gene details: "), cellLayout);
                     container.add(createEntityExternalLink(gene));
@@ -144,16 +157,40 @@ public class WellContentDialog
         return new Html(LinkRenderer.renderAsLinkWithAnchor("gene database", url, true));
     }
 
+    private Widget createGeneViewerLink(final IEntityInformationHolder gene)
+    {
+        return LinkRenderer.getLinkWidget(gene.getCode(), new ClickHandler()
+            {
+                public void onClick(ClickEvent event)
+                {
+                    WellContentDialog.this.hide();
+                    ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ClientPluginFactory
+                            .openGeneMaterialViewer(gene, experimentIdentifier, viewContext);
+                }
+            });
+    }
+
     private Widget createEntityLink(IEntityInformationHolder entity)
     {
         final ClickHandler listener = new OpenEntityDetailsTabClickListener(entity, viewContext);
         return LinkRenderer.getLinkWidget(entity.getCode(), listener);
     }
 
-    private WellContentDialog(WellMetadata metadataOrNull, IViewContext<?> viewContext)
+    // -------------
+
+    private static LayoutContainer createImageViewer(final WellImages images,
+            DefaultChannelState channelState, final IViewContext<?> viewContext,
+            final int imageWidth, final int imageHeight)
     {
-        this.metadataOrNull = metadataOrNull;
-        this.viewContext = viewContext;
+        final IChanneledViewerFactory viewerFactory = new IChanneledViewerFactory()
+            {
+                public LayoutContainer create(int channel)
+                {
+                    return createTilesGrid(images, channel, viewContext, imageWidth, imageHeight);
+                }
+            };
+        return ChannelChooser.createViewerWithChannelChooser(viewerFactory, channelState, images
+                .getChannelsNum());
     }
 
     /** @param channel Channel numbers start with 1. Channel 0 consists of all other channels merged. */
@@ -180,7 +217,7 @@ public class WellContentDialog
     }
 
     /** generates URL of an image on Data Store server */
-    public static String createDatastoreImageUrl(WellImages images, int channel, int tileRow,
+    private static String createDatastoreImageUrl(WellImages images, int channel, int tileRow,
             int tileCol, int width, int height, String sessionID)
     {
         URLMethodWithParameters methodWithParameters =
@@ -211,18 +248,4 @@ public class WellContentDialog
     {
         return viewContext.getModel().getSessionContext().getSessionID();
     }
-
-    private static void showWellContentDialog(LayoutContainer container, int width, int height,
-            String title)
-    {
-        Dialog dialog = new Dialog();
-        dialog.setHeading(title);
-        dialog.setLayout(new FitLayout());
-        dialog.setScrollMode(Scroll.AUTO);
-        dialog.setHideOnButtonClick(true);
-        dialog.add(container);
-        dialog.setWidth(width);
-        dialog.setHeight(height);
-        dialog.show();
-    }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellData.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellData.java
index f6c09a2571b7bf2cb3a0df8d8e8c55295dad6ea8..dae9ad6173281ddae8e12a5420d413166fe8fd72 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellData.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellData.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.PlateContent;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.TileImages;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
@@ -32,10 +33,18 @@ class WellData
 
     private WellImages imagesOrNull;
 
+    private ExperimentIdentifier experimentIdentifier;
+
     public static WellData create(PlateContent plateContent, WellLocation location)
     {
+        ExperimentIdentifier experimentIdentifier = getExperimentIdentifier(plateContent);
         WellImages wellImages = tryCreateWellImages(plateContent, location);
-        return new WellData(wellImages);
+        return new WellData(wellImages, experimentIdentifier);
+    }
+
+    private static ExperimentIdentifier getExperimentIdentifier(PlateContent plateContent)
+    {
+        return ExperimentIdentifier.createIdentifier(plateContent.getPlate().getExperiment());
     }
 
     private static WellImages tryCreateWellImages(PlateContent plateContent, WellLocation location)
@@ -50,9 +59,10 @@ class WellData
         }
     }
 
-    private WellData(WellImages imagesOrNull)
+    private WellData(WellImages imagesOrNull, ExperimentIdentifier experimentIdentifier)
     {
         this.imagesOrNull = imagesOrNull;
+        this.experimentIdentifier = experimentIdentifier;
     }
 
     public void setMetadata(WellMetadata well)
@@ -70,6 +80,11 @@ class WellData
         return imagesOrNull;
     }
 
+    public ExperimentIdentifier getExperiment()
+    {
+        return experimentIdentifier;
+    }
+
     public String getWellContentDescription()
     {
         if (metadataOrNull != null)