diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index 8ee0a1a03d83f5670b9f762483b1103012fec4f7..38579bf7d210ba6d0815ffbc6a1022ddfca05527 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -39,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteri
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableModelReference;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -279,16 +280,16 @@ public interface ICommonClientService extends IClientService
     /**
      * Lists the entities matching the search.
      */
-    public ResultSet<MatchingEntity> listMatchingEntities(
+    public TypedTableResultSet<MatchingEntity> listMatchingEntities(
             final SearchableEntity searchableEntityOrNull, final String queryText,
             final boolean useWildcardSearchMode,
-            final IResultSetConfig<String, MatchingEntity> resultSetConfig)
+            final IResultSetConfig<String, TableModelRowWithObject<MatchingEntity>> resultSetConfig)
             throws UserFailureException;
 
     /**
      * Like {@link #prepareExportSamples(TableExportCriteria)}, but for matching entites.
      */
-    public String prepareExportMatchingEntities(final TableExportCriteria<MatchingEntity> criteria)
+    public String prepareExportMatchingEntities(final TableExportCriteria<TableModelRowWithObject<MatchingEntity>> criteria)
             throws UserFailureException;
 
     /**
@@ -561,7 +562,7 @@ public interface ICommonClientService extends IClientService
      * Returns {@link ExternalData} fulfilling given {@link RelatedDataSetCriteria}.
      */
     public ResultSetWithEntityTypes<ExternalData> searchForDataSets(
-            RelatedDataSetCriteria criteria,
+            RelatedDataSetCriteria<? extends IEntityInformationHolder> criteria,
             final IResultSetConfig<String, ExternalData> resultSetConfig)
             throws UserFailureException;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index 86b0b7aa8c2750783eac81a0b5b5ade223ed8f5d..c2e752a83a9776337ab6f8decde47c8b689c7bbc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -41,6 +41,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteri
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableModelReference;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -265,11 +266,11 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
      */
     public void listMatchingEntities(final SearchableEntity searchableEntity,
             final String queryText, final boolean useWildcardSearchMode,
-            final IResultSetConfig<String, MatchingEntity> resultSetConfig,
-            final AsyncCallback<ResultSet<MatchingEntity>> asyncCallback);
+            final IResultSetConfig<String, TableModelRowWithObject<MatchingEntity>> resultSetConfig,
+            final AsyncCallback<TypedTableResultSet<MatchingEntity>> asyncCallback);
 
     /** @see ICommonClientService#prepareExportMatchingEntities(TableExportCriteria) */
-    public void prepareExportMatchingEntities(TableExportCriteria<MatchingEntity> exportCriteria,
+    public void prepareExportMatchingEntities(TableExportCriteria<TableModelRowWithObject<MatchingEntity>> exportCriteria,
             AsyncCallback<String> callback);
 
     /** @see ICommonClientService#listProjects(DefaultResultSetConfig) */
@@ -468,7 +469,7 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     /**
      * @see ICommonClientService#searchForDataSets(RelatedDataSetCriteria, IResultSetConfig)
      */
-    public void searchForDataSets(RelatedDataSetCriteria criteria,
+    public void searchForDataSets(RelatedDataSetCriteria<? extends IEntityInformationHolder> criteria,
             final IResultSetConfig<String, ExternalData> resultSetConfig,
             final AsyncCallback<ResultSetWithEntityTypes<ExternalData>> callback);
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
index 0965bbea4d0995129a995bcb1c618e0bc5bcf6e3..9fbfde34bf308a2152a603e58d81a9de1c98a5a8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
@@ -16,9 +16,14 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs.ENTITY_TYPE;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs.IDENTIFIER;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs.MATCHING_FIELD;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs.REGISTRATOR;
 import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.createOrDelete;
 import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.edit;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
@@ -27,40 +32,39 @@ import com.extjs.gxt.ui.client.event.ButtonEvent;
 import com.extjs.gxt.ui.client.event.SelectionListener;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
 import com.extjs.gxt.ui.client.widget.button.Button;
+import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AbstractTabItemFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
 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.MatchingEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.MatchingEntityModel.MatchingEntityColumnKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPlugin;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactory;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractBrowserGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.PersonRenderer;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
 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.ICellListener;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IDataRefreshCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SearchableEntity;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * A {@link LayoutContainer} extension which displays the matching entities.
  * 
  * @author Christian Ribeaud
  */
-final class MatchingEntitiesPanel extends AbstractBrowserGrid<MatchingEntity, MatchingEntityModel>
+public final class MatchingEntitiesPanel extends TypedTableGrid<MatchingEntity>
 {
     static final String PREFIX = GenericConstants.ID_PREFIX + "matching-entities-panel_";
 
@@ -93,9 +97,9 @@ final class MatchingEntitiesPanel extends AbstractBrowserGrid<MatchingEntity, Ma
         updateDefaultRefreshButton();
 
         registerLinkClickListenerFor(MatchingEntityColumnKind.IDENTIFIER.id(),
-                new ICellListener<MatchingEntity>()
+                new ICellListener<TableModelRowWithObject<MatchingEntity>>()
                     {
-                        public void handle(MatchingEntity rowItem, boolean keyPressed)
+                        public void handle(TableModelRowWithObject<MatchingEntity> rowItem, boolean keyPressed)
                         {
                             showEntityViewer(rowItem, false, keyPressed);
                         }
@@ -149,9 +153,10 @@ final class MatchingEntitiesPanel extends AbstractBrowserGrid<MatchingEntity, Ma
     }
 
     @Override
-    protected void showEntityViewer(MatchingEntity matchingEntity, boolean editMode,
+    protected void showEntityViewer(TableModelRowWithObject<MatchingEntity> object, boolean editMode,
             boolean inBackground)
     {
+        MatchingEntity matchingEntity = object.getObjectOrNull();
         final EntityKind entityKind = matchingEntity.getEntityKind();
         BasicEntityType entityType = matchingEntity.getEntityType();
         final IClientPluginFactory clientPluginFactory =
@@ -167,46 +172,51 @@ final class MatchingEntitiesPanel extends AbstractBrowserGrid<MatchingEntity, Ma
     }
 
     @Override
-    protected ColumnDefsAndConfigs<MatchingEntity> createColumnsDefinition()
+    protected ColumnDefsAndConfigs<TableModelRowWithObject<MatchingEntity>> createColumnsDefinition()
     {
-        ColumnDefsAndConfigs<MatchingEntity> schema =
-                BaseEntityModel.createColumnConfigs(
-                        MatchingEntityModel.getStaticColumnsDefinition(), viewContext);
-        schema.setGridCellRendererFor(MatchingEntityColumnKind.IDENTIFIER.id(),
-                createInternalLinkCellRenderer());
+        ColumnDefsAndConfigs<TableModelRowWithObject<MatchingEntity>> schema =
+                super.createColumnsDefinition();
+        schema.setGridCellRendererFor(REGISTRATOR, PersonRenderer.REGISTRATOR_RENDERER);
+        schema.setGridCellRendererFor(IDENTIFIER, createInternalLinkCellRenderer());
         return schema;
     }
 
     @Override
-    protected MatchingEntityModel createModel(GridRowModel<MatchingEntity> entity)
+    protected String translateColumnIdToDictionaryKey(String columnID)
     {
-        return new MatchingEntityModel(entity);
+        return columnID.toLowerCase();
     }
 
     @Override
-    protected void listEntities(DefaultResultSetConfig<String, MatchingEntity> resultSetConfig,
-            AbstractAsyncCallback<ResultSet<MatchingEntity>> callback)
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<MatchingEntity>> resultSetConfig,
+            AsyncCallback<TypedTableResultSet<MatchingEntity>> callback)
     {
-        callback.addOnSuccessAction(new ShowResultSetCutInfo<ResultSet<MatchingEntity>>(viewContext));
+        ShowResultSetCutInfo<TypedTableResultSet<MatchingEntity>> info =
+                new ShowResultSetCutInfo<TypedTableResultSet<MatchingEntity>>(viewContext);
+        if (callback instanceof AbstractAsyncCallback)
+        {
+            ((AbstractAsyncCallback<TypedTableResultSet<MatchingEntity>>) callback)
+                    .addOnSuccessAction(info);
+        }
         viewContext.getService().listMatchingEntities(searchableEntity, queryText,
                 useWildcardSearchMode, resultSetConfig, callback);
     }
 
     @Override
-    protected void prepareExportEntities(TableExportCriteria<MatchingEntity> exportCriteria,
+    protected void prepareExportEntities(TableExportCriteria<TableModelRowWithObject<MatchingEntity>> exportCriteria,
             AbstractAsyncCallback<String> callback)
     {
         viewContext.getService().prepareExportMatchingEntities(exportCriteria, callback);
     }
 
     @Override
-    protected List<IColumnDefinition<MatchingEntity>> getInitialFilters()
+    protected List<String> getColumnIdsOfFilters()
     {
-        return asColumnFilters(new MatchingEntityColumnKind[]
-            { MatchingEntityColumnKind.ENTITY_TYPE, MatchingEntityColumnKind.IDENTIFIER,
-                    MatchingEntityColumnKind.MATCHING_FIELD });
+        return Arrays.asList(ENTITY_TYPE, IDENTIFIER, MATCHING_FIELD);
     }
 
+    @Override
     public DatabaseModificationKind[] getRelevantModifications()
     {
         return new DatabaseModificationKind[]
@@ -218,6 +228,7 @@ final class MatchingEntitiesPanel extends AbstractBrowserGrid<MatchingEntity, Ma
                     createOrDelete(ObjectKind.VOCABULARY_TERM), edit(ObjectKind.VOCABULARY_TERM) };
     }
 
+    @Override
     public void update(Set<DatabaseModificationKind> observedModifications)
     {
         refreshGridSilently();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java
index 5a6c0070e52c818bb2a807e8423fd54fa6090ad5..ba483bc4e812453139d0a3d49ed2de73a24037be 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ShowRelatedDatasetsDialog.java
@@ -36,19 +36,20 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WidgetUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.RelatedDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * Dialog used to show a tab with Data Sets related to entities like samples and experiments.
  * 
  * @author Piotr Buczek
  */
-public final class ShowRelatedDatasetsDialog extends
-        AbstractDataConfirmationDialog<List<? extends IEntityInformationHolderWithPermId>>
+public final class ShowRelatedDatasetsDialog<E extends IEntityInformationHolder> extends
+        AbstractDataConfirmationDialog<List<TableModelRowWithObject<E>>>
 {
-    public static void showRelatedDatasetsTab(
+    public static <E extends IEntityInformationHolder> void showRelatedDatasetsTab(
             final IViewContext<ICommonClientServiceAsync> viewContext,
-            final RelatedDataSetCriteria criteria)
+            final RelatedDataSetCriteria<E> criteria)
     {
         final AbstractTabItemFactory tabFactory = new AbstractTabItemFactory()
             {
@@ -94,15 +95,15 @@ public final class ShowRelatedDatasetsDialog extends
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final TableExportCriteria<? extends IEntityInformationHolderWithPermId> displayedEntities;
+    private final TableExportCriteria<TableModelRowWithObject<E>> displayedEntities;
 
     private final int displayedEntitiesCount;
 
     private Radio allOrSelectedRadio;
 
     public ShowRelatedDatasetsDialog(IViewContext<ICommonClientServiceAsync> viewContext,
-            List<? extends IEntityInformationHolderWithPermId> selectedEntities,
-            TableExportCriteria<? extends IEntityInformationHolderWithPermId> displayedEntities,
+            List<TableModelRowWithObject<E>> selectedEntities,
+            TableExportCriteria<TableModelRowWithObject<E>> displayedEntities,
             int displayedEntitiesCount)
     {
         super(viewContext, selectedEntities, viewContext
@@ -151,11 +152,11 @@ public final class ShowRelatedDatasetsDialog extends
     protected void executeConfirmedAction()
     {
         final boolean selected = getSelected();
-        RelatedDataSetCriteria criteria = createCriteria(selected);
+        RelatedDataSetCriteria<E> criteria = createCriteria(selected);
         showRelatedDatasetsTab(viewContext, criteria);
     }
 
-    private RelatedDataSetCriteria createCriteria(boolean selected)
+    private RelatedDataSetCriteria<E> createCriteria(boolean selected)
     {
         if (getSelected())
         {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/PersonRenderer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/PersonRenderer.java
index 8b88e8edf1501a8f92f99fc70f0274356e6b7d66..fa4eaa6ccf14e05801d1ea4b93b89f7ff74e1676 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/PersonRenderer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/PersonRenderer.java
@@ -27,8 +27,8 @@ import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.DOMUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IRegistratorHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.SimplePersonRenderer;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractRegistrationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
@@ -50,7 +50,7 @@ public final class PersonRenderer
     
     /**
      * Registrator renderer. Works only with {@link TableModelRowWithObject} wrapping a
-     * subclass of {@link AbstractRegistrationHolder}.
+     * DTO implementing {@link IRegistratorHolder}.
      */
     public static final GridCellRenderer<BaseEntityModel<?>> REGISTRATOR_RENDERER =
             new GridCellRenderer<BaseEntityModel<?>>()
@@ -61,7 +61,7 @@ public final class PersonRenderer
                             ListStore<BaseEntityModel<?>> store, Grid<BaseEntityModel<?>> grid)
                     {
                         Person registrator =
-                                ((TableModelRowWithObject<AbstractRegistrationHolder>) model
+                                ((TableModelRowWithObject<IRegistratorHolder>) model
                                         .getBaseObject()).getObjectOrNull().getRegistrator();
                         return PersonRenderer.createPersonAnchor(registrator);
                     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java
index 3b7fe3b87d82d86ef2c8d5084f0d6115975bbb0c..84b823ca075373e0d952ca13d321ca2bd90f53d8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGrid.java
@@ -29,6 +29,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
 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.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ShowRelatedDatasetsDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
@@ -43,11 +44,14 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.Co
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListenerAndLinkGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.RelatedDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetFetchConfig.ResultSetFetchMode;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
@@ -76,6 +80,36 @@ public abstract class TypedTableGrid<T extends ISerializable>
      */
     private static final int MAX_SHOWN_COLUMNS = 200;
 
+    /**
+     * If user selected some entities in given browser first a dialog is shown where he can select
+     * between showing data sets related to selected/displayed entities. Then a tab is displayed
+     * where these related data sets are listed.<br>
+     * <br>
+     * If no entities were selected in given browser the tab is displayed where data sets related to
+     * all entities displayed in the grid are listed.
+     */
+    protected static final <E extends IEntityInformationHolder> void showRelatedDataSets(
+            final IViewContext<ICommonClientServiceAsync> viewContext,
+            final TypedTableGrid<E> browser)
+    {
+        final List<TableModelRowWithObject<E>> selectedEntities =
+                browser.getSelectedBaseObjects();
+        final TableExportCriteria<TableModelRowWithObject<E>> displayedEntities =
+                browser.createTableExportCriteria();
+        if (selectedEntities.isEmpty())
+        {
+            // no entity selected - show datasets related to all displayed
+            RelatedDataSetCriteria<E> relatedCriteria =
+                    RelatedDataSetCriteria.<E>createDisplayedEntities(displayedEntities);
+            ShowRelatedDatasetsDialog.showRelatedDatasetsTab(viewContext, relatedCriteria);
+        } else
+        {
+            // > 0 entity selected - show dialog with all/selected radio
+            new ShowRelatedDatasetsDialog<E>(viewContext, selectedEntities, displayedEntities,
+                    browser.getTotalCount()).show();
+        }
+    }
+    
     private final class CellListenerAndLinkGenerator implements ICellListenerAndLinkGenerator<T>
     {
         private final EntityKind entityKind;
@@ -191,6 +225,10 @@ public abstract class TypedTableGrid<T extends ISerializable>
 
     private GridCellRenderer<BaseEntityModel<?>> tryGetSpecificRenderer(DataTypeCode dataType)
     {
+        if (dataType == null)
+        {
+            return null;
+        }
         // NOTE: keep in sync with AbstractPropertyColRenderer.getPropertyColRenderer
         switch (dataType)
         {
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 1a4042cc49430ad4e871e7907e422714309d40a7..b42270620e6b095cd26eb3ce6ab39a487a2deee3 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
@@ -30,6 +30,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetCo
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.RelatedDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
 import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 
@@ -48,16 +49,16 @@ public class RelatedDataSetGrid extends AbstractExternalDataGrid
 
     public static IDisposableComponent create(
             final IViewContext<ICommonClientServiceAsync> viewContext,
-            final RelatedDataSetCriteria relatedCriteria)
+            final RelatedDataSetCriteria<? extends IEntityInformationHolder> relatedCriteria)
     {
         RelatedDataSetGrid grid = new RelatedDataSetGrid(viewContext, relatedCriteria);
         return grid.asDisposableWithoutToolbar();
     }
 
-    private RelatedDataSetCriteria relatedCriteria;
+    private RelatedDataSetCriteria<? extends IEntityInformationHolder> relatedCriteria;
 
     private RelatedDataSetGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
-            final RelatedDataSetCriteria relatedCriteria)
+            final RelatedDataSetCriteria<? extends IEntityInformationHolder> relatedCriteria)
     {
         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 8600473c47182cd9e205b7d949b7cb97851942cd..1544b83257f23cd4d1d723c42cc72a8b2997f543 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
@@ -85,6 +85,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.M
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.RealNumberRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.ComponentEventLogger;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.ComponentEventLogger.EventPair;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.AbstractColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionUI;
@@ -104,6 +105,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetFetchConf
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
@@ -113,6 +115,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKin
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SortInfo;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SortInfo.SortDir;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * @author Tomasz Pylak
@@ -1678,35 +1681,4 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         protected abstract Dialog createDialog(List<T> data, IBrowserGridActionInvoker invoker);
     }
 
-    /**
-     * If user selected some entities in given browser first a dialog is shown where he can select
-     * between showing data sets related to selected/displayed entities. Then a tab is displayed
-     * where these related data sets are listed.<br>
-     * <br>
-     * If no entities were selected in given browser the tab is displayed where data sets related to
-     * all entities displayed in the grid are listed.
-     */
-    // NOTE: This method cannot be externalized from AbstractBrowserGrid because it uses some
-    // AbstractBrowserGrid's protected methods
-    protected static final <E extends IEntityInformationHolderWithPermId> void showRelatedDataSets(
-            final IViewContext<ICommonClientServiceAsync> viewContext,
-            final AbstractBrowserGrid<E, ? extends BaseEntityModel<E>> browser)
-    {
-        final List<? extends IEntityInformationHolderWithPermId> selectedEntities =
-                browser.getSelectedBaseObjects();
-        final TableExportCriteria<? extends IEntityInformationHolderWithPermId> displayedEntities =
-                browser.createTableExportCriteria();
-        if (selectedEntities.isEmpty())
-        {
-            // no entity selected - show datasets related to all displayed
-            RelatedDataSetCriteria relatedCriteria =
-                    RelatedDataSetCriteria.createDisplayedEntities(displayedEntities);
-            ShowRelatedDatasetsDialog.showRelatedDatasetsTab(viewContext, relatedCriteria);
-        } else
-        {
-            // > 0 entity selected - show dialog with all/selected radio
-            new ShowRelatedDatasetsDialog(viewContext, selectedEntities, displayedEntities,
-                    browser.getTotalCount()).show();
-        }
-    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleSearchHitGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleSearchHitGrid.java
index cd8a5ba49a5a7edbf043a23147afab8b9a4366bd..593244e3cbb8e183f6237a5262be24e20c3932d9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleSearchHitGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleSearchHitGrid.java
@@ -119,7 +119,7 @@ public class SampleSearchHitGrid extends SampleBrowserGrid2 implements IDetailed
                             // TableModelRowWithObject doesn't implement IEntityInformationHolder.
                             // Changing the code is relatively easy but the method showRelatedDataSets()
                             // is also used by MatchingEntitiesPanel.
-//                            showRelatedDataSets(viewContext, SampleSearchHitGrid.this);
+                            showRelatedDataSets(viewContext, SampleSearchHitGrid.this);
                         }
                     });
         addButton(showRelatedDatasetsButton);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/MatchingEntitiesPanelColumnIDs.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/MatchingEntitiesPanelColumnIDs.java
new file mode 100644
index 0000000000000000000000000000000000000000..e3354f0e4a213c97a7cfb3c78107a2f67143dbd5
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/MatchingEntitiesPanelColumnIDs.java
@@ -0,0 +1,34 @@
+/*
+ * 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.dto;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.MatchingEntitiesPanel;
+
+/**
+ * IDs of static columns of {@link MatchingEntitiesPanel}.
+ *
+ * @author Franz-Josef Elmer
+ */
+public class MatchingEntitiesPanelColumnIDs
+{
+    public static final String ENTITY_KIND = "ENTITY_KIND";
+    public static final String ENTITY_TYPE = "ENTITY_TYPE";
+    public static final String IDENTIFIER = "IDENTIFIER";
+    public static final String REGISTRATOR = "REGISTRATOR";
+    public static final String MATCHING_FIELD = "MATCHING_FIELD";
+    public static final String MATCHING_TEXT = "MATCHING_TEXT";
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/RelatedDataSetCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/RelatedDataSetCriteria.java
index 38fb6b12a7854fcc994e8612f5dc36010736afd4..8cf7bd04be49c622d9eef6ce85b13bfaaf0e970a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/RelatedDataSetCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/RelatedDataSetCriteria.java
@@ -22,6 +22,7 @@ import com.google.gwt.user.client.rpc.IsSerializable;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * Criteria for listing <i>data sets</i> related to {@link MatchingEntity}s like samples and
@@ -29,40 +30,40 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
  * 
  * @author Piotr Buczek
  */
-public class RelatedDataSetCriteria implements IsSerializable
+public class RelatedDataSetCriteria<E extends IEntityInformationHolder> implements IsSerializable
 {
 
-    private TableExportCriteria<? extends IEntityInformationHolder> displayedEntitiesOrNull;
+    private TableExportCriteria<TableModelRowWithObject<E>> displayedEntitiesOrNull;
 
-    private List<? extends IEntityInformationHolder> selectedEntitiesOrNull;
+    private List<TableModelRowWithObject<E>> selectedEntitiesOrNull;
 
-    public static RelatedDataSetCriteria createDisplayedEntities(
-            TableExportCriteria<? extends IEntityInformationHolder> displayedEntities)
+    public static <E extends IEntityInformationHolder> RelatedDataSetCriteria<E> createDisplayedEntities(
+            TableExportCriteria<TableModelRowWithObject<E>> displayedEntities)
     {
-        return new RelatedDataSetCriteria(displayedEntities, null);
+        return new RelatedDataSetCriteria<E>(displayedEntities, null);
     }
 
-    public static RelatedDataSetCriteria createSelectedEntities(
-            List<? extends IEntityInformationHolder> selectedEntities)
+    public static <E extends IEntityInformationHolder> RelatedDataSetCriteria<E> createSelectedEntities(
+            List<TableModelRowWithObject<E>> selectedEntities)
     {
-        return new RelatedDataSetCriteria(null, selectedEntities);
+        return new RelatedDataSetCriteria<E>(null, selectedEntities);
     }
 
     private RelatedDataSetCriteria(
-            TableExportCriteria<? extends IEntityInformationHolder> displayedEntitiesOrNull,
-            List<? extends IEntityInformationHolder> selectedEntitiesOrNull)
+            TableExportCriteria<TableModelRowWithObject<E>> displayedEntitiesOrNull,
+            List<TableModelRowWithObject<E>> selectedEntitiesOrNull)
     {
         assert (displayedEntitiesOrNull == null) != (selectedEntitiesOrNull == null) : "Exactly one arg must be null and one non-null";
         this.displayedEntitiesOrNull = displayedEntitiesOrNull;
         this.selectedEntitiesOrNull = selectedEntitiesOrNull;
     }
 
-    public TableExportCriteria<? extends IEntityInformationHolder> tryGetDisplayedEntities()
+    public TableExportCriteria<TableModelRowWithObject<E>> tryGetDisplayedEntities()
     {
         return displayedEntitiesOrNull;
     }
 
-    public List<? extends IEntityInformationHolder> tryGetSelectedEntities()
+    public List<TableModelRowWithObject<E>> tryGetSelectedEntities()
     {
         return selectedEntitiesOrNull;
     }
@@ -73,27 +74,27 @@ public class RelatedDataSetCriteria implements IsSerializable
     }
 
     @SuppressWarnings("unused")
-    private TableExportCriteria<? extends IEntityInformationHolder> getDisplayedEntitiesOrNull()
+    private TableExportCriteria<TableModelRowWithObject<E>> getDisplayedEntitiesOrNull()
     {
         return displayedEntitiesOrNull;
     }
 
     @SuppressWarnings("unused")
     private void setDisplayedEntitiesOrNull(
-            TableExportCriteria<? extends IEntityInformationHolder> displayedEntitiesOrNull)
+            TableExportCriteria<TableModelRowWithObject<E>> displayedEntitiesOrNull)
     {
         this.displayedEntitiesOrNull = displayedEntitiesOrNull;
     }
 
     @SuppressWarnings("unused")
-    private List<? extends IEntityInformationHolder> getSelectedEntitiesOrNull()
+    private List<TableModelRowWithObject<E>> getSelectedEntitiesOrNull()
     {
         return selectedEntitiesOrNull;
     }
 
     @SuppressWarnings("unused")
     private void setSelectedEntitiesOrNull(
-            List<? extends IEntityInformationHolder> selectedEntitiesOrNull)
+            List<TableModelRowWithObject<E>> selectedEntitiesOrNull)
     {
         this.selectedEntitiesOrNull = selectedEntitiesOrNull;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleGridColumnIDs.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleGridColumnIDs.java
index f76ce82d9e0ba9e50f2862b4f406ac6684d2df8c..7519883774a28820e36420d8c7845f810e38f5ab 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleGridColumnIDs.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleGridColumnIDs.java
@@ -16,9 +16,11 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.dto;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid2;
+
 
 /**
- * 
+ * IDs of static columns of {@link SampleBrowserGrid2}.
  *
  * @author Franz-Josef Elmer
  */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index b53383b07f639fb4e765a9527253e66165b560a9..b7bd39ef9b6458fd5296ef7fa6d674e285268d56 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -69,6 +69,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.CacheManager
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DataProviderAdapter;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSet;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.MatchingEntitiesProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.SampleProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.SpacesProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.TableDataProviderFactory;
@@ -430,7 +431,7 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     public final String prepareExportMatchingEntities(
-            final TableExportCriteria<MatchingEntity> criteria)
+            final TableExportCriteria<TableModelRowWithObject<MatchingEntity>> criteria)
     {
         return prepareExportEntities(criteria);
     }
@@ -540,7 +541,7 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     public ResultSetWithEntityTypes<ExternalData> searchForDataSets(
-            RelatedDataSetCriteria criteria,
+            RelatedDataSetCriteria<? extends IEntityInformationHolder> criteria,
             final IResultSetConfig<String, ExternalData> resultSetConfig)
     {
         final String sessionToken = getSessionToken();
@@ -549,15 +550,21 @@ public final class CommonClientService extends AbstractClientService implements
                 commonServer, sessionToken, entities));
     }
 
-    private DataSetRelatedEntities extractRelatedEntities(RelatedDataSetCriteria criteria)
+    private <E extends IEntityInformationHolder> DataSetRelatedEntities extractRelatedEntities(
+            RelatedDataSetCriteria<E> criteria)
     {
-        List<? extends IEntityInformationHolder> entities = criteria.tryGetSelectedEntities();
-        if (entities == null)
+        List<TableModelRowWithObject<E>> rows = criteria.tryGetSelectedEntities();
+        if (rows == null)
         {
-            TableExportCriteria<? extends IEntityInformationHolder> displayedEntitiesCriteria =
+            TableExportCriteria<TableModelRowWithObject<E>> displayedEntitiesCriteria =
                     criteria.tryGetDisplayedEntities();
             assert displayedEntitiesCriteria != null : "displayedEntitiesCriteria is null";
-            entities = fetchCachedEntities(displayedEntitiesCriteria).extractOriginalObjects();
+            rows = fetchCachedEntities(displayedEntitiesCriteria).extractOriginalObjects();
+        }
+        List<E> entities = new ArrayList<E>();
+        for (TableModelRowWithObject<E> row : rows)
+        {
+            entities.add(row.getObjectOrNull());
         }
         return new DataSetRelatedEntities(entities);
     }
@@ -582,16 +589,21 @@ public final class CommonClientService extends AbstractClientService implements
                     });
     }
 
-    public final ResultSet<MatchingEntity> listMatchingEntities(
+    public final TypedTableResultSet<MatchingEntity> listMatchingEntities(
             final SearchableEntity searchableEntityOrNull, final String queryText,
             final boolean useWildcardSearchMode,
-            final IResultSetConfig<String, MatchingEntity> resultSetConfig)
+            final IResultSetConfig<String, TableModelRowWithObject<MatchingEntity>> resultSetConfig)
     {
-        final String sessionToken = getSessionToken();
-        final ch.systemsx.cisd.openbis.generic.shared.dto.SearchableEntity[] matchingEntities =
+        ch.systemsx.cisd.openbis.generic.shared.dto.SearchableEntity[] matchingEntities =
                 SearchableEntityTranslator.translate(searchableEntityOrNull);
-        return listEntities(resultSetConfig, new ListMatchingEntitiesOriginalDataProvider(
-                commonServer, sessionToken, matchingEntities, queryText, useWildcardSearchMode));
+        MatchingEntitiesProvider provider =
+                new MatchingEntitiesProvider(commonServer, getSessionToken(), matchingEntities,
+                        queryText, useWildcardSearchMode);
+        DataProviderAdapter<MatchingEntity> dataProvider =
+                new DataProviderAdapter<MatchingEntity>(provider);
+        ResultSet<TableModelRowWithObject<MatchingEntity>> resultSet =
+                listEntities(resultSetConfig, dataProvider);
+        return new TypedTableResultSet<MatchingEntity>(resultSet);
     }
 
     public ResultSet<EntityTypePropertyType<?>> listPropertyTypeAssignments(
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..55432068f1c8887cdfcc63b6a7416911934a38a4
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/MatchingEntitiesProvider.java
@@ -0,0 +1,80 @@
+/*
+ * 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.server.resultset;
+
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs.ENTITY_KIND;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs.ENTITY_TYPE;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs.IDENTIFIER;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs.MATCHING_FIELD;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs.MATCHING_TEXT;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs.REGISTRATOR;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SearchableEntity;
+import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class MatchingEntitiesProvider extends AbstractCommonTableModelProvider<MatchingEntity>
+{
+    private final SearchableEntity[] matchingEntities;
+    private final String queryText;
+    private final boolean useWildcardSearchMode;
+
+    public MatchingEntitiesProvider(ICommonServer commonServer, String sessionToken,
+            SearchableEntity[] matchingEntities, String queryText, boolean useWildcardSearchMode)
+    {
+        super(commonServer, sessionToken);
+        this.matchingEntities = matchingEntities;
+        this.queryText = queryText;
+        this.useWildcardSearchMode = useWildcardSearchMode;
+    }
+
+    @Override
+    protected TypedTableModel<MatchingEntity> createTableModel()
+    {
+        List<MatchingEntity> entities =
+            commonServer.listMatchingEntities(sessionToken, matchingEntities, queryText,
+                    useWildcardSearchMode);
+        TypedTableModelBuilder<MatchingEntity> builder = new TypedTableModelBuilder<MatchingEntity>();
+        builder.addColumn(ENTITY_KIND);
+        builder.addColumn(ENTITY_TYPE);
+        builder.addColumn(IDENTIFIER).withDefaultWidth(140);
+        builder.addColumn(REGISTRATOR);
+        builder.addColumn(MATCHING_FIELD).withDefaultWidth(140);
+        builder.addColumn(MATCHING_TEXT).withDefaultWidth(200);
+        for (MatchingEntity matchingEntity : entities)
+        {
+            builder.addRow(matchingEntity);
+            builder.column(ENTITY_KIND).addString(matchingEntity.getEntityKind().getDescription());
+            builder.column(ENTITY_TYPE).addString(matchingEntity.getEntityType().getCode());
+            builder.column(IDENTIFIER).addString(matchingEntity.getIdentifier());
+            builder.column(REGISTRATOR).addPerson(matchingEntity.getRegistrator());
+            builder.column(MATCHING_FIELD).addString(matchingEntity.getFieldDescription());
+            builder.column(MATCHING_TEXT).addString(matchingEntity.getTextFragment());
+        }
+        return builder.getModel();
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IEntityInformationHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IEntityInformationHolder.java
index fa040a1703f99fa9f262fd3d77963b9bce886d4a..818184320380c9d95f28a79d01165ee6fc5af216 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IEntityInformationHolder.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IEntityInformationHolder.java
@@ -25,7 +25,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
  * 
  * @author Piotr Buczek
  */
-public interface IEntityInformationHolder extends IIdAndCodeHolder
+public interface IEntityInformationHolder extends ISerializable, IIdAndCodeHolder
 {
     /**
      * Returns the entity type of this matching entity.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IRegistratorHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IRegistratorHolder.java
new file mode 100644
index 0000000000000000000000000000000000000000..1589dacff417dfbd597e18adad7de096b02ca9c7
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/IRegistratorHolder.java
@@ -0,0 +1,30 @@
+/*
+ * 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.shared.basic;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
+
+/**
+ * Interface of DTOs having a registrator attribute.
+ *
+ * @author Franz-Josef Elmer
+ */
+public interface IRegistratorHolder extends ISerializable
+{
+    public Person getRegistrator();
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractRegistrationHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractRegistrationHolder.java
index 3b456b44f89f7474dbc71a4e522cab643f4567f3..ef613642c0e8ab9676de422a745ad9cb5a45467b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractRegistrationHolder.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractRegistrationHolder.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
 import java.util.Date;
 
+import ch.systemsx.cisd.openbis.generic.shared.basic.IRegistratorHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
 
 /**
@@ -25,7 +26,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
  * 
  * @author Christian Ribeaud
  */
-public abstract class AbstractRegistrationHolder implements ISerializable
+public abstract class AbstractRegistrationHolder implements ISerializable, IRegistratorHolder
 {
     private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MatchingEntity.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MatchingEntity.java
index f23e617aa1ba6d260b66819ff060d57dcf90a5bc..6057524dec3028dc53e278129e4504fa40108643 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MatchingEntity.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MatchingEntity.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IRegistratorHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
 
 /**
@@ -25,7 +26,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
  * 
  * @author Christian Ribeaud
  */
-public final class MatchingEntity implements ISerializable, IEntityInformationHolderWithPermId
+public final class MatchingEntity implements ISerializable, IEntityInformationHolderWithPermId, IRegistratorHolder
 {
     private static final long serialVersionUID = 1L;
 
@@ -154,6 +155,7 @@ public final class MatchingEntity implements ISerializable, IEntityInformationHo
         final MatchingEntity entity = this;
         return new IEntityInformationHolderWithPermId()
             {
+                private static final long serialVersionUID = ServiceVersionHolder.VERSION;
                 public Long getId()
                 {
                     return entity.getId();
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 bef27edf6673ffca633cdec969d4712754ecad60..3480859a1216820911c5b04a75b3cc389c2a8268 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
@@ -59,6 +59,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKin
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.IndistinguishableProteinInfo;
 import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.dto.Peptide;
@@ -356,6 +357,7 @@ public class ProteinViewer extends AbstractViewerWithVerticalSplit<IEntityInform
 
     public static class DatasetInformationHolder implements IEntityInformationHolderWithIdentifier
     {
+        private static final long serialVersionUID = ServiceVersionHolder.VERSION;
         private final ProteinDetails proteinDetails;
 
         public DatasetInformationHolder(ProteinDetails proteinDetails)