From a76bcb4bc14923e940202f90a722f7e373658d90 Mon Sep 17 00:00:00 2001
From: tpylak <tpylak>
Date: Wed, 17 Mar 2010 23:57:02 +0000
Subject: [PATCH] LMS-1432 real lazy sections loading

SVN: 15174
---
 .../AttachmentVersionsSection.java            |  15 +-
 ...Panel.java => DisposableSectionPanel.java} |  40 ++---
 .../application/ServerRequestQueue.java       | 133 ---------------
 .../application/SingleSectionPanel.java       |  34 ++--
 ...CompositeDatabaseModificationObserver.java |   7 +-
 ...eModificationObserverWithMainObserver.java |   5 +-
 .../framework/DisplaySettingsManager.java     |   2 +-
 .../ui/attachment/AttachmentBrowser.java      |  10 --
 .../ui/data/AbstractExternalDataGrid.java     |   5 +-
 .../ui/data/DataSetSearchHitGrid.java         |   3 +-
 .../ui/data/RelatedDataSetGrid.java           |   2 +-
 .../ui/grid/AbstractBrowserGrid.java          |  49 +-----
 .../ui/sample/SampleBrowserGrid.java          |   9 +-
 .../dataset/DataSetChildrenSection.java       |  20 ++-
 .../dataset/DataSetParentsSection.java        |  20 ++-
 .../dataset/DataSetRelationshipBrowser.java   |  11 +-
 .../application/dataset/DataViewSection.java  |  35 +++-
 .../experiment/ExperimentDataSetBrowser.java  |   9 +-
 .../experiment/ExperimentDataSetSection.java  |  18 +-
 .../experiment/ExperimentPropertiesPanel.java |   2 +
 .../experiment/ExperimentSamplesSection.java  |  28 +--
 .../experiment/GenericExperimentViewer.java   | 161 +++++++++---------
 .../material/MaterialPropertiesSection.java   |  13 +-
 .../sample/ContainerSamplesSection.java       |  36 ++--
 .../sample/GenericSampleViewer.java           |  38 ++---
 .../sample/SampleDataSetBrowser.java          |  12 +-
 .../sample/SampleDataSetsSection.java         |  35 ++--
 .../client/application/ExperimentViewer.java  |  27 +--
 .../application/ProteinSamplesSection.java    |  32 ++--
 .../web/client/application/ProteinViewer.java |  32 +++-
 .../PlateLayoutDatasetSection.java            |  45 +++--
 .../PlateLayoutSampleSection.java             |  59 +++----
 32 files changed, 373 insertions(+), 574 deletions(-)
 rename openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/{BrowserSectionPanel.java => DisposableSectionPanel.java} (53%)
 delete mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ServerRequestQueue.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AttachmentVersionsSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AttachmentVersionsSection.java
index 6b221e8a7b6..cd851abd023 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AttachmentVersionsSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AttachmentVersionsSection.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.attachment.AttachmentBrowser;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.AttachmentVersions;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IAttachmentHolder;
 
@@ -26,12 +27,20 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IAttachmentHolder;
  * 
  * @author Piotr Buczek
  */
-public class AttachmentVersionsSection<T extends IAttachmentHolder> extends BrowserSectionPanel
+public class AttachmentVersionsSection<T extends IAttachmentHolder> extends DisposableSectionPanel
 {
+    private final T attachmentHolder;
+
     public AttachmentVersionsSection(final IViewContext<ICommonClientServiceAsync> viewContext,
             final T attachmentHolder)
     {
-        super(viewContext.getMessage(Dict.ATTACHMENTS));
-        initializeDisposableBrowser(AttachmentBrowser.create(viewContext, attachmentHolder, getServerRequestQueue()));
+        super(viewContext.getMessage(Dict.ATTACHMENTS), viewContext);
+        this.attachmentHolder = attachmentHolder;
+    }
+
+    @Override
+    protected IDisposableComponent createDisposableContent()
+    {
+        return AttachmentBrowser.create(viewContext.getCommonViewContext(), attachmentHolder);
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/BrowserSectionPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DisposableSectionPanel.java
similarity index 53%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/BrowserSectionPanel.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DisposableSectionPanel.java
index ecbcb44691e..c64dafe8351 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/BrowserSectionPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DisposableSectionPanel.java
@@ -20,45 +20,45 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 
 /**
- * Panel of a details view showing data in a browser (i.e. table).
+ * Panel of a details view showing a component which should be disposed at the end (i.e. browser
+ * grid).
  * 
  * @author Franz-Josef Elmer
  */
-public class BrowserSectionPanel extends SingleSectionPanel
+abstract public class DisposableSectionPanel extends SingleSectionPanel
 {
-    IDisposableComponent disposableBrowser;
+    abstract protected IDisposableComponent createDisposableContent();
+
+    // null if the section has not been shown yet
+    private IDisposableComponent disposableComponentOrNull = null;
 
     /**
-     * Creates section with specified header and disposable browser. Subclasses need to invoke
-     * initializeDisposableBrowser in their constructors -- instances are not usable until the
-     * disposableBrowser has been initialized
+     * Creates section with specified header.
      */
-    public BrowserSectionPanel(String header)
+    public DisposableSectionPanel(String header, IViewContext<?> viewContext)
     {
-        super(header);
+        super(header, viewContext);
     }
 
-    public BrowserSectionPanel(String header, IDisposableComponent browser)
+    public IDatabaseModificationObserver tryGetDatabaseModificationObserver()
     {
-        super(header);
-        initializeDisposableBrowser(browser);
-    }
-
-    public IDatabaseModificationObserver getDatabaseModificationObserver()
-    {
-        return disposableBrowser;
+        return disposableComponentOrNull;
     }
 
     @Override
     protected void onDetach()
     {
-        disposableBrowser.dispose();
+        if (disposableComponentOrNull != null)
+        {
+            disposableComponentOrNull.dispose();
+        }
         super.onDetach();
     }
 
-    protected void initializeDisposableBrowser(IDisposableComponent browser)
+    @Override
+    protected void showContent()
     {
-        this.disposableBrowser = browser;
-        add(disposableBrowser.getComponent());
+        this.disposableComponentOrNull = createDisposableContent();
+        add(disposableComponentOrNull.getComponent());
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ServerRequestQueue.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ServerRequestQueue.java
deleted file mode 100644
index 69cec81866f..00000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ServerRequestQueue.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright 2010 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-
-/**
- * A queue of requests for data from the server. Users of the queue can manage and control when
- * requests are actually sent. If the queue is set to process immediately, requests are not queued,
- * but executed on arrival.
- * 
- * @author Chandrasekhar Ramakrishnan
- */
-public class ServerRequestQueue
-{
-
-    /**
-     * Interface implemented by things in the queue
-     * 
-     * @author Chandrasekhar Ramakrishnan
-     */
-    public static interface IServerRequestAction
-    {
-        /**
-         * Run the request
-         */
-        void onInvoke();
-
-        /**
-         * An object used to identify the request. Requests with the same identifier are considered
-         * to be duplicates.
-         */
-        Object getIdentifier();
-    }
-
-    /**
-     * A default implementation of IServerRequestAction which subclasses may extend.
-     * 
-     * @author Chandrasekhar Ramakrishnan
-     */
-    public static abstract class ServerRequestAction implements IServerRequestAction
-    {
-        final Object identifier;
-
-        public ServerRequestAction(Object identifier)
-        {
-            this.identifier = identifier;
-        }
-
-        public Object getIdentifier()
-        {
-            return identifier;
-        }
-    }
-
-    // Internal State
-    private ArrayList<IServerRequestAction> requests = new ArrayList<IServerRequestAction>();
-
-    private boolean processImmediately;
-
-    // Public API
-    /**
-     * Create a new Queue. By default, do not process immediately.
-     */
-    public ServerRequestQueue()
-    {
-        setProcessImmediately(false);
-    }
-
-    /**
-     * If set to true, requests will not be queued, they will be processed on add.
-     */
-    public void setProcessImmediately(boolean processImmediately)
-    {
-        this.processImmediately = processImmediately;
-    }
-
-    /**
-     * Queue a request.
-     */
-    public void addRequestToQueue(IServerRequestAction requestAction)
-    {
-        if (isProcessImmediately())
-        {
-            requestAction.onInvoke();
-        } else
-        {
-            requests.add(requestAction);
-        }
-    }
-
-    /**
-     * Process the requests in the queue. Duplicates are skipped.
-     */
-    public void processUniqueRequests()
-    {
-        HashSet<Object> processedIdentifiers = new HashSet<Object>();
-        for (IServerRequestAction request : requests)
-        {
-            if (processedIdentifiers.contains(request.getIdentifier()) == false)
-            {
-                processedIdentifiers.add(request.getIdentifier());
-                request.onInvoke();
-            }
-        }
-        requests.clear();
-    }
-
-    // Internal API
-    /**
-     * True if requests are to be processed immediately when they are added to the queue
-     */
-    protected boolean isProcessImmediately()
-    {
-        return processImmediately;
-    }
-
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SingleSectionPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SingleSectionPanel.java
index 513c6032673..2179dee3c9e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SingleSectionPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SingleSectionPanel.java
@@ -30,28 +30,26 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.
  * 
  * @author Izabela Adamczyk
  */
-public class SingleSectionPanel extends ContentPanel
+abstract public class SingleSectionPanel extends ContentPanel
 {
+    /** creates a section content, called when the section is shown for the first time */
+    abstract protected void showContent();
+
+    protected final IViewContext<?> viewContext;
+
     private String displayId;
 
     private boolean isContentVisible = false;
 
-    /**
-     * A queue used to store requests for data when the selection panel is hidden to avoid
-     * retrieving data while the panel is not visible. Subclasses that use abstract browser grids
-     * should set the grid's queue to this queue
-     */
-    private final ServerRequestQueue serverRequestQueue;
-
-    public SingleSectionPanel(final String header)
+    public SingleSectionPanel(final String header, IViewContext<?> viewContext)
     {
+        this.viewContext = viewContext;
         setHeaderVisible(true);
         setHeading(header);
         setCollapsible(true);
         setAnimCollapse(false);
         setBodyBorder(true);
         setLayout(new FitLayout());
-        serverRequestQueue = new ServerRequestQueue();
     }
 
     public void setDisplayID(IDisplayTypeIDGenerator generator, String suffix)
@@ -78,20 +76,10 @@ public class SingleSectionPanel extends ContentPanel
 
     public void setContentVisible(boolean visible)
     {
-        if (this.isContentVisible != visible)
+        if (visible && isContentVisible == false)
         {
-            this.isContentVisible = visible;
-            if (visible)
-            {
-                serverRequestQueue.processUniqueRequests();
-            }
-            serverRequestQueue.setProcessImmediately(visible);
+            showContent();
+            isContentVisible = true;
         }
     }
-
-    protected ServerRequestQueue getServerRequestQueue()
-    {
-        return serverRequestQueue;
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/CompositeDatabaseModificationObserver.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/CompositeDatabaseModificationObserver.java
index 3da8f6fc23e..4af39ab4786 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/CompositeDatabaseModificationObserver.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/CompositeDatabaseModificationObserver.java
@@ -47,9 +47,12 @@ public class CompositeDatabaseModificationObserver implements IDatabaseModificat
         }
     }
 
-    public void addObserver(IDatabaseModificationObserver observer)
+    public void addObserver(IDatabaseModificationObserver observerOrNull)
     {
-        registeredObservers.add(observer);
+        if (observerOrNull != null)
+        {
+            registeredObservers.add(observerOrNull);
+        }
     }
 
     public DatabaseModificationKind[] getRelevantModifications()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/CompositeDatabaseModificationObserverWithMainObserver.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/CompositeDatabaseModificationObserverWithMainObserver.java
index fa207017d4d..94d16cbf641 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/CompositeDatabaseModificationObserverWithMainObserver.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/CompositeDatabaseModificationObserverWithMainObserver.java
@@ -57,10 +57,9 @@ public class CompositeDatabaseModificationObserverWithMainObserver extends
     }
 
     @Override
-    public void addObserver(IDatabaseModificationObserver observer)
+    public void addObserver(IDatabaseModificationObserver observerOrNull)
     {
-        assert mainObserver != null : "main observer cannot be null";
-        super.addObserver(observer);
+        super.addObserver(observerOrNull);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java
index dabb00016b2..02e1f5fb5fb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java
@@ -418,7 +418,7 @@ public class DisplaySettingsManager
     }
 
     /**
-     * @returns section settings for given display id<br>
+     * @returns section settings for given display id - is the section visible or not<br>
      * <br>
      *          NOTE: Returned value should be used read only, or modification time should be set
      *          manually after a modification.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentBrowser.java
index 2e6c0bcbc7e..295e66fe0e9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentBrowser.java
@@ -45,7 +45,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAs
 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.ServerRequestQueue;
 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.DisplayTypeIDGenerator;
@@ -109,15 +108,6 @@ public class AttachmentBrowser extends AbstractSimpleBrowserGrid<AttachmentVersi
         return browser.asDisposableWithoutToolbar();
     }
 
-    public static IDisposableComponent create(
-            final IViewContext<ICommonClientServiceAsync> viewContext,
-            final IAttachmentHolder attachmentHolder, ServerRequestQueue requestQueueOrNull)
-    {
-        final AttachmentBrowser browser = new AttachmentBrowser(viewContext, attachmentHolder);
-        browser.setServerRequestQueue(requestQueueOrNull);
-        return browser.asDisposableWithoutToolbar();
-    }
-
     private final IAttachmentHolder attachmentHolder;
 
     public AttachmentBrowser(IViewContext<ICommonClientServiceAsync> viewContext,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
index 6fe6a7830cb..042af7aa1f9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
@@ -30,7 +30,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ServerRequestQueue;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.EntityGridModelFactory;
@@ -84,11 +83,9 @@ public abstract class AbstractExternalDataGrid
     private final ICriteriaProvider<PropertyTypesCriteria> criteriaProvider;
 
     protected AbstractExternalDataGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
-            String browserId, String gridId, DisplayTypeIDGenerator displayTypeIDGenerator,
-            ServerRequestQueue requestQueueOrNull)
+            String browserId, String gridId, DisplayTypeIDGenerator displayTypeIDGenerator)
     {
         super(viewContext, gridId, false, displayTypeIDGenerator);
-        super.setServerRequestQueue(requestQueueOrNull);
         this.criteriaProvider = createCriteriaProvider();
         setId(browserId);
         updateCriteriaProviderAndRefresh();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java
index d4dc7576541..5f221dc4abc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java
@@ -91,8 +91,7 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
 
     private DataSetSearchHitGrid(final IViewContext<ICommonClientServiceAsync> viewContext)
     {
-        super(viewContext, BROWSER_ID, GRID_ID, DisplayTypeIDGenerator.DATA_SET_SEARCH_RESULT_GRID,
-                null);
+        super(viewContext, BROWSER_ID, GRID_ID, DisplayTypeIDGenerator.DATA_SET_SEARCH_RESULT_GRID);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/RelatedDataSetGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/RelatedDataSetGrid.java
index 3c13ddf537f..1a4042cc494 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/RelatedDataSetGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/RelatedDataSetGrid.java
@@ -59,7 +59,7 @@ public class RelatedDataSetGrid extends AbstractExternalDataGrid
     private RelatedDataSetGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
             final RelatedDataSetCriteria relatedCriteria)
     {
-        super(viewContext, BROWSER_ID, GRID_ID, DisplayTypeIDGenerator.RELATED_DATA_SET_GRID, null);
+        super(viewContext, BROWSER_ID, GRID_ID, DisplayTypeIDGenerator.RELATED_DATA_SET_GRID);
         this.relatedCriteria = relatedCriteria;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
index bf5d7745e43..03fda5a0aec 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
@@ -65,7 +65,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAs
 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.ServerRequestQueue;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ShowRelatedDatasetsDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.VoidAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
@@ -215,9 +214,6 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
 
     private LayoutContainer bottomToolbars;
 
-    // A request queue for managing when requests for data from the server are actually carried out.
-    private ServerRequestQueue serverRequestQueueOrNull = null;
-
     protected AbstractBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
             String gridId, IDisplayTypeIDGenerator displayTypeIDGenerator)
     {
@@ -535,22 +531,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         final ListEntitiesCallback listCallback =
                 new ListEntitiesCallback(viewContext, callback, resultSetConfig);
 
-        // If this objects has a queue, don't execute the request immediately -- queue it up instead
-        if (shouldQueueServerRequests())
-        {
-            ServerRequestQueue queue = tryGetServerRequestQueue();
-            assert queue != null;
-            queue.addRequestToQueue(new ServerRequestQueue.ServerRequestAction(this)
-                {
-                    public void onInvoke()
-                    {
-                        listEntities(resultSetConfig, listCallback);
-                    }
-                });
-        } else
-        {
-            listEntities(resultSetConfig, listCallback);
-        }
+        listEntities(resultSetConfig, listCallback);
     }
 
     private void debug(String msg)
@@ -583,9 +564,8 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         return filters;
     }
 
-    private DefaultResultSetConfig<String, T> createPagingConfig(
-            PagingLoadConfig loadConfig, GridFilters<T> filters,
-            String gridDisplayId)
+    private DefaultResultSetConfig<String, T> createPagingConfig(PagingLoadConfig loadConfig,
+            GridFilters<T> filters, String gridDisplayId)
     {
         int limit = loadConfig.getLimit();
         int offset = loadConfig.getOffset();
@@ -1698,27 +1678,4 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
                     .getTotalCount()).show();
         }
     }
-
-    public ServerRequestQueue tryGetServerRequestQueue()
-    {
-        return serverRequestQueueOrNull;
-    }
-
-    /**
-     * Set the request queue for this browser grid. Pass in null to clear the request queue.
-     */
-    public void setServerRequestQueue(ServerRequestQueue requestQueueOrNull)
-    {
-        this.serverRequestQueueOrNull = requestQueueOrNull;
-    }
-
-    /**
-     * See if requests for data from the server should be queued instead of being executed
-     * immediately. INVARIANT: If this returns true, then the serverRequestQueueOrNull is not null
-     */
-    protected boolean shouldQueueServerRequests()
-    {
-        return this.serverRequestQueueOrNull != null;
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
index 1cab35a7bc1..f19e1de9a84 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
@@ -34,7 +34,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAs
 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.ServerRequestQueue;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ComponentProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
@@ -148,8 +147,7 @@ public class SampleBrowserGrid extends
 
     public static IDisposableComponent createGridForContainerSamples(
             final IViewContext<ICommonClientServiceAsync> viewContext,
-            final TechId containerSampleId, final String gridId, final SampleType sampleType,
-            final ServerRequestQueue requestQueueOrNull)
+            final TechId containerSampleId, final String gridId, final SampleType sampleType)
     {
         final ListSampleDisplayCriteria criteria =
                 ListSampleDisplayCriteria.createForContainer(containerSampleId);
@@ -157,7 +155,6 @@ public class SampleBrowserGrid extends
         final SampleBrowserGrid browserGrid =
                 createGridAsComponent(viewContext, gridId, criteria, entityTypeCode,
                         DisplayTypeIDGenerator.SAMPLE_DETAILS_GRID);
-        browserGrid.setServerRequestQueue(requestQueueOrNull);
         browserGrid.updateCriteriaProviderAndRefresh();
         browserGrid.extendBottomToolbar();
         return browserGrid.asDisposableWithoutToolbar();
@@ -165,8 +162,7 @@ public class SampleBrowserGrid extends
 
     public static IDisposableComponent createGridForExperimentSamples(
             final IViewContext<ICommonClientServiceAsync> viewContext, final TechId experimentId,
-            final String gridId, final ExperimentType experimentType,
-            ServerRequestQueue requestQueueOrNull)
+            final String gridId, final ExperimentType experimentType)
     {
         final ListSampleDisplayCriteria criteria =
                 ListSampleDisplayCriteria.createForExperiment(experimentId);
@@ -175,7 +171,6 @@ public class SampleBrowserGrid extends
         final SampleBrowserGrid browserGrid =
                 createGridAsComponent(viewContext, gridId, criteria, entityTypeCode,
                         DisplayTypeIDGenerator.EXPERIMENT_DETAILS_GRID);
-        browserGrid.setServerRequestQueue(requestQueueOrNull);
         browserGrid.updateCriteriaProviderAndRefresh();
         browserGrid.extendBottomToolbar();
         return browserGrid.asDisposableWithoutToolbar();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetChildrenSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetChildrenSection.java
index a1844a95ef0..5d344f95385 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetChildrenSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetChildrenSection.java
@@ -16,8 +16,9 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.BrowserSectionPanel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
@@ -25,14 +26,21 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 /**
  * @author Piotr Buczek
  */
-class DataSetChildrenSection extends BrowserSectionPanel
+class DataSetChildrenSection extends DisposableSectionPanel
 {
+    private final ExternalData dataset;
+
     DataSetChildrenSection(IViewContext<?> viewContext, ExternalData dataset)
     {
-        super("Children (Data Sets)");
-        initializeDisposableBrowser(DataSetRelationshipBrowser.create(viewContext, TechId
-                .create(dataset), DataSetRelationshipRole.PARENT, dataset.getDataSetType(),
-                getServerRequestQueue()));
+        super("Children (Data Sets)", viewContext);
+        this.dataset = dataset;
+    }
+
+    @Override
+    protected IDisposableComponent createDisposableContent()
+    {
+        return DataSetRelationshipBrowser.create(viewContext, TechId.create(dataset),
+                DataSetRelationshipRole.PARENT, dataset.getDataSetType());
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetParentsSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetParentsSection.java
index 88c3954c3fa..5242f41bb86 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetParentsSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetParentsSection.java
@@ -16,8 +16,9 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.BrowserSectionPanel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
@@ -25,14 +26,21 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 /**
  * @author Piotr Buczek
  */
-class DataSetParentsSection extends BrowserSectionPanel
+class DataSetParentsSection extends DisposableSectionPanel
 {
+    private final ExternalData dataset;
+
     DataSetParentsSection(IViewContext<?> viewContext, ExternalData dataset)
     {
-        super("Parents (Data Sets)");
-        initializeDisposableBrowser(DataSetRelationshipBrowser.create(viewContext, TechId
-                .create(dataset), DataSetRelationshipRole.CHILD, dataset.getDataSetType(),
-                getServerRequestQueue()));
+        super("Parents (Data Sets)", viewContext);
+        this.dataset = dataset;
+    }
+
+    @Override
+    protected IDisposableComponent createDisposableContent()
+    {
+        return DataSetRelationshipBrowser.create(viewContext, TechId.create(dataset),
+                DataSetRelationshipRole.CHILD, dataset.getDataSetType());
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java
index 64722b84d79..39dbd4e50bb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java
@@ -20,7 +20,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ServerRequestQueue;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
@@ -44,14 +43,12 @@ public class DataSetRelationshipBrowser extends AbstractExternalDataGrid
     public static final String ID_PREFIX = GenericConstants.ID_PREFIX + PREFIX;
 
     public static IDisposableComponent create(IViewContext<?> viewContext, TechId datasetId,
-            final DataSetRelationshipRole role, final DataSetType datasetType,
-            ServerRequestQueue requestQueueOrNull)
+            final DataSetRelationshipRole role, final DataSetType datasetType)
     {
         IViewContext<ICommonClientServiceAsync> commonViewContext =
                 viewContext.getCommonViewContext();
         DataSetRelationshipBrowser browser =
-                new DataSetRelationshipBrowser(commonViewContext, datasetId, role,
-                        requestQueueOrNull)
+                new DataSetRelationshipBrowser(commonViewContext, datasetId, role)
                     {
                         @Override
                         public String getGridDisplayTypeID()
@@ -69,10 +66,10 @@ public class DataSetRelationshipBrowser extends AbstractExternalDataGrid
     private final DataSetRelationshipRole role;
 
     private DataSetRelationshipBrowser(IViewContext<ICommonClientServiceAsync> viewContext,
-            TechId datasetId, DataSetRelationshipRole role, ServerRequestQueue requestQueueOrNull)
+            TechId datasetId, DataSetRelationshipRole role)
     {
         super(viewContext, createBrowserId(datasetId, role), createGridId(datasetId, role),
-                DisplayTypeIDGenerator.DATA_SET_DETAILS_GRID, requestQueueOrNull);
+                DisplayTypeIDGenerator.DATA_SET_DETAILS_GRID);
         this.datasetId = datasetId;
         this.role = role;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataViewSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataViewSection.java
index db52a4747bd..3687a1925fb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataViewSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataViewSection.java
@@ -63,20 +63,41 @@ public class DataViewSection extends SingleSectionPanel
 
     private static String FILES_HOME_VIEW = "Files (Home)";
 
+    private final ExternalData dataset;
+
+    private IDisposableComponent currentReportOrNull = null;
+
     public DataViewSection(final IViewContext<?> viewContext, final ExternalData dataset)
     {
-        super(viewContext.getMessage(Dict.DATA_VIEW));
+        super(viewContext.getMessage(Dict.DATA_VIEW), viewContext);
+        this.dataset = dataset;
+    }
+
+    @Override
+    protected void onDetach()
+    {
+        disposeCurrentReport();
+    }
+
+    private void disposeCurrentReport()
+    {
+        if (currentReportOrNull != null)
+        {
+            currentReportOrNull.dispose();
+        }
+    }
 
+    @Override
+    protected void showContent()
+    {
         final DatastoreServiceSelectionWidget serviceSelectionWidget =
                 new DatastoreServiceSelectionWidget(viewContext, dataset);
         getHeader().addTool(new LabelToolItem(serviceSelectionWidget.getFieldLabel() + ":&nbsp;"));
         getHeader().addTool(serviceSelectionWidget);
-        serviceSelectionWidget.addSelectionChangedListener(createServiceSelectionChangedListener(
-                viewContext, dataset));
+        serviceSelectionWidget.addSelectionChangedListener(createServiceSelectionChangedListener());
     }
 
-    private SelectionChangedListener<DatastoreServiceDescriptionModel> createServiceSelectionChangedListener(
-            final IViewContext<?> viewContext, final ExternalData dataset)
+    private SelectionChangedListener<DatastoreServiceDescriptionModel> createServiceSelectionChangedListener()
     {
         return new SelectionChangedListener<DatastoreServiceDescriptionModel>()
             {
@@ -110,20 +131,20 @@ public class DataViewSection extends SingleSectionPanel
                     IOnReportComponentGeneratedAction action =
                             new IOnReportComponentGeneratedAction()
                                 {
-
                                     public void execute(IDisposableComponent reportComponent)
                                     {
+                                        disposeCurrentReport();
                                         // replace current viewer with report grid
                                         Widget reportGrid = reportComponent.getComponent();
                                         if (currentViewerOrNull != null)
                                         {
                                             remove(currentViewerOrNull);
                                         }
+                                        currentReportOrNull = reportComponent;
                                         currentViewerOrNull = reportGrid;
                                         add(reportGrid);
                                         layout();
                                     }
-
                                 };
 
                     DisplayedOrSelectedDatasetCriteria criteria =
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java
index 7b81c9b8698..c07bf8d401b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java
@@ -20,7 +20,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ServerRequestQueue;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
@@ -40,12 +39,12 @@ public class ExperimentDataSetBrowser extends AbstractExternalDataGrid
     public static final String ID_PREFIX = GenericConstants.ID_PREFIX + PREFIX;
 
     static IDisposableComponent create(IViewContext<?> viewContext, TechId experimentId,
-            final ExperimentType experimentType, ServerRequestQueue requestQueueOrNull)
+            final ExperimentType experimentType)
     {
         IViewContext<ICommonClientServiceAsync> commonViewContext =
                 viewContext.getCommonViewContext();
         ExperimentDataSetBrowser browser =
-                new ExperimentDataSetBrowser(commonViewContext, experimentId, requestQueueOrNull)
+                new ExperimentDataSetBrowser(commonViewContext, experimentId)
                     {
                         @Override
                         public String getGridDisplayTypeID()
@@ -59,10 +58,10 @@ public class ExperimentDataSetBrowser extends AbstractExternalDataGrid
     private final TechId experimentId;
 
     private ExperimentDataSetBrowser(IViewContext<ICommonClientServiceAsync> viewContext,
-            TechId experimentId, ServerRequestQueue requestQueueOrNull)
+            TechId experimentId)
     {
         super(viewContext, createBrowserId(experimentId), createGridId(experimentId),
-                DisplayTypeIDGenerator.EXPERIMENT_DETAILS_GRID, requestQueueOrNull);
+                DisplayTypeIDGenerator.EXPERIMENT_DETAILS_GRID);
         this.experimentId = experimentId;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetSection.java
index 10083db814b..270d6aba83c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetSection.java
@@ -16,21 +16,29 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.BrowserSectionPanel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 
 /**
  * @author Franz-Josef Elmer
  */
-class ExperimentDataSetSection extends BrowserSectionPanel
+class ExperimentDataSetSection extends DisposableSectionPanel
 {
+    private final Experiment experiment;
+
     ExperimentDataSetSection(Experiment experiment, IViewContext<?> viewContext)
     {
-        super("Data Sets");
-        initializeDisposableBrowser(ExperimentDataSetBrowser.create(viewContext, TechId
-                .create(experiment), experiment.getExperimentType(), getServerRequestQueue()));
+        super("Data Sets", viewContext);
+        this.experiment = experiment;
     }
 
+    @Override
+    protected IDisposableComponent createDisposableContent()
+    {
+        return ExperimentDataSetBrowser.create(viewContext, TechId.create(experiment), experiment
+                .getExperimentType());
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentPropertiesPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentPropertiesPanel.java
index 99fbd5de035..46500c8da8b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentPropertiesPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentPropertiesPanel.java
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.extjs.gxt.ui.client.Style.Scroll;
 import com.extjs.gxt.ui.client.widget.ContentPanel;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -83,6 +84,7 @@ public class ExperimentPropertiesPanel extends ContentPanel
         this.viewer = viewer;
         this.grid = createPropertyGrid();
         add(grid);
+        setScrollMode(Scroll.AUTOY);
     }
 
     private final PropertyGrid createPropertyGrid()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesSection.java
index 248fb668d8e..bf15dcfe2d3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesSection.java
@@ -16,10 +16,10 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 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.SingleSectionPanel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -30,29 +30,18 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
  * 
  * @author Izabela Adamczyk
  */
-public class ExperimentSamplesSection extends SingleSectionPanel
+public class ExperimentSamplesSection extends DisposableSectionPanel
 {
     private static final String PREFIX = "experiment-samples-section_";
 
     public static final String ID_PREFIX = GenericConstants.ID_PREFIX + PREFIX;
 
-    private IDisposableComponent sampleDisposableGrid;
+    private final Experiment experiment;
 
     public ExperimentSamplesSection(final IViewContext<?> viewContext, final Experiment experiment)
     {
-        super("Samples");
-        TechId experimentId = TechId.create(experiment);
-        sampleDisposableGrid =
-                SampleBrowserGrid.createGridForExperimentSamples(
-                        viewContext.getCommonViewContext(), experimentId,
-                        createGridId(experimentId), experiment.getExperimentType(),
-                        getServerRequestQueue());
-        add(sampleDisposableGrid.getComponent());
-    }
-
-    public IDatabaseModificationObserver getDatabaseModificationObserver()
-    {
-        return sampleDisposableGrid;
+        super("Samples", viewContext);
+        this.experiment = experiment;
     }
 
     // @Private
@@ -62,10 +51,11 @@ public class ExperimentSamplesSection extends SingleSectionPanel
     }
 
     @Override
-    protected void onDetach()
+    protected IDisposableComponent createDisposableContent()
     {
-        sampleDisposableGrid.dispose();
-        super.onDetach();
+        TechId experimentId = TechId.create(experiment);
+        return SampleBrowserGrid.createGridForExperimentSamples(viewContext.getCommonViewContext(),
+                experimentId, createGridId(experimentId), experiment.getExperimentType());
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java
index 3e9935133e3..d97203bbe45 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewer.java
@@ -16,16 +16,16 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
-import com.extjs.gxt.ui.client.Style.Scroll;
-import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AttachmentVersionsSection;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.BrowserSectionPanel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 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.CompositeDatabaseModificationObserverWithMainObserver;
@@ -38,6 +38,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
 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.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 
@@ -46,7 +47,8 @@ import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientS
  * 
  * @author Izabela Adamczyk
  */
-public class GenericExperimentViewer extends AbstractViewer<Experiment>
+public class GenericExperimentViewer extends AbstractViewer<Experiment> implements
+        IDatabaseModificationObserver
 {
     private static final String GENERIC_EXPERIMENT_VIEWER = "generic-experiment-viewer";
 
@@ -56,18 +58,20 @@ public class GenericExperimentViewer extends AbstractViewer<Experiment>
 
     private final IViewContext<IGenericClientServiceAsync> viewContext;
 
-    private final CompositeDatabaseModificationObserverWithMainObserver modificationObserver;
-
     protected final IIdentifiable identifiable;
-    
+
     protected Experiment experimentOrNull;
 
+    private List<DisposableSectionPanel> rightPanelSections;
+
+    private ExperimentPropertiesPanel propertiesPanel;
+
     public static DatabaseModificationAwareComponent create(
             final IViewContext<IGenericClientServiceAsync> viewContext,
             final IIdentifiable identifiable)
     {
         GenericExperimentViewer viewer = new GenericExperimentViewer(viewContext, identifiable);
-        return new DatabaseModificationAwareComponent(viewer, viewer.getModificationObserver());
+        return new DatabaseModificationAwareComponent(viewer, viewer);
     }
 
     protected GenericExperimentViewer(final IViewContext<IGenericClientServiceAsync> viewContext,
@@ -75,18 +79,12 @@ public class GenericExperimentViewer extends AbstractViewer<Experiment>
     {
         super(viewContext, createId(experiment));
         this.identifiable = experiment;
-        setLayout(new BorderLayout());
-        this.modificationObserver = new CompositeDatabaseModificationObserverWithMainObserver();
         this.viewContext = viewContext;
+        setLayout(new BorderLayout());
         extendToolBar();
         reloadAllData();
     }
 
-    public IDatabaseModificationObserver getModificationObserver()
-    {
-        return modificationObserver;
-    }
-    
     private void extendToolBar()
     {
         addToolBarButton(createDeleteButton(new IDelegatedAction()
@@ -102,7 +100,14 @@ public class GenericExperimentViewer extends AbstractViewer<Experiment>
 
     private void reloadAllData()
     {
-        reloadData(new ExperimentInfoCallback(viewContext, this, modificationObserver));
+        reloadData(new AbstractAsyncCallback<Experiment>(viewContext)
+            {
+                @Override
+                protected final void process(final Experiment result)
+                {
+                    layoutExperimentDetailView(result);
+                }
+            });
     }
 
     public static final String createId(final IIdentifiable identifiable)
@@ -130,15 +135,6 @@ public class GenericExperimentViewer extends AbstractViewer<Experiment>
         super.updateOriginalData(newData);
     }
 
-    private final Component createLeftPanel(final Experiment newExperiment,
-            final CompositeDatabaseModificationObserverWithMainObserver observer)
-    {
-        final ExperimentPropertiesPanel panel = createExperimentPropertiesPanel(newExperiment);
-        panel.setScrollMode(Scroll.AUTOY);
-        observer.addMainObserver(panel.getDatabaseModificationObserver());
-        return panel;
-    }
-
     private ExperimentPropertiesPanel createExperimentPropertiesPanel(final Experiment newExperiment)
     {
         return new ExperimentPropertiesPanel(newExperiment, viewContext, this);
@@ -151,47 +147,27 @@ public class GenericExperimentViewer extends AbstractViewer<Experiment>
                 newExperiment);
     }
 
-    private static final class ExperimentInfoCallback extends AbstractAsyncCallback<Experiment>
+    /**
+     * Sets the {@link Experiment} for this <var>generic</var> experiment viewer.
+     * <p>
+     * This method triggers the whole <i>GUI</i> construction.
+     * </p>
+     */
+    private void layoutExperimentDetailView(final Experiment result)
     {
-        private final GenericExperimentViewer genericExperimentViewer;
+        this.experimentOrNull = result;
+        this.updateOriginalData(result);
+        this.removeAll();
 
-        private final CompositeDatabaseModificationObserverWithMainObserver observer;
+        // Left panel
+        this.propertiesPanel = createExperimentPropertiesPanel(result);
+        add(this.propertiesPanel, createLeftBorderLayoutData());
+        // Right panel
+        this.rightPanelSections = createRightPanel(result);
+        SectionsPanel rightPanel = layoutSections(this.rightPanelSections);
+        add(rightPanel, createRightBorderLayoutData());
 
-        private ExperimentInfoCallback(final IViewContext<IGenericClientServiceAsync> viewContext,
-                final GenericExperimentViewer genericSampleViewer,
-                final CompositeDatabaseModificationObserverWithMainObserver modificationObserver)
-        {
-            super(viewContext);
-            this.genericExperimentViewer = genericSampleViewer;
-            this.observer = modificationObserver;
-        }
-
-        //
-        // AbstractAsyncCallback
-        //
-
-        /**
-         * Sets the {@link Experiment} for this <var>generic</var> experiment viewer.
-         * <p>
-         * This method triggers the whole <i>GUI</i> construction.
-         * </p>
-         */
-        @Override
-        protected final void process(final Experiment result)
-        {
-            genericExperimentViewer.experimentOrNull = result;
-            genericExperimentViewer.updateOriginalData(result);
-            genericExperimentViewer.removeAll();
-
-            // Left panel
-            final Component leftPanel = genericExperimentViewer.createLeftPanel(result, observer);
-            genericExperimentViewer.add(leftPanel, createLeftBorderLayoutData());
-            // Right panel
-            final Component rightPanel = genericExperimentViewer.createRightPanel(result, observer);
-            genericExperimentViewer.add(rightPanel, createRightBorderLayoutData());
-
-            genericExperimentViewer.layout();
-        }
+        layout();
     }
 
     private static final String getDisplayIdSuffix(String suffix)
@@ -199,44 +175,67 @@ public class GenericExperimentViewer extends AbstractViewer<Experiment>
         return GENERIC_EXPERIMENT_VIEWER + "-" + suffix;
     }
 
-    private Component createRightPanel(Experiment result,
-            CompositeDatabaseModificationObserverWithMainObserver observer)
+    private List<DisposableSectionPanel> createRightPanel(Experiment result)
     {
-        final SectionsPanel container = new SectionsPanel(viewContext.getCommonViewContext());
         final String displayIdSuffix = getDisplayIdSuffix(result.getExperimentType().getCode());
-        
-        List<BrowserSectionPanel> additionalPanels = createAdditionalBrowserSectionPanels(displayIdSuffix);
-        for (BrowserSectionPanel panel : additionalPanels)
-        {
-            container.addPanel(panel);
-            observer.addObserver(panel.getDatabaseModificationObserver());
-        }
+        List<DisposableSectionPanel> allPanels = new ArrayList<DisposableSectionPanel>();
+
+        allPanels.addAll(createAdditionalBrowserSectionPanels(displayIdSuffix));
 
         final ExperimentSamplesSection sampleSection =
                 new ExperimentSamplesSection(viewContext, result);
         sampleSection.setDisplayID(DisplayTypeIDGenerator.SAMPLE_SECTION, displayIdSuffix);
-        container.addPanel(sampleSection);
-        observer.addObserver(sampleSection.getDatabaseModificationObserver());
+        allPanels.add(sampleSection);
 
         final ExperimentDataSetSection dataSection =
                 new ExperimentDataSetSection(result, viewContext);
         dataSection.setDisplayID(DisplayTypeIDGenerator.DATA_SET_SECTION, displayIdSuffix);
-        container.addPanel(dataSection);
-        observer.addObserver(dataSection.getDatabaseModificationObserver());
+        allPanels.add(dataSection);
 
         final AttachmentVersionsSection<Experiment> attachmentsSection =
                 createAttachmentsSection(result);
         attachmentsSection.setDisplayID(DisplayTypeIDGenerator.ATTACHMENT_SECTION, displayIdSuffix);
-        container.addPanel(attachmentsSection);
-        observer.addObserver(attachmentsSection.getDatabaseModificationObserver());
+        allPanels.add(attachmentsSection);
+
+        return allPanels;
+    }
 
+    private SectionsPanel layoutSections(List<DisposableSectionPanel> allPanels)
+    {
+        final SectionsPanel container = new SectionsPanel(viewContext.getCommonViewContext());
+        for (DisposableSectionPanel panel : allPanels)
+        {
+            container.addPanel(panel);
+        }
         container.layout();
         return container;
     }
-    
-    protected List<BrowserSectionPanel> createAdditionalBrowserSectionPanels(String displyIdSuffix)
+
+    protected List<DisposableSectionPanel> createAdditionalBrowserSectionPanels(String displyIdSuffix)
     {
         return Collections.emptyList();
     }
 
+    // this observer should not be cached - some sections may become visible in the future
+    private IDatabaseModificationObserver createModificationObserver()
+    {
+        CompositeDatabaseModificationObserverWithMainObserver modificationObserver =
+                new CompositeDatabaseModificationObserverWithMainObserver();
+        modificationObserver.addMainObserver(propertiesPanel.getDatabaseModificationObserver());
+        for (DisposableSectionPanel panel : rightPanelSections)
+        {
+            modificationObserver.addObserver(panel.tryGetDatabaseModificationObserver());
+        }
+        return modificationObserver;
+    }
+
+    public DatabaseModificationKind[] getRelevantModifications()
+    {
+        return createModificationObserver().getRelevantModifications();
+    }
+
+    public void update(Set<DatabaseModificationKind> observedModifications)
+    {
+        createModificationObserver().update(observedModifications);
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/MaterialPropertiesSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/MaterialPropertiesSection.java
index 117ff4e9c9d..07cd553289f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/MaterialPropertiesSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/MaterialPropertiesSection.java
@@ -54,18 +54,14 @@ public class MaterialPropertiesSection extends SingleSectionPanel
 
     private final Material material;
 
-    private final IViewContext<?> viewContext;
-
     public MaterialPropertiesSection(final Material material, final IViewContext<?> viewContext)
     {
-        super("Material Properties");
+        super("Material Properties", viewContext);
         this.material = material;
-        this.viewContext = viewContext;
-        final PropertyGrid propertyGrid = createPropertyGrid();
-        add(propertyGrid);
     }
 
-    private final PropertyGrid createPropertyGrid()
+    @Override
+    protected void showContent()
     {
         final Map<String, Object> properties = createProperties(viewContext);
         final PropertyGrid propertyGrid = new PropertyGrid(viewContext, properties.size());
@@ -86,7 +82,7 @@ public class MaterialPropertiesSection extends SingleSectionPanel
         propertyGrid.registerPropertyValueRenderer(MaterialValueEntityProperty.class,
                 propertyRenderer);
         propertyGrid.setProperties(properties);
-        return propertyGrid;
+        add(propertyGrid);
     }
 
     private final Map<String, Object> createProperties(final IMessageProvider messageProvider)
@@ -111,4 +107,5 @@ public class MaterialPropertiesSection extends SingleSectionPanel
         }
         return properties;
     }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ContainerSamplesSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ContainerSamplesSection.java
index 5a72d5b7fc2..d553fc67c79 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ContainerSamplesSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ContainerSamplesSection.java
@@ -16,11 +16,11 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 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.SingleSectionPanel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -31,35 +31,18 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
  * 
  * @author Piotr Buczek
  */
-public class ContainerSamplesSection extends SingleSectionPanel
+public class ContainerSamplesSection extends DisposableSectionPanel
 {
     private static final String PREFIX = "container-samples-section_";
 
     public static final String ID_PREFIX = GenericConstants.ID_PREFIX + PREFIX;
 
-    private final IViewContext<?> viewContext;
+    private final Sample container;
 
-    private IDisposableComponent sampleDisposableGrid;
-
-    public ContainerSamplesSection(final IViewContext<?> viewContext)
+    public ContainerSamplesSection(final IViewContext<?> viewContext, final Sample container)
     {
-        super(viewContext.getMessage(Dict.PART_OF_HEADING));
-        this.viewContext = viewContext;
-    }
-
-    public void addSamplesGrid(final Sample container)
-    {
-        TechId containerId = TechId.create(container);
-        sampleDisposableGrid =
-                SampleBrowserGrid.createGridForContainerSamples(viewContext.getCommonViewContext(),
-                        containerId, createGridId(containerId), container.getSampleType(), getServerRequestQueue());
-        
-        add(sampleDisposableGrid.getComponent());
-    }
-
-    public IDatabaseModificationObserver getDatabaseModificationObserver()
-    {
-        return sampleDisposableGrid;
+        super(viewContext.getMessage(Dict.PART_OF_HEADING), viewContext);
+        this.container = container;
     }
 
     // @Private
@@ -69,10 +52,11 @@ public class ContainerSamplesSection extends SingleSectionPanel
     }
 
     @Override
-    protected void onDetach()
+    protected IDisposableComponent createDisposableContent()
     {
-        sampleDisposableGrid.dispose();
-        super.onDetach();
+        TechId containerId = TechId.create(container);
+        return SampleBrowserGrid.createGridForContainerSamples(viewContext.getCommonViewContext(),
+                containerId, createGridId(containerId), container.getSampleType());
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
index f09ba18f8c3..5c606de5c5f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
@@ -35,6 +35,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AttachmentVersionsSection;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 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;
@@ -48,7 +49,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.PropertyTypeRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.PropertyValueRenderers;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property.IPropertyValueRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property.PropertyGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleListDeletionConfirmationDialog;
@@ -103,11 +103,11 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme
 
     protected final TechId sampleId;
 
-    private AttachmentVersionsSection<Sample> attachmentsSection;
+    private DisposableSectionPanel attachmentsSection;
 
-    private ContainerSamplesSection containerSamplesSection;
+    private DisposableSectionPanel containerSamplesSection;
 
-    private IDisposableComponent dataSetBrowser;
+    private DisposableSectionPanel dataSetBrowser;
 
     private PropertyGrid propertyGrid;
 
@@ -189,19 +189,17 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme
         }
 
         // 'Part of' samples
-        containerSamplesSection = new ContainerSamplesSection(viewContext);
+        containerSamplesSection = new ContainerSamplesSection(viewContext, generator);
         containerSamplesSection
                 .setDisplayID(DisplayTypeIDGenerator.SAMPLE_SECTION, displayIdSuffix);
-        containerSamplesSection.addSamplesGrid(generator);
         container.addPanel(containerSamplesSection);
         // Data Sets
-        final SampleDataSetsSection externalDataPanel = new SampleDataSetsSection(viewContext);
-        externalDataPanel.setDisplayID(DisplayTypeIDGenerator.DATA_SET_SECTION, displayIdSuffix);
         CheckBox showOnlyDirectlyConnectedCheckBox = createShowOnlyDirectlyConnectedCheckBox();
-        externalDataPanel.addDataSetGrid(showOnlyDirectlyConnectedCheckBox, sampleId, generator
-                .getSampleType());
-        dataSetBrowser = externalDataPanel.getDataSetBrowser();
-        container.addPanel(externalDataPanel);
+        dataSetBrowser =
+                new SampleDataSetsSection(viewContext, showOnlyDirectlyConnectedCheckBox, sampleId,
+                        generator.getSampleType());
+        dataSetBrowser.setDisplayID(DisplayTypeIDGenerator.DATA_SET_SECTION, displayIdSuffix);
+        container.addPanel(dataSetBrowser);
 
         // Attachments
         attachmentsSection = createAttachmentsSection(generator);
@@ -235,16 +233,6 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme
         return new AttachmentVersionsSection<Sample>(viewContext.getCommonViewContext(), sample);
     }
 
-    @Override
-    protected void onDetach()
-    {
-        if (dataSetBrowser != null)
-        {
-            dataSetBrowser.dispose();
-        }
-        super.onDetach();
-    }
-
     private final static Map<String, Object> createProperties(
             final IMessageProvider messageProvider, final SampleParentWithDerived sampleGeneration)
     {
@@ -458,15 +446,15 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme
                         new PropertyGridDatabaseModificationObserver());
         if (dataSetBrowser != null)
         {
-            observer.addObserver(dataSetBrowser);
+            observer.addObserver(dataSetBrowser.tryGetDatabaseModificationObserver());
         }
         if (attachmentsSection != null)
         {
-            observer.addObserver(attachmentsSection.getDatabaseModificationObserver());
+            observer.addObserver(attachmentsSection.tryGetDatabaseModificationObserver());
         }
         if (containerSamplesSection != null)
         {
-            observer.addObserver(containerSamplesSection.getDatabaseModificationObserver());
+            observer.addObserver(containerSamplesSection.tryGetDatabaseModificationObserver());
         }
         return observer;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java
index 09243d69188..d66805f6ce7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java
@@ -20,7 +20,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ServerRequestQueue;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
@@ -45,15 +44,13 @@ class SampleDataSetBrowser extends AbstractExternalDataGrid
 
     public static IDisposableComponent create(IViewContext<?> viewContext, TechId sampleId,
             final SampleType sampleType,
-            final DataSetConnectionTypeProvider connectionTypeProvider,
-            final ServerRequestQueue requestQueueOrNull)
+            final DataSetConnectionTypeProvider connectionTypeProvider)
     {
         IViewContext<ICommonClientServiceAsync> commonViewContext =
                 viewContext.getCommonViewContext();
 
         SampleDataSetBrowser browser =
-                new SampleDataSetBrowser(commonViewContext, sampleId, connectionTypeProvider,
-                        requestQueueOrNull)
+                new SampleDataSetBrowser(commonViewContext, sampleId, connectionTypeProvider)
                     {
                         @Override
                         public String getGridDisplayTypeID()
@@ -68,11 +65,10 @@ class SampleDataSetBrowser extends AbstractExternalDataGrid
     private final TechId sampleId;
 
     private SampleDataSetBrowser(IViewContext<ICommonClientServiceAsync> viewContext,
-            TechId sampleId, DataSetConnectionTypeProvider connectionTypeProvider,
-            ServerRequestQueue requestQueueOrNull)
+            TechId sampleId, DataSetConnectionTypeProvider connectionTypeProvider)
     {
         super(viewContext, createBrowserId(sampleId), createGridId(sampleId),
-                DisplayTypeIDGenerator.SAMPLE_DETAILS_GRID, requestQueueOrNull);
+                DisplayTypeIDGenerator.SAMPLE_DETAILS_GRID);
         this.sampleId = sampleId;
         this.connectionTypeProvider = connectionTypeProvider;
         // refresh data when connection type provider value changes
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetsSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetsSection.java
index 98ed33ec222..fff3fe9b1cf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetsSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetsSection.java
@@ -18,9 +18,9 @@ package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sa
 
 import com.extjs.gxt.ui.client.widget.form.CheckBox;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 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.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
@@ -29,32 +29,29 @@ import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sam
 /**
  * @author Chandrasekhar Ramakrishnan
  */
-public class SampleDataSetsSection extends SingleSectionPanel
+public class SampleDataSetsSection extends DisposableSectionPanel
 {
-    final IViewContext<?> viewContext;
+    private final CheckBox showOnlyDirectlyConnectedCheckBox;
 
-    private IDisposableComponent dataSetBrowser;
+    private final TechId sampleId;
 
-    public SampleDataSetsSection(final IViewContext<?> viewContext)
-    {
-        super(viewContext.getMessage(Dict.EXTERNAL_DATA_HEADING));
-        this.viewContext = viewContext;
-    }
+    private final SampleType sampleType;
 
-    public void addDataSetGrid(CheckBox showOnlyDirectlyConnectedCheckBox, TechId sampleId,
-            SampleType sampleType)
+    public SampleDataSetsSection(final IViewContext<?> viewContext,
+            CheckBox showOnlyDirectlyConnectedCheckBox, TechId sampleId, SampleType sampleType)
     {
-        getHeader().addTool(showOnlyDirectlyConnectedCheckBox);
-        dataSetBrowser =
-                SampleDataSetBrowser.create(viewContext, sampleId, sampleType,
-                        new DataSetConnectionTypeProvider(showOnlyDirectlyConnectedCheckBox),
-                        getServerRequestQueue());
-        add(dataSetBrowser.getComponent());
+        super(viewContext.getMessage(Dict.EXTERNAL_DATA_HEADING), viewContext);
+        this.showOnlyDirectlyConnectedCheckBox = showOnlyDirectlyConnectedCheckBox;
+        this.sampleId = sampleId;
+        this.sampleType = sampleType;
     }
 
-    IDisposableComponent getDataSetBrowser()
+    @Override
+    protected IDisposableComponent createDisposableContent()
     {
-        return dataSetBrowser;
+        getHeader().addTool(showOnlyDirectlyConnectedCheckBox);
+        return SampleDataSetBrowser.create(viewContext, sampleId, sampleType,
+                new DataSetConnectionTypeProvider(showOnlyDirectlyConnectedCheckBox));
     }
 
 }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ExperimentViewer.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ExperimentViewer.java
index 758789de394..ca24284b629 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ExperimentViewer.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ExperimentViewer.java
@@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.applicatio
 import java.util.Collections;
 import java.util.List;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.BrowserSectionPanel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 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.ui.grid.IDisposableComponent;
@@ -30,8 +30,6 @@ import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.exp
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientServiceAsync;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class ExperimentViewer extends GenericExperimentViewer
@@ -43,7 +41,7 @@ public class ExperimentViewer extends GenericExperimentViewer
         ExperimentViewer viewer =
                 new ExperimentViewer(new GenericViewContext(viewContext.getCommonViewContext()),
                         viewContext, identifiable);
-        return new DatabaseModificationAwareComponent(viewer, viewer.getModificationObserver());
+        return new DatabaseModificationAwareComponent(viewer, viewer);
     }
 
     private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext;
@@ -57,16 +55,21 @@ public class ExperimentViewer extends GenericExperimentViewer
     }
 
     @Override
-    protected List<BrowserSectionPanel> createAdditionalBrowserSectionPanels(String displyIdSuffix)
+    protected List<DisposableSectionPanel> createAdditionalBrowserSectionPanels(String displyIdSuffix)
     {
-        IDisposableComponent grid =
-                ProteinByExperimentBrowserGrid.create(specificViewContext, experimentOrNull);
-        BrowserSectionPanel section =
-                new BrowserSectionPanel(specificViewContext.getMessage(Dict.PROTEINS_SECTION), grid);
+        DisposableSectionPanel section =
+                new DisposableSectionPanel(specificViewContext.getMessage(Dict.PROTEINS_SECTION),
+                        specificViewContext)
+                    {
+                        @Override
+                        protected IDisposableComponent createDisposableContent()
+                        {
+                            return ProteinByExperimentBrowserGrid.create(specificViewContext,
+                                    experimentOrNull);
+                        }
+                    };
         section.setDisplayID(DisplayTypeIDGenerator.PROTEIN_SECTION, displyIdSuffix);
-        return Collections.<BrowserSectionPanel> singletonList(section);
+        return Collections.<DisposableSectionPanel> singletonList(section);
     }
-    
-    
 
 }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinSamplesSection.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinSamplesSection.java
index da889acf176..7992a4f3142 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinSamplesSection.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinSamplesSection.java
@@ -16,10 +16,10 @@
 
 package ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 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.SingleSectionPanel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifiable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -30,28 +30,25 @@ import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNet
  * 
  * @author Piotr Buczek
  */
-public class ProteinSamplesSection extends SingleSectionPanel
+public class ProteinSamplesSection extends DisposableSectionPanel
 {
     private static final String PREFIX = "protein-samples-section_";
 
     public static final String ID_PREFIX = GenericConstants.ID_PREFIX + PREFIX;
 
-    private IDisposableComponent sampleDisposableGrid;
+    private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext;
+
+    private final TechId proteinReferenceID;
+
+    private final IIdentifiable experimentOrNull;
 
     public ProteinSamplesSection(final IViewContext<IPhosphoNetXClientServiceAsync> viewContext,
             final TechId proteinReferenceID, IIdentifiable experimentOrNull)
     {
-        super("Samples");
-        Long experimentID = experimentOrNull == null ? null : experimentOrNull.getId();
-        sampleDisposableGrid =
-                SampleAbundanceBrowserGrid.createGridForProteinSamples(viewContext,
-                        proteinReferenceID, experimentID, createGridId(proteinReferenceID));
-        add(sampleDisposableGrid.getComponent());
-    }
-
-    public IDatabaseModificationObserver getDatabaseModificationObserver()
-    {
-        return sampleDisposableGrid;
+        super("Samples", viewContext);
+        this.viewContext = viewContext;
+        this.experimentOrNull = experimentOrNull;
+        this.proteinReferenceID = proteinReferenceID;
     }
 
     // @Private
@@ -61,10 +58,11 @@ public class ProteinSamplesSection extends SingleSectionPanel
     }
 
     @Override
-    protected void onDetach()
+    protected IDisposableComponent createDisposableContent()
     {
-        sampleDisposableGrid.dispose();
-        super.onDetach();
+        Long experimentID = experimentOrNull == null ? null : experimentOrNull.getId();
+        return SampleAbundanceBrowserGrid.createGridForProteinSamples(viewContext,
+                proteinReferenceID, experimentID, createGridId(proteinReferenceID));
     }
 
 }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinViewer.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinViewer.java
index 461b125e01c..37f6cb75b0e 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinViewer.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ProteinViewer.java
@@ -29,7 +29,7 @@ import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
 import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.BrowserSectionPanel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableSectionPanel;
 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.CompositeDatabaseModificationObserver;
@@ -40,6 +40,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 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.ui.AbstractViewer;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property.PropertyGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.StringUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
@@ -170,11 +171,28 @@ public class ProteinViewer extends AbstractViewer<IEntityInformationHolder> impl
         BorderLayoutData layoutData = createBorderLayoutData(LayoutRegion.WEST);
         layoutData.setSize(400);
         add(propertyPanel, layoutData);
-        add(new BrowserSectionPanel(viewContext.getMessage(Dict.SEQUENCES), ProteinSequenceGrid
-                .create(viewContext, proteinReferenceID)), createRightBorderLayoutData());
-        add(new BrowserSectionPanel(viewContext.getMessage(Dict.DATA_SET_PROTEINS),
-                DataSetProteinGrid.create(viewContext, experimentOrNull, proteinReferenceID)),
-                createBorderLayoutData(LayoutRegion.SOUTH));
+        DisposableSectionPanel sequencesSection =
+                new DisposableSectionPanel(viewContext.getMessage(Dict.SEQUENCES), viewContext)
+                    {
+                        @Override
+                        protected IDisposableComponent createDisposableContent()
+                        {
+                            return ProteinSequenceGrid.create(ProteinViewer.this.viewContext,
+                                    proteinReferenceID);
+                        }
+                    };
+        add(sequencesSection, createRightBorderLayoutData());
+        DisposableSectionPanel proteinsSection =
+                new DisposableSectionPanel(viewContext.getMessage(Dict.DATA_SET_PROTEINS), viewContext)
+                    {
+                        @Override
+                        protected IDisposableComponent createDisposableContent()
+                        {
+                            return DataSetProteinGrid.create(ProteinViewer.this.viewContext,
+                                    experimentOrNull, proteinReferenceID);
+                        }
+                    };
+        add(proteinsSection, createBorderLayoutData(LayoutRegion.SOUTH));
         layout();
     }
 
@@ -313,7 +331,7 @@ public class ProteinViewer extends AbstractViewer<IEntityInformationHolder> impl
                 new CompositeDatabaseModificationObserver();
         if (proteinSamplesSection != null)
         {
-            observer.addObserver(proteinSamplesSection.getDatabaseModificationObserver());
+            observer.addObserver(proteinSamplesSection.tryGetDatabaseModificationObserver());
         }
         // TODO 2009-07-31, Piotr Buczek: refresh properties panel?
         return observer;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutDatasetSection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutDatasetSection.java
index c5770fa370c..ec3de1343d5 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutDatasetSection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutDatasetSection.java
@@ -24,13 +24,10 @@ import com.extjs.gxt.ui.client.widget.layout.RowLayout;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ServerRequestQueue;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.SingleSectionPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
-import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningViewContext;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.PlateImages;
@@ -45,27 +42,25 @@ public class PlateLayoutDatasetSection extends SingleSectionPanel
 {
     public static final String ID_SUFFIX = "PlateLayoutDatasetSection";
 
-    public PlateLayoutDatasetSection(final ScreeningViewContext viewContext, final TechId datasetId)
-    {
-        super("Plate Layout");
-        add(new Text(viewContext.getMessage(Dict.LOAD_IN_PROGRESS)));
+    private final ScreeningViewContext viewContext;
 
-        // Don't get data immediately -- queue the request and let the panel decide when data needs
-        // to be retrieved
-        ServerRequestQueue.ServerRequestAction requestAction =
-                new ServerRequestQueue.ServerRequestAction(this)
-                    {
+    private final TechId datasetId;
 
-                        public void onInvoke()
-                        {
-                            viewContext.getService().getPlateContentForDataset(datasetId,
-                                    createDisplayPlateCallback(viewContext));
-                        }
-                    };
+    public PlateLayoutDatasetSection(final ScreeningViewContext viewContext, final TechId datasetId)
+    {
+        super("Plate Layout", viewContext);
+        this.viewContext = viewContext;
+        this.datasetId = datasetId;
+        setDisplayID(DisplayTypeIDGenerator.SAMPLE_SECTION, ID_SUFFIX);
+    }
 
-        getServerRequestQueue().addRequestToQueue(requestAction);
+    @Override
+    protected void showContent()
+    {
+        add(new Text(viewContext.getMessage(Dict.LOAD_IN_PROGRESS)));
 
-        setDisplayID(DisplayTypeIDGenerator.SAMPLE_SECTION, ID_SUFFIX);
+        viewContext.getService().getPlateContentForDataset(datasetId,
+                createDisplayPlateCallback(viewContext));
     }
 
     private AsyncCallback<PlateImages> createDisplayPlateCallback(final ScreeningViewContext context)
@@ -79,26 +74,24 @@ public class PlateLayoutDatasetSection extends SingleSectionPanel
                     setLayout(new RowLayout());
                     setScrollMode(Scroll.AUTO);
 
-                    renderPlate(plateContent, context);
-                    addMetadataTable(plateContent.getPlate(), context);
+                    renderPlate(plateContent);
+                    addMetadataTable(plateContent.getPlate());
 
                     layout();
                 }
             };
     }
 
-    private void renderPlate(PlateImages plateImages, ScreeningViewContext viewContext)
+    private void renderPlate(PlateImages plateImages)
     {
         LayoutContainer container = new LayoutContainer();
         container.add(PlateLayouter.createVisualization(plateImages, viewContext));
         add(container, PlateLayouter.createRowLayoutMarginData());
     }
 
-    private void addMetadataTable(final Sample plate,
-            final IViewContext<IScreeningClientServiceAsync> viewContext)
+    private void addMetadataTable(final Sample plate)
     {
         Button generateButton = PlateLayouter.createPlateMetadataButton(plate, viewContext);
         add(generateButton, PlateLayouter.createRowLayoutMarginData());
     }
-
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutSampleSection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutSampleSection.java
index 00766406820..3c13c26a0e2 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutSampleSection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateLayoutSampleSection.java
@@ -30,15 +30,12 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ServerRequestQueue;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.SingleSectionPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetReportGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-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;
@@ -55,29 +52,25 @@ public class PlateLayoutSampleSection extends SingleSectionPanel
 {
     public static final String ID_SUFFIX = "PlateLayoutSection";
 
-    public PlateLayoutSampleSection(final ScreeningViewContext viewContext, final TechId sampleId)
-    {
-        super("Plate Layout");
-        add(new Text(viewContext.getMessage(Dict.LOAD_IN_PROGRESS)));
+    private final ScreeningViewContext viewContext;
 
-        // Don't get data immediately -- queue the request and let the panel decide when data needs
-        // to be retrieved
-        ServerRequestQueue.ServerRequestAction requestAction =
-                new ServerRequestQueue.ServerRequestAction(this)
-                    {
-
-                        public void onInvoke()
-                        {
-                            viewContext.getService().getPlateContent(sampleId,
-                                    createDisplayPlateCallback(viewContext));
-                        }
-                    };
-
-        getServerRequestQueue().addRequestToQueue(requestAction);
+    private final TechId sampleId;
 
+    public PlateLayoutSampleSection(final ScreeningViewContext viewContext, final TechId sampleId)
+    {
+        super("Plate Layout", viewContext);
+        this.viewContext = viewContext;
+        this.sampleId = sampleId;
         setDisplayID(DisplayTypeIDGenerator.SAMPLE_SECTION, ID_SUFFIX);
     }
 
+    @Override
+    protected void showContent()
+    {
+        add(new Text(viewContext.getMessage(Dict.LOAD_IN_PROGRESS)));
+        viewContext.getService().getPlateContent(sampleId, createDisplayPlateCallback(viewContext));
+    }
+
     private AsyncCallback<PlateContent> createDisplayPlateCallback(
             final ScreeningViewContext context)
     {
@@ -90,18 +83,17 @@ public class PlateLayoutSampleSection extends SingleSectionPanel
                     setLayout(new RowLayout());
                     setScrollMode(Scroll.AUTO);
 
-                    renderPlate(plateContent, context);
-                    addImageAnalysisButton(plateContent, viewContext);
+                    renderPlate(plateContent);
+                    addImageAnalysisButton(plateContent);
 
-                    addMetadataTable(plateContent, context);
+                    addMetadataTable(plateContent);
 
                     layout();
                 }
             };
     }
 
-    private void addImageAnalysisButton(final PlateContent plateContent,
-            final IViewContext<?> viewContext)
+    private void addImageAnalysisButton(final PlateContent plateContent)
     {
         Component analysisPanel;
         int datasetsNumber = plateContent.getImageAnalysisDatasetsNumber();
@@ -116,7 +108,7 @@ public class PlateLayoutSampleSection extends SingleSectionPanel
                             @Override
                             public void componentSelected(ButtonEvent ce)
                             {
-                                generateImageAnalysisReport(viewContext, dataset, plateContent);
+                                generateImageAnalysisReport(dataset, plateContent);
                             }
                         });
             analysisPanel = generateButton;
@@ -136,8 +128,7 @@ public class PlateLayoutSampleSection extends SingleSectionPanel
         add(analysisPanel, PlateLayouter.createRowLayoutMarginData());
     }
 
-    private void generateImageAnalysisReport(IViewContext<?> viewContext, DatasetReference dataset,
-            PlateContent plateContent)
+    private void generateImageAnalysisReport(DatasetReference dataset, PlateContent plateContent)
     {
         DatastoreServiceDescription service = createImageAnalysisReporter(dataset, plateContent);
         DisplayedOrSelectedDatasetCriteria criteria =
@@ -154,10 +145,10 @@ public class PlateLayoutSampleSection extends SingleSectionPanel
                 reportLabel, new String[] {}, dataset.getDatastoreCode());
     }
 
-    private void renderPlate(PlateContent plateContent, ScreeningViewContext viewContext)
+    private void renderPlate(PlateContent plateContent)
     {
         LayoutContainer container = new LayoutContainer();
-        Widget datasetNumberLegend = tryRenderImageDatasetsNumberLegend(plateContent, viewContext);
+        Widget datasetNumberLegend = tryRenderImageDatasetsNumberLegend(plateContent);
         if (datasetNumberLegend != null)
         {
             container.add(datasetNumberLegend);
@@ -168,8 +159,7 @@ public class PlateLayoutSampleSection extends SingleSectionPanel
         add(container, PlateLayouter.createRowLayoutMarginData());
     }
 
-    private Widget tryRenderImageDatasetsNumberLegend(PlateContent plateContent,
-            IViewContext<?> viewContext)
+    private Widget tryRenderImageDatasetsNumberLegend(PlateContent plateContent)
     {
         int datasetsNumber = plateContent.getImageDatasetsNumber();
         if (datasetsNumber == 0)
@@ -186,8 +176,7 @@ public class PlateLayoutSampleSection extends SingleSectionPanel
         }
     }
 
-    private void addMetadataTable(final PlateContent plateContent,
-            final IViewContext<IScreeningClientServiceAsync> viewContext)
+    private void addMetadataTable(final PlateContent plateContent)
     {
         Button generateButton =
                 PlateLayouter.createPlateMetadataButton(plateContent.getPlate(), viewContext);
-- 
GitLab