diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java
index 6269f31fa01656813135332865c050bfcbbb497f..d568588f12a7eca76102a3cf015febb16fed02bc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchWidget.java
@@ -16,9 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import com.extjs.gxt.ui.client.Events;
-import com.extjs.gxt.ui.client.event.Listener;
-import com.extjs.gxt.ui.client.event.TabPanelEvent;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
 import com.extjs.gxt.ui.client.widget.MessageBox;
 import com.extjs.gxt.ui.client.widget.form.TextField;
@@ -188,9 +185,7 @@ final class SearchWidget extends LayoutContainer
     private static ITabItemFactory createTabFactory(
             final MatchingEntitiesPanel matchingEntitiesPanel, String title)
     {
-        final DefaultTabItem tab =
-                new DefaultTabItem(title, matchingEntitiesPanel, false,
-                        createTabPanelEventListener(matchingEntitiesPanel));
+        final DefaultTabItem tab = new DefaultTabItem(title, matchingEntitiesPanel, false);
         // this tab cannot be opened for the second time, so we can create it outside of the
         // factory
         return new ITabItemFactory()
@@ -239,20 +234,4 @@ final class SearchWidget extends LayoutContainer
                     };
         return button;
     }
-
-    private static Listener<TabPanelEvent> createTabPanelEventListener(
-            final MatchingEntitiesPanel matchingEntitiesPanel)
-    {
-        return new Listener<TabPanelEvent>()
-            {
-                public void handleEvent(TabPanelEvent be)
-                {
-                    if (be.type == Events.Close)
-                    {
-                        matchingEntitiesPanel.disposeCache();
-                    }
-                }
-            };
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
index b598d6b36a9825f2f309c052e3b39af465dbc938..2d8503a9b4cc30d77f27bdbba547d62df0bfc984 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
@@ -23,15 +23,16 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GroupsView;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.PersonsView;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.RolesView;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentBrowser;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentRegistrationPanel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.project.ProjectBrowser;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeAssignmentBrowser;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeAssignmentForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeBrowser;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBatchRegistrationPanel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowser;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleRegistrationPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.VocabularyBrowser;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.VocabularyRegistrationForm;
@@ -65,14 +66,13 @@ final class ComponentProvider
             {
                 public ITabItem create()
                 {
-                    SampleBrowser sampleBrowser = new SampleBrowser(viewContext);
-                    return new DefaultTabItem(getMessage(Dict.SAMPLE_BROWSER), sampleBrowser,
-                            false, sampleBrowser);
+                    DisposableComponent browser = SampleBrowserGrid.create(viewContext);
+                    return DefaultTabItem.create(getMessage(Dict.SAMPLE_BROWSER), browser, false);
                 }
 
                 public String getId()
                 {
-                    return SampleBrowser.ID;
+                    return SampleBrowserGrid.BROWSER_ID;
                 }
             };
     }
@@ -253,14 +253,14 @@ final class ComponentProvider
             {
                 public ITabItem create()
                 {
-                    ExperimentBrowser experimentBrowser = new ExperimentBrowser(viewContext);
-                    return new DefaultTabItem(getMessage(Dict.EXPERIMENT_BROWSER),
-                            experimentBrowser, false, experimentBrowser);
+                    DisposableComponent browser = ExperimentBrowserGrid.create(viewContext);
+                    return DefaultTabItem.create(getMessage(Dict.EXPERIMENT_BROWSER), browser,
+                            false);
                 }
 
                 public String getId()
                 {
-                    return ExperimentBrowser.ID;
+                    return ExperimentBrowserGrid.BROWSER_ID;
                 }
             };
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java
index 9aae5c6acebc8062911668a156bbd59528cb280c..b696f7779229716ee017f9284ece8efe0b72010e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DefaultTabItem.java
@@ -16,11 +16,12 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.framework;
 
+import com.extjs.gxt.ui.client.Events;
 import com.extjs.gxt.ui.client.event.Listener;
 import com.extjs.gxt.ui.client.event.TabPanelEvent;
 import com.extjs.gxt.ui.client.widget.Component;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableComponent;
 
 /**
  * A default {@link ITabItem} implementation.
@@ -43,14 +44,34 @@ public class DefaultTabItem implements ITabItem
         this(title, component, isCloseConfirmationNeeded, null);
     }
 
-    public DefaultTabItem(final String title, final Component component,
+    public static DefaultTabItem create(final String title, final DisposableComponent component,
+            boolean isCloseConfirmationNeeded)
+    {
+        Listener<TabPanelEvent> eventListener = createCloseEventListener(component);
+        return new DefaultTabItem(title, component.getComponent(), isCloseConfirmationNeeded,
+                eventListener);
+    }
+
+    private static Listener<TabPanelEvent> createCloseEventListener(
+            final DisposableComponent component)
+    {
+        return new Listener<TabPanelEvent>()
+            {
+                public final void handleEvent(final TabPanelEvent be)
+                {
+                    if (be.type == Events.Close)
+                    {
+                        component.dispose();
+                    }
+                }
+            };
+    }
+
+    private DefaultTabItem(final String title, final Component component,
             boolean isCloseConfirmationNeeded, final Listener<TabPanelEvent> tabPanelEventListener)
     {
         assert title != null : "Unspecified title.";
         assert component != null : "Unspecified component.";
-        // Note that if not set, is then automatically generated. So this is why we test for
-        // 'ID_PREFIX'. We want the user to set an unique id.
-        assert component.getId().startsWith(GenericConstants.ID_PREFIX) : "Unspecified component id.";
         this.title = title;
         this.component = component;
         this.isCloseConfirmationNeeded = isCloseConfirmationNeeded;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java
index 043500d600aba2b2714a26b225777b0c841e31ab..ef2ec126613f1db2cdce901f833548766df61f6a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ITabItemFactory.java
@@ -28,7 +28,8 @@ public interface ITabItemFactory
     ITabItem create();
 
     /**
-     * Returns the unique identifier of this tab item.
+     * Returns the unique identifier of this tab item. Note that the id should be unique among all
+     * tabs, not widgets.
      * <p>
      * The framework ensures that no two components with the same id will be displayed. Instead the
      * one already created will get the focus.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java
index f2f4fab39d492833e178f5251b62001ca75e28dc..13c097a84b0983821996af513a01bda60cfd47ed 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/MainTabPanel.java
@@ -104,6 +104,9 @@ public class MainTabPanel extends TabPanel
         } else
         {
             String tabId = tabItemFactory.getId();
+            // Note that if not set, is then automatically generated. So this is why we test for
+            // 'ID_PREFIX'. We want the user to set an unique id.
+            assert tabId.startsWith(GenericConstants.ID_PREFIX) : "Unspecified component id.";
             final MainTabItem newTab = new MainTabItem(tabItemFactory.create(), tabId);
             add(newTab);
             openTabs.put(tabId, newTab);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowser.java
deleted file mode 100644
index d847adfade52ba8c36b8611b52837377e0c9b9d3..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowser.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright 2008 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment;
-
-import com.extjs.gxt.ui.client.Events;
-import com.extjs.gxt.ui.client.event.Listener;
-import com.extjs.gxt.ui.client.event.TabPanelEvent;
-import com.extjs.gxt.ui.client.widget.LayoutContainer;
-import com.extjs.gxt.ui.client.widget.layout.RowData;
-import com.extjs.gxt.ui.client.widget.layout.RowLayout;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-
-/**
- * Main view component of experiment browser.
- * 
- * @author Izabela Adamczyk
- */
-public final class ExperimentBrowser extends LayoutContainer implements Listener<TabPanelEvent>
-{
-    private static final String PREFIX = "experiment-browser";
-
-    public static final String ID = GenericConstants.ID_PREFIX + PREFIX;
-
-    private final ExperimentBrowserGrid experimentBrowserGrid;
-
-    public ExperimentBrowser(final IViewContext<ICommonClientServiceAsync> viewContext)
-    {
-        setId(ID);
-        setLayout(new RowLayout());
-
-        final ExperimentBrowserToolbar toolbar = new ExperimentBrowserToolbar(viewContext);
-        experimentBrowserGrid = new ExperimentBrowserGrid(viewContext, toolbar);
-
-        add(toolbar);
-        add(experimentBrowserGrid, new RowData(1, 1));
-    }
-
-    public final void handleEvent(final TabPanelEvent be)
-    {
-        if (be.type == Events.Close)
-        {
-            experimentBrowserGrid.disposeCache();
-        }
-    }
-}
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
index 398c26920b3d681c206bdef7dfe9a2d2245c7c68..32f466d2c464f21b2408cea47002ec2a3d62b2e2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
@@ -30,6 +30,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.model.ExperimentModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractBrowserGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.EntityKind;
@@ -54,8 +55,16 @@ public final class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment,
     private final ExperimentBrowserToolbar topToolbar;
 
     private ListExperimentsCriteria criteria;
-    
-    ExperimentBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
+
+    public static DisposableComponent create(
+            final IViewContext<ICommonClientServiceAsync> viewContext)
+    {
+        final ExperimentBrowserToolbar toolbar = new ExperimentBrowserToolbar(viewContext);
+        final ExperimentBrowserGrid browserGrid = new ExperimentBrowserGrid(viewContext, toolbar);
+        return browserGrid.createWithToolbar(toolbar);
+    }
+
+    private ExperimentBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
             ExperimentBrowserToolbar topToolbar)
     {
         super(viewContext, GRID_ID);
@@ -131,7 +140,7 @@ public final class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment,
     }
 
     @Override
-    public final void refresh()
+    protected final void refresh()
     {
         ListExperimentsCriteria newCriteria = topToolbar.tryGetCriteria();
         if (newCriteria == null)
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 ff06c184eeb998ddb5e45d308c3381400a219179..08681af39307427e5baeb7aa37f6843374f18a21 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
@@ -35,6 +35,7 @@ import com.extjs.gxt.ui.client.event.Listener;
 import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
 import com.extjs.gxt.ui.client.store.ListStore;
+import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.ContentPanel;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
 import com.extjs.gxt.ui.client.widget.button.Button;
@@ -42,6 +43,8 @@ import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
 import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
 import com.extjs.gxt.ui.client.widget.grid.Grid;
 import com.extjs.gxt.ui.client.widget.layout.FitLayout;
+import com.extjs.gxt.ui.client.widget.layout.RowData;
+import com.extjs.gxt.ui.client.widget.layout.RowLayout;
 import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem;
 import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
 import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -163,6 +166,28 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex
         add(contentPanel);
     }
 
+    /** @return this grid as a disposable component with a specified toolbar at the top. */
+    protected final DisposableComponent createWithToolbar(final Component toolbar)
+    {
+        final LayoutContainer container = new LayoutContainer();
+        container.setLayout(new RowLayout());
+        container.add(toolbar);
+        container.add(this, new RowData(1, 1));
+
+        return new DisposableComponent()
+            {
+                public void dispose()
+                {
+                    disposeCache();
+                }
+
+                public Component getComponent()
+                {
+                    return container;
+                }
+            };
+    }
+
     private PagingLoader<PagingLoadConfig> createPagingLoader()
     {
         final RpcProxy<PagingLoadConfig, PagingLoadResult<M>> proxy = createDataLoaderProxy();
@@ -463,7 +488,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex
         }
     }
 
-    public final void disposeCache()
+    private void disposeCache()
     {
         if (resultSetKey != null)
         {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/DisposableComponent.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/DisposableComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..9dd4eb88e4959e9714ebf582d6b5ec41f172a67e
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/DisposableComponent.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2009 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.ui.grid;
+
+import com.extjs.gxt.ui.client.widget.Component;
+
+/**
+ * Component which should be disposed at the end of the life cycle
+ * 
+ * @author Tomasz Pylak
+ */
+public interface DisposableComponent
+{
+    Component getComponent();
+
+    /** cleans resources, should be called at the end of the component's life cycle */
+    void dispose();
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowser.java
deleted file mode 100644
index 113b38d466c03ebba78b91061c612ff6233aa3ea..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowser.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2008 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample;
-
-import com.extjs.gxt.ui.client.Events;
-import com.extjs.gxt.ui.client.event.Listener;
-import com.extjs.gxt.ui.client.event.TabPanelEvent;
-import com.extjs.gxt.ui.client.widget.LayoutContainer;
-import com.extjs.gxt.ui.client.widget.layout.RowData;
-import com.extjs.gxt.ui.client.widget.layout.RowLayout;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-
-/**
- * Main view component of Sample Browser.
- * 
- * @author Izabela Adamczyk
- */
-public final class SampleBrowser extends LayoutContainer implements Listener<TabPanelEvent>
-{
-    private static final String PREFIX = "sample-browser";
-
-    public static final String ID = GenericConstants.ID_PREFIX + PREFIX;
-
-    private SampleBrowserGrid sampleBrowserGrid;
-
-    public SampleBrowser(final IViewContext<ICommonClientServiceAsync> viewContext)
-    {
-        setId(ID);
-        setLayout(new RowLayout());
-
-        final SampleBrowserToolbar toolbar = new SampleBrowserToolbar(viewContext);
-        sampleBrowserGrid = new SampleBrowserGrid(viewContext, toolbar);
-
-        add(toolbar);
-        add(sampleBrowserGrid, new RowData(1, 1));
-    }
-
-    //
-    // Listener
-    //
-
-    public final void handleEvent(final TabPanelEvent be)
-    {
-        if (be.type == Events.Close)
-        {
-            sampleBrowserGrid.disposeCache();
-        }
-    }
-}
\ No newline at end of file
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 a2affec84f8c29a6fb8870c2f022530614b7dd3b..6e4abc0f5a5dc7cbaaa471160eab6b41880bcf32 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
@@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractBrowserGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.SampleModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
@@ -46,18 +47,27 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteri
  */
 public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleModel>
 {
-    private static final String PREFIX = "sample-browser-grid_";
+    private static final String PREFIX = GenericConstants.ID_PREFIX + "sample-browser-grid_";
 
-    public static final String BROWSER_ID = GenericConstants.ID_PREFIX + PREFIX + "sample_browser";
+    // browser consists of the grid and the toolbar
+    public static final String BROWSER_ID = PREFIX + "sample_browser";
 
-    public static final String GRID_ID = GenericConstants.ID_PREFIX + PREFIX + "grid";
+    public static final String GRID_ID = PREFIX + "grid";
 
     private final SampleBrowserToolbar topToolbar;
 
     // criteria used in the previous refresh operation or null if it has not occurred yet
     private ListSampleCriteria criteria;
 
-    SampleBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
+    public static DisposableComponent create(
+            final IViewContext<ICommonClientServiceAsync> viewContext)
+    {
+        final SampleBrowserToolbar toolbar = new SampleBrowserToolbar(viewContext);
+        final SampleBrowserGrid browserGrid = new SampleBrowserGrid(viewContext, toolbar);
+        return browserGrid.createWithToolbar(toolbar);
+    }
+
+    private SampleBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
             SampleBrowserToolbar topToolbar)
     {
         super(viewContext, GRID_ID);
@@ -138,7 +148,7 @@ public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleM
      * </p>
      */
     @Override
-    public final void refresh()
+    protected final void refresh()
     {
         ListSampleCriteria newCriteria = topToolbar.tryGetCriteria();
         if (newCriteria == null)