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 c3358afbfab964d57b3a964fc4d49ad3c85b5cc4..330b771616105e7a0339813c605a37377c3a0c49 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
@@ -19,6 +19,12 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
 
 import java.util.List;
 
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+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 com.google.gwt.user.client.ui.Widget;
+
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
@@ -29,6 +35,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.report.ReportGeneratedCallback.IOnReportComponentGeneratedAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search.DetailedDataSetSearchToolbar;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search.DetailedSearchToolbar;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search.DetailedSearchWindow;
@@ -39,6 +46,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.DataSetGridUtils;
 
 /**
  * Grid with detailed data set search results.
@@ -55,39 +63,91 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
 
     public static final String GRID_ID = BROWSER_ID + "-grid";
 
+    private static IDisposableComponent disposableComponentOrNull = null;
+
     public static IDisposableComponent create(
             final IViewContext<ICommonClientServiceAsync> viewContext)
     {
-        DataSetSearchHitGrid grid = new DataSetSearchHitGrid(viewContext);
-        final DetailedSearchWindow searchWindow =
-                new DetailedSearchWindow(viewContext, EntityKind.DATA_SET);
-        final DetailedSearchToolbar toolbar =
-                new DetailedDataSetSearchToolbar(viewContext, grid,
-                        viewContext.getMessage(Dict.BUTTON_CHANGE_QUERY), searchWindow);
-        searchWindow.setUpdateListener(toolbar);
-        return grid.asDisposableWithToolbar(toolbar);
+        return create(viewContext, null);
     }
 
     public static DisposableEntityChooser<ExternalData> createWithInitialSearchCriteria(
             final IViewContext<ICommonClientServiceAsync> viewContext,
             DetailedSearchCriteria searchCriteria)
     {
-        DataSetSearchHitGrid grid = new DataSetSearchHitGrid(viewContext);
-
-        grid.chosenSearchCriteria = searchCriteria;
+        return create(viewContext, searchCriteria);
+    }
 
+    private static DisposableEntityChooser<ExternalData> create(
+            final IViewContext<ICommonClientServiceAsync> viewContext,
+            DetailedSearchCriteria searchCriteriaOrNull)
+    {
+        DataSetSearchHitGrid grid = new DataSetSearchHitGrid(viewContext);
         final DetailedSearchWindow searchWindow =
                 new DetailedSearchWindow(viewContext, EntityKind.DATA_SET);
 
-        // Set the initial search string before creating the toolbar because the toolbar will use
-        // the initial search string in its own initialization.
-        searchWindow.setInitialSearchCriteria(searchCriteria);
+        if (searchCriteriaOrNull != null)
+        {
+            grid.chosenSearchCriteria = searchCriteriaOrNull;
+            // Set the initial search string before creating the toolbar
+            // because the toolbar will use the initial search string in its own initialization.
+            searchWindow.setInitialSearchCriteria(searchCriteriaOrNull);
+        }
+
+        final LayoutContainer container = createContainer();
+        final IOnReportComponentGeneratedAction reportGeneratedAction =
+                createReportGeneratedAction(container, grid);
+        final ReportingPluginSelectionWidget reportSelectionWidget =
+                new ReportingPluginSelectionWidget(viewContext, null);
+
+        SelectionChangedListener<DatastoreServiceDescriptionModel> reportChangedListener =
+                DataSetGridUtils.createReportSelectionChangedListener(viewContext,
+                        grid.asDisposableWithoutToolbar(), reportGeneratedAction);
+        reportSelectionWidget.addSelectionChangedListener(reportChangedListener);
 
         final DetailedSearchToolbar toolbar =
                 new DetailedDataSetSearchToolbar(viewContext, grid,
-                        viewContext.getMessage(Dict.BUTTON_CHANGE_QUERY), searchWindow, true);
+                        viewContext.getMessage(Dict.BUTTON_CHANGE_QUERY), searchWindow,
+                        reportSelectionWidget, searchCriteriaOrNull != null);
         searchWindow.setUpdateListener(toolbar);
-        return grid.asDisposableWithToolbar(toolbar);
+
+        return grid.asDisposableWithToolbar(container, toolbar);
+    }
+
+    private static LayoutContainer createContainer()
+    {
+        final LayoutContainer container = new LayoutContainer();
+        container.setLayout(new RowLayout());
+        return container;
+    }
+
+    private static IOnReportComponentGeneratedAction createReportGeneratedAction(
+            final LayoutContainer container, final DataSetSearchHitGrid grid)
+    {
+        return new IOnReportComponentGeneratedAction()
+            {
+                public void execute(IDisposableComponent gridComponent)
+                {
+                    if (gridComponent != null)
+                    {
+                        // remove second widget (first is the toolbar)
+                        Widget widget = container.getWidget(1);
+                        container.remove(widget);
+
+                        // dispose if it wasn't the main grid component
+                        if (disposableComponentOrNull != null
+                                && disposableComponentOrNull.getComponent().equals(grid) == false)
+                        {
+                            disposableComponentOrNull.dispose();
+                        }
+
+                        // update new component
+                        disposableComponentOrNull = gridComponent;
+                        container.add(gridComponent.getComponent(), new RowData(1, 1));
+                        container.layout();
+                    }
+                }
+            };
     }
 
     private DetailedSearchCriteria chosenSearchCriteria;
@@ -95,6 +155,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);
+
     }
 
     @Override
@@ -133,4 +194,15 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
         return DataSetSearchHitModel.createColumnsSchema(viewContext, propertyTypes);
     }
 
+    /** @return this grid as a disposable component with a specified toolbar at the top. */
+    private DisposableEntityChooser<ExternalData> asDisposableWithToolbar(
+            final LayoutContainer container, final IDisposableComponent toolbar)
+    {
+        container.add(toolbar.getComponent());
+        container.add(this, new RowData(1, 1));
+
+        // TODO 2011-03-10, Piotr Buczek: dispose report
+        return asDisposableEntityChooser(container, toolbar);
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ReportingPluginSelectionWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ReportingPluginSelectionWidget.java
index dd67e9592d036750aab2c29c898825fdfd51abcb..6813671c7b3c7d6c71de930f586f5d05261650ca 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ReportingPluginSelectionWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ReportingPluginSelectionWidget.java
@@ -43,6 +43,9 @@ public class ReportingPluginSelectionWidget extends
 
     public static final String METADATA = "Overview";
 
+    private static final DatastoreServiceDescriptionModel METADATA_MODEL =
+            DatastoreServiceDescriptionModel.createFakeReportingServiceModel(METADATA);
+
     private final IViewContext<?> viewContext;
 
     public ReportingPluginSelectionWidget(final IViewContext<?> viewContext,
@@ -76,6 +79,11 @@ public class ReportingPluginSelectionWidget extends
             };
     }
 
+    public void selectMetadataPlugin()
+    {
+        setValue(METADATA_MODEL);
+    }
+
     @Override
     protected List<DatastoreServiceDescriptionModel> convertItems(
             List<DatastoreServiceDescription> result)
@@ -83,7 +91,7 @@ public class ReportingPluginSelectionWidget extends
         List<DatastoreServiceDescriptionModel> models =
                 DatastoreServiceDescriptionModel.convert(result, null);
 
-        models.add(0, DatastoreServiceDescriptionModel.createFakeReportingServiceModel(METADATA));
+        models.add(0, METADATA_MODEL);
 
         return models;
     }
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 0f908e52c43d2aa4c0fbe8cb891b52ea81114e61..a7393b4f2dda91883b2e92498e91b164b139aa70 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
@@ -462,8 +462,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
     }
 
     /** @return this grid as a disposable component with a specified toolbar at the top. */
-    protected final DisposableEntityChooser<T> asDisposableWithToolbar(
-            final IDisposableComponent toolbar)
+    protected DisposableEntityChooser<T> asDisposableWithToolbar(final IDisposableComponent toolbar)
     {
         final LayoutContainer container = new LayoutContainer();
         container.setLayout(new RowLayout());
@@ -514,7 +513,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         }
     }
 
-    private DisposableEntityChooser<T> asDisposableEntityChooser(final Component mainComponent,
+    protected DisposableEntityChooser<T> asDisposableEntityChooser(final Component mainComponent,
             final IDisposableComponent disposableComponentOrNull)
     {
         final AbstractBrowserGrid<T, M> self = this;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedDataSetSearchToolbar.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedDataSetSearchToolbar.java
index 7e718a50698d2c60293f616f3f5167144e5cffd9..e380dbd23588199afc32ed61d345f7af9631fb36 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedDataSetSearchToolbar.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/search/DetailedDataSetSearchToolbar.java
@@ -4,16 +4,15 @@ import java.util.List;
 
 import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
 
-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.ui.data.AbstractExternalDataGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetProcessingMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetSearchHitGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.ReportingPluginSelectionWidget;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.report.ReportGeneratedCallback.IOnReportComponentGeneratedAction;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.DataSetGridUtils;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.DataSetGridUtils.IAddProcessingPluginsMenuAction;
 
 /**
  * Extension of {@link DetailedSearchWindow} adding widgets for reporting and processing plugins.
@@ -24,63 +23,48 @@ public class DetailedDataSetSearchToolbar extends DetailedSearchToolbar
 {
     private final ReportingPluginSelectionWidget reportSelectionWidget;
 
-    private final IOnReportComponentGeneratedAction reportGeneratedAction;
-
     public DetailedDataSetSearchToolbar(final IViewContext<?> viewContext,
             final DataSetSearchHitGrid grid, String buttonName,
-            final DetailedSearchWindow searchWindow)
+            final DetailedSearchWindow searchWindow,
+            final ReportingPluginSelectionWidget reportSelectionWidget)
     {
-        this(viewContext, grid, buttonName, searchWindow, false);
+        this(viewContext, grid, buttonName, searchWindow, reportSelectionWidget, false);
     }
 
     public DetailedDataSetSearchToolbar(final IViewContext<?> viewContext,
             final DataSetSearchHitGrid grid, String buttonName,
-            final DetailedSearchWindow searchWindow, boolean initializeDescriptionFromSearchWindow)
+            final DetailedSearchWindow searchWindow,
+            final ReportingPluginSelectionWidget reportSelectionWidget,
+            boolean initializeDescriptionFromSearchWindow)
     {
         super(grid, buttonName, searchWindow, initializeDescriptionFromSearchWindow);
-        this.reportSelectionWidget = new ReportingPluginSelectionWidget(viewContext, null);
-        this.reportGeneratedAction = new IOnReportComponentGeneratedAction()
-            {
-                public void execute(IDisposableComponent gridComponent)
-                {
-                    // TODO
-                    // replaceContent(gridComponent);
-                }
-            };
+        this.reportSelectionWidget = reportSelectionWidget;
         add(reportSelectionWidget);
         if (viewContext.isSimpleOrEmbeddedMode() == false)
         {
             // processing plugins should be hidden in simple view mode
-            viewContext.getCommonService().listDataStoreServices(DataStoreServiceKind.PROCESSING,
-                    new LoadProcessingPluginsCallback(viewContext, grid));
+            IAddProcessingPluginsMenuAction addPluginsAction =
+                    new IAddProcessingPluginsMenuAction()
+                        {
+                            public void addProcessingPlugins(DataSetProcessingMenu menu)
+                            {
+                                add(new SeparatorToolItem());
+                                add(menu);
+                            }
+                        };
+            viewContext.getCommonService().listDataStoreServices(
+                    DataStoreServiceKind.PROCESSING,
+                    new DataSetGridUtils.LoadProcessingPluginsCallback(viewContext, grid,
+                            addPluginsAction));
         }
     }
 
-    public final class LoadProcessingPluginsCallback extends
-            AbstractAsyncCallback<List<DatastoreServiceDescription>>
+    @Override
+    public void updateSearchResults(DetailedSearchCriteria searchCriteria,
+            String searchDescription, List<PropertyType> availablePropertyTypes)
     {
-        private final AbstractExternalDataGrid browser;
-
-        public LoadProcessingPluginsCallback(final IViewContext<?> viewContext,
-                AbstractExternalDataGrid browser)
-        {
-            super(viewContext);
-            this.browser = browser;
-        }
-
-        @Override
-        protected void process(List<DatastoreServiceDescription> result)
-        {
-            if (result.isEmpty() == false)
-            {
-
-                DataSetProcessingMenu menu =
-                        new DataSetProcessingMenu(viewContext.getCommonViewContext(),
-                                browser.getSelectedAndDisplayedItemsAction(), result);
-                add(new SeparatorToolItem());
-                add(menu);
-            }
-        }
+        reportSelectionWidget.selectMetadataPlugin();
+        super.updateSearchResults(searchCriteria, searchDescription, availablePropertyTypes);
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/DropDownList.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/DropDownList.java
index 47f5f94a8308b5c6f64b7b6e1d7140def562aa9e..1aa2fda60665589d48070d7e41496cc073ce67aa 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/DropDownList.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/DropDownList.java
@@ -196,7 +196,7 @@ abstract public class DropDownList<M extends ModelData, E> extends ComboBox<M> i
     {
         return this;
     }
-    
+
     public void dispose()
     {
         if (resultSetKey != null && viewContextOrNull != null)
@@ -205,7 +205,7 @@ abstract public class DropDownList<M extends ModelData, E> extends ComboBox<M> i
                     new VoidAsyncCallback<Void>(viewContextOrNull));
         }
     }
-    
+
     public void update(Set<DatabaseModificationKind> observedModifications)
     {
         refreshStore();
@@ -326,7 +326,7 @@ abstract public class DropDownList<M extends ModelData, E> extends ComboBox<M> i
         applyEmptyText();
     }
 
-    private void selectFirstModel(final List<M> models)
+    protected void selectFirstModel(final List<M> models)
     {
         setSelection(models);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/AbstractDataSetsSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/AbstractDataSetsSection.java
index b5414c8dabe1a9cfc6a6f77ef62ac9da911819ea..703771f4afaa5e267d077dad4600aa69110d5a4a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/AbstractDataSetsSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/AbstractDataSetsSection.java
@@ -16,30 +16,21 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset;
 
-import java.util.List;
-
-import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
 import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableTabContent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.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.data.AbstractExternalDataGrid.SelectedAndDisplayedItems;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetComputeUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetProcessingMenu;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetReportGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DatastoreServiceDescriptionModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.ReportingPluginSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.report.ReportGeneratedCallback.IOnReportComponentGeneratedAction;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.DataSetGridUtils.IAddProcessingPluginsMenuAction;
 
 /**
  * @author Piotr Buczek
@@ -75,8 +66,20 @@ public abstract class AbstractDataSetsSection extends DisposableTabContent
         if (viewContext.isSimpleOrEmbeddedMode() == false)
         {
             // processing plugins should be hidden in simple view mode
-            viewContext.getCommonService().listDataStoreServices(DataStoreServiceKind.PROCESSING,
-                    new LoadProcessingPluginsCallback(viewContext, browser));
+            IAddProcessingPluginsMenuAction addPluginsAction =
+                    new IAddProcessingPluginsMenuAction()
+                        {
+
+                            public void addProcessingPlugins(DataSetProcessingMenu menu)
+                            {
+                                getHeader().addTool(new SeparatorToolItem());
+                                getHeader().addTool(menu);
+                            }
+                        };
+            viewContext.getCommonService().listDataStoreServices(
+                    DataStoreServiceKind.PROCESSING,
+                    new DataSetGridUtils.LoadProcessingPluginsCallback(viewContext, browser,
+                            addPluginsAction));
         }
     }
 
@@ -84,11 +87,11 @@ public abstract class AbstractDataSetsSection extends DisposableTabContent
     protected final IDisposableComponent createDisposableContent()
     {
         metadataComponent = createDatasetBrowserComponent();
-        initWidgets(extractBrowser(metadataComponent));
+        initWidgets(DataSetGridUtils.extractBrowser(metadataComponent));
 
         SelectionChangedListener<DatastoreServiceDescriptionModel> reportChangedListener =
-                createReportSelectionChangedListener(viewContext, metadataComponent,
-                        reportGeneratedAction);
+                DataSetGridUtils.createReportSelectionChangedListener(viewContext,
+                        metadataComponent, reportGeneratedAction);
         reportSelectionWidget.addSelectionChangedListener(reportChangedListener);
         return metadataComponent;
     }
@@ -120,96 +123,4 @@ public abstract class AbstractDataSetsSection extends DisposableTabContent
         }
     }
 
-    private static AbstractExternalDataGrid extractBrowser(IDisposableComponent metadataComponent)
-    {
-        return (AbstractExternalDataGrid) metadataComponent.getComponent();
-    }
-
-    private static SelectionChangedListener<DatastoreServiceDescriptionModel> createReportSelectionChangedListener(
-            final IViewContext<?> viewContext, final IDisposableComponent metadataComponent,
-            final IOnReportComponentGeneratedAction reportGeneratedAction)
-    {
-        final AbstractExternalDataGrid browser = extractBrowser(metadataComponent);
-        return new SelectionChangedListener<DatastoreServiceDescriptionModel>()
-            {
-
-                @Override
-                public void selectionChanged(
-                        SelectionChangedEvent<DatastoreServiceDescriptionModel> se)
-                {
-                    final DatastoreServiceDescriptionModel selectedItem = se.getSelectedItem();
-                    if (selectedItem != null)
-                    {
-                        DatastoreServiceDescription service = selectedItem.getBaseObject();
-
-                        if (service.getLabel().equals(ReportingPluginSelectionWidget.METADATA))
-                        {
-                            showMetadataView();
-                        } else
-                        {
-                            showGeneratedReport(service);
-                        }
-                    }
-
-                }
-
-                private void showMetadataView()
-                {
-                    reportGeneratedAction.execute(metadataComponent);
-                }
-
-                private void showGeneratedReport(DatastoreServiceDescription service)
-                {
-                    assert service.getServiceKind() == DataStoreServiceKind.QUERIES;
-
-                    IDelegatedActionWithResult<SelectedAndDisplayedItems> selectedAndDisplayedItemsAction =
-                            browser.getSelectedAndDisplayedItemsAction();
-
-                    if (browser.getSelectedItems().isEmpty())
-                    {
-                        // when no data sets were selected perform query on all without asking
-                        DisplayedOrSelectedDatasetCriteria criteria =
-                                selectedAndDisplayedItemsAction.execute().createCriteria(false);
-                        DataSetReportGenerator.generateAndInvoke(
-                                viewContext.getCommonViewContext(), service, criteria,
-                                reportGeneratedAction);
-                    } else
-                    {
-                        DataSetComputeUtils.createComputeAction(viewContext.getCommonViewContext(),
-                                selectedAndDisplayedItemsAction, service, reportGeneratedAction)
-                                .execute();
-                    }
-                }
-
-            };
-
-    }
-
-    public final class LoadProcessingPluginsCallback extends
-            AbstractAsyncCallback<List<DatastoreServiceDescription>>
-    {
-        private final AbstractExternalDataGrid browser;
-
-        public LoadProcessingPluginsCallback(final IViewContext<?> viewContext,
-                AbstractExternalDataGrid browser)
-        {
-            super(viewContext);
-            this.browser = browser;
-        }
-
-        @Override
-        protected void process(List<DatastoreServiceDescription> result)
-        {
-            if (result.isEmpty() == false)
-            {
-
-                DataSetProcessingMenu menu =
-                        new DataSetProcessingMenu(viewContext.getCommonViewContext(),
-                                browser.getSelectedAndDisplayedItemsAction(), result);
-                getHeader().addTool(new SeparatorToolItem());
-                getHeader().addTool(menu);
-            }
-        }
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetGridUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetGridUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..087fdf838cd21e002705074bc9ba8016ee4a4a56
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetGridUtils.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset;
+
+import java.util.List;
+
+import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
+import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+
+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.ui.data.AbstractExternalDataGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid.SelectedAndDisplayedItems;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetComputeUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetProcessingMenu;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetReportGenerator;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DatastoreServiceDescriptionModel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.ReportingPluginSelectionWidget;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.report.ReportGeneratedCallback.IOnReportComponentGeneratedAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
+
+/**
+ * @author Piotr Buczek
+ */
+public class DataSetGridUtils
+{
+
+    public static AbstractExternalDataGrid extractBrowser(IDisposableComponent metadataComponent)
+    {
+        return (AbstractExternalDataGrid) metadataComponent.getComponent();
+    }
+
+    public static SelectionChangedListener<DatastoreServiceDescriptionModel> createReportSelectionChangedListener(
+            final IViewContext<?> viewContext, final IDisposableComponent metadataComponent,
+            final IOnReportComponentGeneratedAction reportGeneratedAction)
+    {
+        final AbstractExternalDataGrid browser = extractBrowser(metadataComponent);
+        return new SelectionChangedListener<DatastoreServiceDescriptionModel>()
+            {
+
+                @Override
+                public void selectionChanged(
+                        SelectionChangedEvent<DatastoreServiceDescriptionModel> se)
+                {
+                    final DatastoreServiceDescriptionModel selectedItem = se.getSelectedItem();
+                    if (selectedItem != null)
+                    {
+                        DatastoreServiceDescription service = selectedItem.getBaseObject();
+
+                        if (service.getLabel().equals(ReportingPluginSelectionWidget.METADATA))
+                        {
+                            showMetadataView();
+                        } else
+                        {
+                            showGeneratedReport(service);
+                        }
+                    }
+
+                }
+
+                private void showMetadataView()
+                {
+                    reportGeneratedAction.execute(metadataComponent);
+                }
+
+                private void showGeneratedReport(DatastoreServiceDescription service)
+                {
+                    assert service.getServiceKind() == DataStoreServiceKind.QUERIES;
+
+                    IDelegatedActionWithResult<SelectedAndDisplayedItems> selectedAndDisplayedItemsAction =
+                            browser.getSelectedAndDisplayedItemsAction();
+
+                    if (browser.getSelectedItems().isEmpty())
+                    {
+                        // when no data sets were selected perform query on all without asking
+                        DisplayedOrSelectedDatasetCriteria criteria =
+                                selectedAndDisplayedItemsAction.execute().createCriteria(false);
+                        DataSetReportGenerator.generateAndInvoke(
+                                viewContext.getCommonViewContext(), service, criteria,
+                                reportGeneratedAction);
+                    } else
+                    {
+                        DataSetComputeUtils.createComputeAction(viewContext.getCommonViewContext(),
+                                selectedAndDisplayedItemsAction, service, reportGeneratedAction)
+                                .execute();
+                    }
+                }
+
+            };
+
+    }
+
+    public interface IAddProcessingPluginsMenuAction
+    {
+        void addProcessingPlugins(DataSetProcessingMenu menu);
+    }
+
+    public static final class LoadProcessingPluginsCallback extends
+            AbstractAsyncCallback<List<DatastoreServiceDescription>>
+    {
+        private final AbstractExternalDataGrid browser;
+
+        private final IAddProcessingPluginsMenuAction action;
+
+        public LoadProcessingPluginsCallback(final IViewContext<?> viewContext,
+                AbstractExternalDataGrid browser, final IAddProcessingPluginsMenuAction action)
+        {
+            super(viewContext);
+            this.browser = browser;
+            this.action = action;
+        }
+
+        @Override
+        protected void process(List<DatastoreServiceDescription> result)
+        {
+            if (result.isEmpty() == false)
+            {
+                DataSetProcessingMenu menu =
+                        new DataSetProcessingMenu(viewContext.getCommonViewContext(),
+                                browser.getSelectedAndDisplayedItemsAction(), result);
+                action.addProcessingPlugins(menu);
+            }
+        }
+    }
+
+}