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 f0cf89c75bea883335d0dfc07d6541fd7f32843f..17e324c1aad7d70c99543de0e5880e042361f5ab 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
@@ -282,7 +282,8 @@ public interface ICommonClientService extends IClientService
     /**
      * Like {@link #prepareExportSamples(TableExportCriteria)}, but for data set search hits.
      */
-    public String prepareExportDataSetSearchHits(TableExportCriteria<ExternalData> exportCriteria)
+    public String prepareExportDataSetSearchHits(
+            TableExportCriteria<TableModelRowWithObject<ExternalData>> exportCriteria)
             throws UserFailureException;
 
     /**
@@ -474,22 +475,24 @@ public interface ICommonClientService extends IClientService
     /**
      * For given <var>sampleId</var> returns corresponding list of {@link ExternalData}.
      */
-    public ResultSetWithEntityTypes<ExternalData> listSampleDataSets(final TechId sampleId,
-            DefaultResultSetConfig<String, ExternalData> criteria,
+    public TypedTableResultSet<ExternalData> listSampleDataSets(final TechId sampleId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
             final boolean showOnlyDirectlyConnected) throws UserFailureException;
 
     /**
      * For given <var>experimentId</var> returns corresponding list of {@link ExternalData}.
      */
-    public ResultSetWithEntityTypes<ExternalData> listExperimentDataSets(final TechId experimentId,
-            DefaultResultSetConfig<String, ExternalData> criteria) throws UserFailureException;
+    public TypedTableResultSet<ExternalData> listExperimentDataSets(final TechId experimentId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria)
+            throws UserFailureException;
 
     /**
      * For given <var>datasetId</var> in given relationship <var>role</var> returns corresponding
      * list of {@link ExternalData}.
      */
-    public ResultSetWithEntityTypes<ExternalData> listDataSetRelationships(TechId datasetId,
-            DataSetRelationshipRole role, DefaultResultSetConfig<String, ExternalData> criteria)
+    public TypedTableResultSet<ExternalData> listDataSetRelationships(TechId datasetId,
+            DataSetRelationshipRole role,
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria)
             throws UserFailureException;
 
     /**
@@ -596,17 +599,16 @@ public interface ICommonClientService extends IClientService
     /**
      * Returns {@link ExternalData} fulfilling given {@link DetailedSearchCriteria}.
      */
-    public ResultSetWithEntityTypes<ExternalData> searchForDataSets(
-            DetailedSearchCriteria criteria,
-            final IResultSetConfig<String, ExternalData> resultSetConfig)
+    public TypedTableResultSet<ExternalData> searchForDataSets(DetailedSearchCriteria criteria,
+            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig)
             throws UserFailureException;
 
     /**
      * Returns {@link ExternalData} fulfilling given {@link RelatedDataSetCriteria}.
      */
-    public ResultSetWithEntityTypes<ExternalData> searchForDataSets(
+    public TypedTableResultSet<ExternalData> searchForDataSets(
             RelatedDataSetCriteria<? extends IEntityInformationHolder> criteria,
-            final IResultSetConfig<String, ExternalData> resultSetConfig)
+            final IResultSetConfig<String, TableModelRowWithObject<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 c85e961b5499a2fc613a742ffff20c4bd112597e..b7e6c1b315d49a79b319f0c239d7f043b0eeb6ac 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
@@ -250,7 +250,8 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     /**
      * @see ICommonClientService#prepareExportDataSetSearchHits(TableExportCriteria)
      */
-    public void prepareExportDataSetSearchHits(TableExportCriteria<ExternalData> exportCriteria,
+    public void prepareExportDataSetSearchHits(
+            TableExportCriteria<TableModelRowWithObject<ExternalData>> exportCriteria,
             AsyncCallback<String> callback);
 
     /** @see ICommonClientService#listPropertyTypes(boolean) */
@@ -397,24 +398,24 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
      * @see ICommonClientService#listSampleDataSets(TechId, DefaultResultSetConfig, boolean)
      */
     public void listSampleDataSets(TechId sampleId,
-            DefaultResultSetConfig<String, ExternalData> criteria,
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
             boolean showOnlyDirectlyConnected,
-            AsyncCallback<ResultSetWithEntityTypes<ExternalData>> asyncCallback);
+            AsyncCallback<TypedTableResultSet<ExternalData>> asyncCallback);
 
     /**
      * @see ICommonClientService#listExperimentDataSets(TechId, DefaultResultSetConfig)
      */
     public void listExperimentDataSets(TechId experimentId,
-            DefaultResultSetConfig<String, ExternalData> criteria,
-            AsyncCallback<ResultSetWithEntityTypes<ExternalData>> asyncCallback);
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
+            AsyncCallback<TypedTableResultSet<ExternalData>> asyncCallback);
 
     /**
      * @see ICommonClientService#listDataSetRelationships(TechId, DataSetRelationshipRole,
      *      DefaultResultSetConfig)
      */
     public void listDataSetRelationships(TechId datasetId, DataSetRelationshipRole role,
-            DefaultResultSetConfig<String, ExternalData> resultSetConfig,
-            AsyncCallback<ResultSetWithEntityTypes<ExternalData>> callback);
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
+            AsyncCallback<TypedTableResultSet<ExternalData>> callback);
 
     /**
      * @see ICommonClientService#listSearchableEntities()
@@ -497,16 +498,16 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
      * @see ICommonClientService#searchForDataSets(DetailedSearchCriteria, IResultSetConfig)
      */
     public void searchForDataSets(DetailedSearchCriteria criteria,
-            final IResultSetConfig<String, ExternalData> resultSetConfig,
-            final AsyncCallback<ResultSetWithEntityTypes<ExternalData>> callback);
+            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
+            final AsyncCallback<TypedTableResultSet<ExternalData>> callback);
 
     /**
      * @see ICommonClientService#searchForDataSets(RelatedDataSetCriteria, IResultSetConfig)
      */
     public void searchForDataSets(
             RelatedDataSetCriteria<? extends IEntityInformationHolder> criteria,
-            final IResultSetConfig<String, ExternalData> resultSetConfig,
-            final AsyncCallback<ResultSetWithEntityTypes<ExternalData>> callback);
+            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
+            final AsyncCallback<TypedTableResultSet<ExternalData>> callback);
 
     /**
      * @see ICommonClientService#listMaterialTypes()
@@ -707,7 +708,8 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
             AsyncCallback<IEntityInformationHolderWithPermId> openEntityDetailsTabCallback);
 
     /**
-     * @see ICommonClientService#getTemplate(EntityKind, String, boolean, boolean, boolean, BatchOperationKind)
+     * @see ICommonClientService#getTemplate(EntityKind, String, boolean, boolean, boolean,
+     *      BatchOperationKind)
      */
     public void getTemplate(EntityKind kind, String type, boolean autoGenerate,
             boolean withExperiments, boolean withSpace, BatchOperationKind operationKind,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/DataSetSearchLocatorResolver.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/DataSetSearchLocatorResolver.java
index 9a594d635157ad2648473aaa9067d5509e4e4c11..fba084f5195dc8fc00537c8d15f407cea312ebc7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/DataSetSearchLocatorResolver.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/locator/DataSetSearchLocatorResolver.java
@@ -86,7 +86,7 @@ public class DataSetSearchLocatorResolver
         {
             IDisposableComponent browser =
                     DataSetSearchHitGrid.createWithInitialSearchCriteria(viewContext,
-                            searchCriteria);
+                            searchCriteria, false);
             return createTab(Dict.DATA_SET_SEARCH, browser);
         }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
index a8142e595397ef5c018d45a811161082d1ee647d..b2568a1966b90e61b618e70cfd91c12b6f59a620 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
@@ -16,8 +16,8 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
 
-import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.edit;
-
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 
@@ -35,107 +35,74 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.EntityGridModelFactory;
-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.specific.data.CommonExternalDataColDefKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractEntityBrowserGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.PersonRenderer;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractEntityGrid;
 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.GridUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IBrowserGridActionInvoker;
-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.ICellListenerAndLinkGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICriteriaProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.entity.PropertyTypesCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.entity.PropertyTypesCriteriaProvider;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.entity.PropertyTypesFilterUtil;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.TextToolItem;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.DatasetImageOverviewUtilities;
-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.IEntityInformationHolderWithPermId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
 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.EntityType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 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.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * @author Franz-Josef Elmer
  */
-public abstract class AbstractExternalDataGrid
-        extends
-        AbstractEntityBrowserGrid<ExternalData, BaseEntityModel<ExternalData>, PropertyTypesCriteria>
+public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<ExternalData>
 {
-    /** lists datasets and collects statistics about all datasets types */
-    abstract protected void listDatasets(
-            DefaultResultSetConfig<String, ExternalData> resultSetConfig,
-            AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>> callback);
-
     public static final String SHOW_DETAILS_BUTTON_ID_SUFFIX = "_show-details-button";
 
-    // Set of entity types which are currently shown in this grid.
-    // Used to decide which property columns should be shown.
-    // Note: content depends on the current grid content.
-    private Set<BasicEntityType> shownEntityTypesOrNull;
-
     private final ICriteriaProvider<PropertyTypesCriteria> criteriaProvider;
 
     protected AbstractExternalDataGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
             String browserId, String gridId, DisplayTypeIDGenerator displayTypeIDGenerator)
     {
-        super(viewContext, gridId, false, displayTypeIDGenerator);
+        super(viewContext, browserId, true, displayTypeIDGenerator);
         this.criteriaProvider = createCriteriaProvider();
         setId(browserId);
-        updateCriteriaProviderAndRefresh();
 
         extendBottomToolbar();
+        linkProject();
+    }
 
-        ICellListener<ExternalData> containerClickListener =
-                new OpenEntityDetailsTabCellClickListener()
+    private void linkProject()
+    {
+        registerListenerAndLinkGenerator(ExternalDataGridColumnIDs.PROJECT,
+                new ICellListenerAndLinkGenerator<ExternalData>()
                     {
-                        @Override
-                        protected IEntityInformationHolderWithPermId getEntity(ExternalData rowItem)
+                        public void handle(TableModelRowWithObject<ExternalData> rowItem,
+                                boolean specialKeyPressed)
                         {
-                            return rowItem.tryGetContainer();
+                            final Project project =
+                                    rowItem.getObjectOrNull().getExperiment().getProject();
+                            final String href = LinkExtractor.tryExtract(project);
+                            OpenEntityDetailsTabHelper.open(viewContext, project,
+                                    specialKeyPressed, href);
                         }
-                    };
-        registerLinkClickListenerFor(CommonExternalDataColDefKind.CONTAINER.id(),
-                containerClickListener);
 
-        ICellListener<ExternalData> experimentClickListener =
-                new OpenEntityDetailsTabCellClickListener()
-                    {
-                        @Override
-                        protected IEntityInformationHolderWithPermId getEntity(ExternalData rowItem)
-                        {
-                            return rowItem.getExperiment();
-                        }
-                    };
-        registerLinkClickListenerFor(CommonExternalDataColDefKind.EXPERIMENT.id(),
-                experimentClickListener);
-        registerLinkClickListenerFor(CommonExternalDataColDefKind.EXPERIMENT_IDENTIFIER.id(),
-                experimentClickListener);
-
-        ICellListener<ExternalData> sampleClickListener =
-                new OpenEntityDetailsTabCellClickListener()
-                    {
-                        @Override
-                        protected IEntityInformationHolderWithPermId getEntity(ExternalData rowItem)
+                        public String tryGetLink(ExternalData entity,
+                                ISerializableComparable comparableValue)
                         {
-                            return rowItem.getSample();
+                            final Experiment exp = entity.getExperiment();
+                            return exp == null ? null : LinkExtractor.tryExtract(exp.getProject());
                         }
-                    };
-        registerLinkClickListenerFor(CommonExternalDataColDefKind.SAMPLE.id(), sampleClickListener);
-        registerLinkClickListenerFor(CommonExternalDataColDefKind.SAMPLE_IDENTIFIER.id(),
-                sampleClickListener);
+                    });
     }
 
     // adds show, show-details and invalidate buttons
@@ -157,7 +124,8 @@ public abstract class AbstractExternalDataGrid
                         {
 
                             @Override
-                            protected Dialog createDialog(List<ExternalData> dataSets,
+                            protected Dialog createDialog(
+                                    List<TableModelRowWithObject<ExternalData>> dataSets,
                                     IBrowserGridActionInvoker invoker)
                             {
                                 return new DataSetListDeletionConfirmationDialog(viewContext,
@@ -174,7 +142,8 @@ public abstract class AbstractExternalDataGrid
                         new AbstractCreateDialogListener()
                             {
                                 @Override
-                                protected Dialog createDialog(List<ExternalData> dataSets,
+                                protected Dialog createDialog(
+                                        List<TableModelRowWithObject<ExternalData>> dataSets,
                                         IBrowserGridActionInvoker invoker)
                                 {
                                     return new DataSetUploadConfirmationDialog(dataSets,
@@ -197,7 +166,6 @@ public abstract class AbstractExternalDataGrid
         allowMultipleSelection();
     }
 
-    @Override
     protected ICriteriaProvider<PropertyTypesCriteria> getCriteriaProvider()
     {
         return criteriaProvider;
@@ -217,47 +185,15 @@ public abstract class AbstractExternalDataGrid
                 public PropertyTypesCriteria tryGetCriteria()
                 {
                     PropertyTypesCriteria propertyTypesCriteria = super.tryGetCriteria();
-                    return PropertyTypesFilterUtil.filterPropertyTypesForEntityTypes(
-                            propertyTypesCriteria, entityKind, shownEntityTypesOrNull);
+                    return propertyTypesCriteria;
                 }
             };
     }
 
     @Override
-    protected final void listEntities(DefaultResultSetConfig<String, ExternalData> resultSetConfig,
-            final AbstractAsyncCallback<ResultSet<ExternalData>> callback)
-    {
-        AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>> extendedCallback =
-                new AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>>(viewContext)
-                    {
-                        @Override
-                        protected void process(ResultSetWithEntityTypes<ExternalData> result)
-                        {
-                            shownEntityTypesOrNull = result.getAvailableEntityTypes();
-                            callback.onSuccess(result.getResultSet());
-                            refreshColumnsSettingsIfNecessary();
-                        }
-
-                        @Override
-                        public void finishOnFailure(Throwable caught)
-                        {
-                            callback.finishOnFailure(caught);
-                        }
-                    };
-        listDatasets(resultSetConfig, extendedCallback);
-    }
-
-    private abstract class OpenEntityDetailsTabCellClickListener implements
-            ICellListener<ExternalData>
+    protected String translateColumnIdToDictionaryKey(String columnID)
     {
-        protected abstract IEntityInformationHolderWithPermId getEntity(ExternalData rowItem);
-
-        public final void handle(ExternalData rowItem, boolean keyPressed)
-        {
-            final IEntityInformationHolderWithPermId entity = getEntity(rowItem);
-            new OpenEntityDetailsTabAction(entity, viewContext, keyPressed).execute();
-        }
-
+        return columnID.toLowerCase();
     }
 
     private final TextToolItem createArchivingMenu()
@@ -269,22 +205,23 @@ public abstract class AbstractExternalDataGrid
     public final static class SelectedAndDisplayedItems
     {
         // describes all items which are displayed in the grid (including all grid pages)
-        private final TableExportCriteria<ExternalData> displayedItemsConfig;
+        private final TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItemsConfig;
 
         // currently selected items
-        private final List<ExternalData> selectedItems;
+        private final List<TableModelRowWithObject<ExternalData>> selectedItems;
 
         private final int displayedItemsCount;
 
-        public SelectedAndDisplayedItems(List<ExternalData> selectedItems,
-                TableExportCriteria<ExternalData> displayedItemsConfig, int displayedItemsCount)
+        public SelectedAndDisplayedItems(List<TableModelRowWithObject<ExternalData>> selectedItems,
+                TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItemsConfig,
+                int displayedItemsCount)
         {
             this.displayedItemsConfig = displayedItemsConfig;
             this.selectedItems = selectedItems;
             this.displayedItemsCount = displayedItemsCount;
         }
 
-        public TableExportCriteria<ExternalData> getDisplayedItemsConfig()
+        public TableExportCriteria<TableModelRowWithObject<ExternalData>> getDisplayedItemsConfig()
         {
             return displayedItemsConfig;
         }
@@ -294,17 +231,31 @@ public abstract class AbstractExternalDataGrid
             return displayedItemsCount;
         }
 
-        public List<ExternalData> getSelectedItems()
+        public List<TableModelRowWithObject<ExternalData>> getSelectedItems()
         {
             return selectedItems;
         }
 
+        public List<ExternalData> getSelectedDataSets()
+        {
+            List<ExternalData> dataSets = new ArrayList<ExternalData>();
+            for (TableModelRowWithObject<ExternalData> item : selectedItems)
+            {
+                dataSets.add(item.getObjectOrNull());
+            }
+            return dataSets;
+        }
+
         public DisplayedOrSelectedDatasetCriteria createCriteria(boolean selected)
         {
             if (selected)
             {
-                List<ExternalData> items = getSelectedItems();
-                List<String> datasetCodes = Code.extractCodes(items);
+                List<TableModelRowWithObject<ExternalData>> items = getSelectedItems();
+                List<String> datasetCodes = new ArrayList<String>();
+                for (TableModelRowWithObject<ExternalData> row : items)
+                {
+                    datasetCodes.add(row.getObjectOrNull().getCode());
+                }
                 return DisplayedOrSelectedDatasetCriteria.createSelectedItems(datasetCodes);
             } else
             {
@@ -327,34 +278,15 @@ public abstract class AbstractExternalDataGrid
     }
 
     @Override
-    protected BaseEntityModel<ExternalData> createModel(GridRowModel<ExternalData> entity)
-    {
-        return getColumnsFactory().createModel(entity,
-                viewContext.getDisplaySettingsManager().getRealNumberFormatingParameters());
-    }
-
-    protected ColumnDefsAndConfigs<ExternalData> createColumnsSchema()
-    {
-        return getColumnsFactory().createColumnsSchema(viewContext, criteria.tryGetPropertyTypes(),
-                viewContext.getDisplaySettingsManager().getRealNumberFormatingParameters());
-    }
-
-    @Override
-    protected ColumnDefsAndConfigs<ExternalData> createColumnsDefinition()
+    protected ColumnDefsAndConfigs<TableModelRowWithObject<ExternalData>> createColumnsDefinition()
     {
-        ColumnDefsAndConfigs<ExternalData> schema = createColumnsSchema();
-        GridCellRenderer<BaseEntityModel<?>> linkRenderer = createInternalLinkCellRenderer();
-        schema.setGridCellRendererFor(CommonExternalDataColDefKind.CONTAINER.id(), linkRenderer);
-        schema.setGridCellRendererFor(CommonExternalDataColDefKind.SAMPLE.id(), linkRenderer);
-        schema.setGridCellRendererFor(CommonExternalDataColDefKind.SAMPLE_IDENTIFIER.id(),
-                linkRenderer);
-        schema.setGridCellRendererFor(CommonExternalDataColDefKind.EXPERIMENT.id(), linkRenderer);
-        schema.setGridCellRendererFor(CommonExternalDataColDefKind.EXPERIMENT_IDENTIFIER.id(),
-                linkRenderer);
-        schema.setGridCellRendererFor(CommonExternalDataColDefKind.PROJECT.id(), linkRenderer);
-        schema.setGridCellRendererFor(CommonExternalDataColDefKind.SHOW_DETAILS_LINK.id(),
+        ColumnDefsAndConfigs<TableModelRowWithObject<ExternalData>> schema =
+                super.createColumnsDefinition();
+        schema.setGridCellRendererFor(ExternalDataGridColumnIDs.REGISTRATOR,
+                PersonRenderer.REGISTRATOR_RENDERER);
+        schema.setGridCellRendererFor(ExternalDataGridColumnIDs.SHOW_DETAILS_LINK,
                 createShowDetailsLinkCellRenderer());
-        schema.setGridCellRendererFor(CommonExternalDataColDefKind.OVERVIEW.id(),
+        schema.setGridCellRendererFor(ExternalDataGridColumnIDs.OVERVIEW,
                 createOverviewCellRenderer());
         return schema;
     }
@@ -405,63 +337,32 @@ public abstract class AbstractExternalDataGrid
         return false;
     }
 
-    private EntityGridModelFactory<ExternalData> getColumnsFactory()
-    {
-        return new EntityGridModelFactory<ExternalData>(viewContext, getStaticColumnsDefinition());
-    }
-
-    @Override
-    protected IColumnDefinitionKind<ExternalData>[] getStaticColumnsDefinition()
-    {
-        return CommonExternalDataColDefKind.values();
-    }
-
     @Override
-    protected List<IColumnDefinition<ExternalData>> getInitialFilters()
+    protected List<String> getColumnIdsOfFilters()
     {
-        return asColumnFilters(new CommonExternalDataColDefKind[]
-            { CommonExternalDataColDefKind.CODE, CommonExternalDataColDefKind.FILE_FORMAT_TYPE });
+        return Arrays.asList(ExternalDataGridColumnIDs.CODE,
+                ExternalDataGridColumnIDs.FILE_FORMAT_TYPE);
     }
 
     @Override
-    protected void prepareExportEntities(TableExportCriteria<ExternalData> exportCriteria,
+    protected void prepareExportEntities(
+            TableExportCriteria<TableModelRowWithObject<ExternalData>> exportCriteria,
             AbstractAsyncCallback<String> callback)
     {
         viewContext.getService().prepareExportDataSetSearchHits(exportCriteria, callback);
     }
 
     @Override
-    public Set<DatabaseModificationKind> getGridRelevantModifications()
+    public DatabaseModificationKind[] getRelevantModifications()
     {
-        final Set<DatabaseModificationKind> relevantMods =
-                getGridRelevantModifications(ObjectKind.DATA_SET);
-        relevantMods.add(edit(ObjectKind.EXPERIMENT));
-        relevantMods.add(edit(ObjectKind.SAMPLE));
-        DatabaseModificationKind.addAny(relevantMods, ObjectKind.VOCABULARY_TERM);
-        return relevantMods;
-    }
-
-    @Override
-    protected boolean hasColumnsDefinitionChanged(PropertyTypesCriteria newCriteria)
-    {
-        List<PropertyType> newPropertyTypes = newCriteria.tryGetPropertyTypes();
-        List<PropertyType> prevPropertyTypes =
-                (criteria == null ? null : criteria.tryGetPropertyTypes());
-        if (newPropertyTypes == null)
-        {
-            return false; // nothing chosen
-        }
-        if (prevPropertyTypes == null)
-        {
-            return true; // first selection
-        }
-        return newPropertyTypes.equals(prevPropertyTypes) == false;
+        return GridUtils.getRelevantModifications(ObjectKind.DATA_SET, getCriteriaProvider());
     }
 
     @Override
-    protected void showEntityViewer(ExternalData dataSet, boolean editMode, boolean inBackground)
+    protected void showEntityViewer(TableModelRowWithObject<ExternalData> dataSet,
+            boolean editMode, boolean inBackground)
     {
-        showEntityInformationHolderViewer(dataSet, editMode, inBackground);
+        showEntityInformationHolderViewer(dataSet.getObjectOrNull(), editMode, inBackground);
     }
 
     @Override
@@ -469,10 +370,4 @@ public abstract class AbstractExternalDataGrid
     {
         return EntityKind.DATA_SET;
     }
-
-    @Override
-    protected EntityType tryToGetEntityType()
-    {
-        return null;
-    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ComputationData.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ComputationData.java
index ff13463a256b1ff0cd02a71f50d112a1a2583165..4c4e316911b3d7bd7aaa4a9710aa7759d2387513 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ComputationData.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ComputationData.java
@@ -16,12 +16,14 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
 
+import java.util.ArrayList;
 import java.util.List;
 
 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.SelectedOrAllDataSetsRadioProvider.ISelectedDataSetsProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 class ComputationData implements ISelectedDataSetsProvider
 {
@@ -53,6 +55,13 @@ class ComputationData implements ISelectedDataSetsProvider
 
     public List<ExternalData> getSelectedDataSets()
     {
-        return selectedAndDisplayedItems.getSelectedItems();
+        List<TableModelRowWithObject<ExternalData>> selectedItems =
+                selectedAndDisplayedItems.getSelectedItems();
+        List<ExternalData> dataSets = new ArrayList<ExternalData>();
+        for (TableModelRowWithObject<ExternalData> item : selectedItems)
+        {
+            dataSets.add(item.getObjectOrNull());
+        }
+        return dataSets;
     }
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetArchivingMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetArchivingMenu.java
index 0782aedd519781b75c4270ff205bd7af823dfe52..fe32086bd072a979d8cf04a60a4579923eea184b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetArchivingMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetArchivingMenu.java
@@ -170,7 +170,8 @@ public class DataSetArchivingMenu extends TextToolItem
 
         public List<ExternalData> getSelectedDataSets()
         {
-            return selectedAndDisplayedItems.getSelectedItems();
+            List<ExternalData> selectedDataSets = selectedAndDisplayedItems.getSelectedDataSets();
+            return selectedDataSets;
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
index 54e15734d3af063a418e7ca7a87c8d2febe3cd29..89deacdfaf4bae4ed36ac2494e6dbb393b1c3255 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
@@ -32,14 +32,15 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelecte
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 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.TableModelRowWithObject;
 
 // TODO extend AbstractDataListTrashDeletionConfirmationDialog when trash is working properly
 public final class DataSetListDeletionConfirmationDialog extends
-        AbstractDataListDeletionConfirmationDialog<ExternalData>
+        AbstractDataListDeletionConfirmationDialog<TableModelRowWithObject<ExternalData>>
 {
     private final SelectedAndDisplayedItems selectedAndDisplayedItemsOrNull;
 
-    private final ExternalData singleData;
+    private final TableModelRowWithObject<ExternalData> singleData;
 
     protected CheckBox force;
 
@@ -55,7 +56,7 @@ public final class DataSetListDeletionConfirmationDialog extends
 
     public DataSetListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext,
-            AsyncCallback<Void> deletionCallback, ExternalData data)
+            AsyncCallback<Void> deletionCallback, TableModelRowWithObject<ExternalData> data)
     {
         super(viewContext, Collections.singletonList(data), deletionCallback);
         this.singleData = data;
@@ -80,9 +81,9 @@ public final class DataSetListDeletionConfirmationDialog extends
                     deletionType, isTrashEnabled() ? false : force.getValue(), deletionCallback);
         } else
         {
-            getViewContext().getCommonService().deleteDataSet(singleData.getCode(),
-                    reason.getValue(), deletionType, isTrashEnabled() ? false : force.getValue(),
-                    deletionCallback);
+            getViewContext().getCommonService().deleteDataSet(
+                    singleData.getObjectOrNull().getCode(), reason.getValue(), deletionType,
+                    isTrashEnabled() ? false : force.getValue(), deletionCallback);
         }
     }
 
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 cdab9fb0c9ebb28faf96ced8a700d55affe0ae3b..f7db92b20141ade20540703461fdc973598ada31 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
@@ -34,8 +34,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericCon
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ShowResultSetCutInfo;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 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.ICellListenerAndLinkGenerator;
 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;
@@ -43,12 +44,13 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search.DetailedSearchWindow;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search.IDetailedSearchHitGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 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.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * Grid with detailed data set search results.
@@ -68,21 +70,21 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
     public static IDisposableComponent create(
             final IViewContext<ICommonClientServiceAsync> viewContext)
     {
-        return create(viewContext, null);
+        return create(viewContext, null, false);
     }
 
-    public static DisposableEntityChooser<ExternalData> createWithInitialSearchCriteria(
+    public static DisposableEntityChooser<TableModelRowWithObject<ExternalData>> createWithInitialSearchCriteria(
             final IViewContext<ICommonClientServiceAsync> viewContext,
-            DetailedSearchCriteria searchCriteria)
+            DetailedSearchCriteria searchCriteria, boolean forChooser)
     {
-        return create(viewContext, searchCriteria);
+        return create(viewContext, searchCriteria, forChooser);
     }
 
-    private static DisposableEntityChooser<ExternalData> create(
+    private static DisposableEntityChooser<TableModelRowWithObject<ExternalData>> create(
             final IViewContext<ICommonClientServiceAsync> viewContext,
-            DetailedSearchCriteria searchCriteriaOrNull)
+            DetailedSearchCriteria searchCriteriaOrNull, boolean forChooser)
     {
-        DataSetSearchHitGrid grid = new DataSetSearchHitGrid(viewContext);
+        DataSetSearchHitGrid grid = new DataSetSearchHitGrid(viewContext, forChooser);
         final DetailedSearchWindow searchWindow =
                 new DetailedSearchWindow(viewContext, EntityKind.DATA_SET);
 
@@ -157,16 +159,50 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
 
     private DetailedSearchCriteria chosenSearchCriteria;
 
-    private DataSetSearchHitGrid(final IViewContext<ICommonClientServiceAsync> viewContext)
+    private final boolean forChooser;
+
+    private DataSetSearchHitGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
+            boolean forChooser)
     {
         super(viewContext, BROWSER_ID, GRID_ID, DisplayTypeIDGenerator.DATA_SET_SEARCH_RESULT_GRID);
+        this.forChooser = forChooser;
+    }
+
+    @Override
+    protected ICellListenerAndLinkGenerator<ExternalData> tryGetCellListenerAndLinkGenerator(
+            String columnId)
+    {
+        if (forChooser)
+        {
+            return null;
+        }
+        return super.tryGetCellListenerAndLinkGenerator(columnId);
+    }
+
+    @Override
+    protected boolean isEditable(BaseEntityModel<TableModelRowWithObject<ExternalData>> model,
+            String columnID)
+    {
+        return forChooser ? false : super.isEditable(model, columnID);
+    }
+
+    @Override
+    protected void showNonEditableTableCellMessage(
+            BaseEntityModel<TableModelRowWithObject<ExternalData>> model, String columnID)
+    {
+        if (forChooser)
+        {
+            return;
+        }
+        super.showNonEditableTableCellMessage(model, columnID);
     }
 
     @Override
-    protected void listDatasets(DefaultResultSetConfig<String, ExternalData> resultSetConfig,
-            final AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>> callback)
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
     {
-        callback.addOnSuccessAction(new ShowResultSetCutInfo<ResultSetWithEntityTypes<ExternalData>>(
+        callback.addOnSuccessAction(new ShowResultSetCutInfo<TypedTableResultSet<ExternalData>>(
                 viewContext));
         viewContext.getService().searchForDataSets(chosenSearchCriteria, resultSetConfig, callback);
     }
@@ -174,10 +210,6 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
     public void refresh(DetailedSearchCriteria newCriteria, List<PropertyType> propertyTypes)
     {
         chosenSearchCriteria = newCriteria;
-        if (criteria != null)
-        {
-            criteria.setPropertyTypes(propertyTypes);
-        }
         refresh();
     }
 
@@ -191,16 +223,8 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
         super.refresh();
     }
 
-    @Override
-    protected ColumnDefsAndConfigs<ExternalData> createColumnsSchema()
-    {
-        List<PropertyType> propertyTypes = criteria == null ? null : criteria.tryGetPropertyTypes();
-        return DataSetSearchHitModel.createColumnsSchema(viewContext, propertyTypes, viewContext
-                .getDisplaySettingsManager().getRealNumberFormatingParameters());
-    }
-
     /** @return this grid as a disposable component with a specified toolbar at the top. */
-    private DisposableEntityChooser<ExternalData> asDisposableWithToolbar(
+    private DisposableEntityChooser<TableModelRowWithObject<ExternalData>> asDisposableWithToolbar(
             final LayoutContainerWithDisposableComponent containerHolder,
             final IDisposableComponent toolbar)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitModel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitModel.java
deleted file mode 100644
index a3ad80b35e60cc6a2b0314767c4d56ed565ecd46..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitModel.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2009 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.EntityGridModelFactory;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.PropertyTypeRenderer;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionUI;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.data.CommonExternalDataColDefKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.data.DataSetPropertyColDef;
-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.entity.PropertyTypesFilterUtil;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters;
-
-/**
- * @author Tomasz Pylak
- */
-public class DataSetSearchHitModel extends BaseEntityModel<ExternalData>
-{
-    private static final long serialVersionUID = 1L;
-
-    private static final int PROPERTY_COLUMN_WIDTH = 150;
-
-    public DataSetSearchHitModel(final GridRowModel<ExternalData> entity)
-    {
-        super(entity, createColumnsSchema(entity));
-    }
-
-    // here we create the columns definition having just one table row. We need them only to render
-    // column values (headers have been already created), so no message provider is needed.
-    private static List<IColumnDefinitionUI<ExternalData>> createColumnsSchema(
-            GridRowModel<ExternalData> entity)
-    {
-        List<IColumnDefinitionUI<ExternalData>> list = createCommonColumnsSchema(null);
-
-        List<IEntityProperty> properties =
-                DataSetPropertyColDef.getDataSetProperties(entity.getOriginalObject());
-        List<PropertyType> datasetProperties = extractPropertyTypes(properties);
-        list.addAll(createDatasetPropertyTypeColDefs(datasetProperties));
-        return list;
-    }
-
-    private static List<IColumnDefinitionUI<ExternalData>> createDatasetPropertyTypeColDefs(
-            List<PropertyType> propertyTypes)
-    {
-        List<IColumnDefinitionUI<ExternalData>> list = createEmptyList();
-        for (PropertyType prop : propertyTypes)
-        {
-            list.add(createDatasetPropertyTypeColDef(prop, propertyTypes));
-        }
-        return list;
-    }
-
-    private static ArrayList<IColumnDefinitionUI<ExternalData>> createEmptyList()
-    {
-        return new ArrayList<IColumnDefinitionUI<ExternalData>>();
-    }
-
-    private static List<PropertyType> extractPropertyTypes(
-            List<? extends IEntityProperty> properties)
-    {
-        List<PropertyType> propertyTypes = new ArrayList<PropertyType>();
-        for (IEntityProperty prop : properties)
-        {
-            PropertyType propertyType = prop.getPropertyType();
-            propertyTypes.add(propertyType);
-        }
-        return propertyTypes;
-    }
-
-    public static ColumnDefsAndConfigs<ExternalData> createColumnsSchema(
-            IViewContext<?> viewContext, List<PropertyType> mergedPropertyTypesOrNull,
-            RealNumberFormatingParameters realNumberFormatingParameters)
-    {
-        List<IColumnDefinitionUI<ExternalData>> commonColumnsSchema =
-                createCommonColumnsSchema(viewContext);
-        ColumnDefsAndConfigs<ExternalData> columns =
-                ColumnDefsAndConfigs.create(commonColumnsSchema, viewContext);
-
-        if (mergedPropertyTypesOrNull != null)
-        {
-            List<PropertyType> datasetProperties =
-                    PropertyTypesFilterUtil.filterDataSetPropertyTypes(mergedPropertyTypesOrNull);
-            EntityGridModelFactory.createPropertyColumnsSchema(columns, datasetProperties,
-                    realNumberFormatingParameters, viewContext);
-        }
-        return columns;
-    }
-
-    private static IColumnDefinitionUI<ExternalData> createDatasetPropertyTypeColDef(
-            PropertyType propertyType, List<PropertyType> propertyTypes)
-    {
-        String label = PropertyTypeRenderer.getDisplayName(propertyType, propertyTypes);
-        return new DataSetPropertyColDef(propertyType, true, PROPERTY_COLUMN_WIDTH, label);
-    }
-
-    private static List<IColumnDefinitionUI<ExternalData>> createCommonColumnsSchema(
-            IMessageProvider msgProviderOrNull)
-    {
-        return createColumnsDefinition(CommonExternalDataColDefKind.values(), msgProviderOrNull);
-    }
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java
index 314d68aa152449c49d675733d0fe65191ea1ee17..65183c3aaf106d42772b7a7851ebe14a5c9eff52 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java
@@ -38,12 +38,13 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DataSetUploadParam
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * @author Franz-Josef Elmer
  */
 public final class DataSetUploadConfirmationDialog extends
-        AbstractDataConfirmationDialog<List<ExternalData>>
+        AbstractDataConfirmationDialog<List<TableModelRowWithObject<ExternalData>>>
 {
     private static final int FIELD_WIDTH_IN_UPLOAD_DIALOG = 200;
 
@@ -67,7 +68,7 @@ public final class DataSetUploadConfirmationDialog extends
 
     private Radio uploadSelectedRadio;
 
-    public DataSetUploadConfirmationDialog(List<ExternalData> dataSets,
+    public DataSetUploadConfirmationDialog(List<TableModelRowWithObject<ExternalData>> dataSets,
             IDelegatedActionWithResult<SelectedAndDisplayedItems> selectedAndDisplayedItemsAction,
             int displayedItemsCount, IViewContext<?> viewContext)
     {
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 c291544dfc02a4a6dbd200357fec39abb14d5e74..e02449cb59d32673abd7fff3ae6e4b309767226e 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
@@ -17,22 +17,18 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
 
-import java.util.List;
-
 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.GenericConstants;
 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.grid.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 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.ResultSetWithEntityTypes;
-import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 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;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * Grid with data sets related with specified entities.
@@ -65,8 +61,9 @@ public class RelatedDataSetGrid extends AbstractExternalDataGrid
     }
 
     @Override
-    protected void listDatasets(DefaultResultSetConfig<String, ExternalData> resultSetConfig,
-            final AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>> callback)
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
     {
         viewContext.getService().searchForDataSets(relatedCriteria, resultSetConfig, callback);
     }
@@ -81,18 +78,4 @@ public class RelatedDataSetGrid extends AbstractExternalDataGrid
         super.refresh();
     }
 
-    @Override
-    protected DataSetSearchHitModel createModel(GridRowModel<ExternalData> entity)
-    {
-        return new DataSetSearchHitModel(entity);
-    }
-
-    @Override
-    protected ColumnDefsAndConfigs<ExternalData> createColumnsSchema()
-    {
-        List<PropertyType> propertyTypes = criteria == null ? null : criteria.tryGetPropertyTypes();
-        return DataSetSearchHitModel.createColumnsSchema(viewContext, propertyTypes, viewContext
-                .getDisplaySettingsManager().getRealNumberFormatingParameters());
-    }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
index b0be00f25efd4c28d5ad691fb03a28f038d510fe..1e9c4d7b2c1193aee69e5ad29e6abc80eb88591a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
@@ -36,7 +36,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 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.renderer.LinkRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.PersonRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.DisplayedAndSelectedEntities;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
@@ -334,8 +333,7 @@ public class ExperimentBrowserGrid extends AbstractEntityGrid<Experiment>
         schema.setGridCellRendererFor(ExperimentBrowserGridColumnIDs.REGISTRATOR,
                 PersonRenderer.REGISTRATOR_RENDERER);
         schema.setGridCellRendererFor(ExperimentBrowserGridColumnIDs.SHOW_DETAILS_LINK,
-                LinkRenderer.createExternalLinkRenderer(viewContext
-                        .getMessage(Dict.SHOW_DETAILS_LINK_TEXT_VALUE)));
+                createShowDetailsLinkCellRenderer());
         return schema;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/DataSetChooserField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/DataSetChooserField.java
index 190447a8dc1491ed4170862db39cb73793cbfb33..bb4e7eb8c8003e00a0221a13726092415fbafe56 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/DataSetChooserField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/DataSetChooserField.java
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField;
 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.SearchCriteriaConnection;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * A field for selecting a data set from a list.
@@ -69,10 +70,19 @@ public class DataSetChooserField extends ChosenEntitySetter<ExternalData>
                                 .getAttributeFieldKind(EntityKind.DATA_SET, "CODE")), "*");
         criterionList.add(searchCriterion);
         searchCriteria.setCriteria(criterionList);
-        DisposableEntityChooser<ExternalData> browser =
-                DataSetSearchHitGrid.createWithInitialSearchCriteria(viewContext, searchCriteria);
-        new EntityChooserDialog<ExternalData>(browser, field, "Choose data set", viewContext)
-                .show();
+        DisposableEntityChooser<TableModelRowWithObject<ExternalData>> browser =
+                DataSetSearchHitGrid.createWithInitialSearchCriteria(viewContext, searchCriteria,
+                        true);
+        new EntityChooserDialog<TableModelRowWithObject<ExternalData>>(browser,
+                new IChosenEntitySetter<TableModelRowWithObject<ExternalData>>()
+                    {
+
+                        public void setChosenEntity(
+                                TableModelRowWithObject<ExternalData> entityOrNull)
+                        {
+                            field.setChosenEntity(entityOrNull.getObjectOrNull());
+                        }
+                    }, "Choose data set", viewContext).show();
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractEntityGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractEntityGrid.java
index e7c23c7426608b962e29f174642c89d912777fe1..514921e53dc9528d4515087b4944be250085ac38 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractEntityGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractEntityGrid.java
@@ -19,10 +19,14 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid;
 import java.util.Arrays;
 import java.util.List;
 
+import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
+
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.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;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.EntityPropertyUpdates;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleGridColumnIDs;
@@ -99,4 +103,10 @@ public abstract class AbstractEntityGrid<E extends IEntityInformationHolderWithP
         showEntityInformationHolderViewer(row.getObjectOrNull(), editMode, inBackground);
     }
 
+    protected final GridCellRenderer<BaseEntityModel<?>> createShowDetailsLinkCellRenderer()
+    {
+        return LinkRenderer.createExternalLinkRenderer(viewContext
+                .getMessage(Dict.SHOW_DETAILS_LINK_TEXT_VALUE));
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
index 15be6a785c84b8fdee9557c518fa319d7e7d5a17..f38a116c8c29c539d2f0dd9a61462807d9575a9c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
@@ -25,7 +25,6 @@ import com.extjs.gxt.ui.client.event.ButtonEvent;
 import com.extjs.gxt.ui.client.event.SelectionListener;
 import com.extjs.gxt.ui.client.widget.Dialog;
 import com.extjs.gxt.ui.client.widget.button.Button;
-import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -39,7 +38,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.SampleTypeDisplayID;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.PersonRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.DisplayedAndSelectedEntities;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor;
@@ -410,12 +408,6 @@ public class SampleBrowserGrid extends AbstractEntityGrid<Sample>
         return definitions;
     }
 
-    protected final GridCellRenderer<BaseEntityModel<?>> createShowDetailsLinkCellRenderer()
-    {
-        return LinkRenderer.createExternalLinkRenderer(viewContext
-                .getMessage(Dict.SHOW_DETAILS_LINK_TEXT_VALUE));
-    }
-
     protected boolean isPropertyEditable(EntityType entityType,
             String propertyColumnNameWithoutPrefix)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DisplayedOrSelectedDatasetCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DisplayedOrSelectedDatasetCriteria.java
index 0b80aa828ed27580892ba7fe90e99a2d948e963f..40cae294b6dfe1ee31ca85eaceb967ed5c521c63 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DisplayedOrSelectedDatasetCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DisplayedOrSelectedDatasetCriteria.java
@@ -21,6 +21,7 @@ import java.util.List;
 import com.google.gwt.user.client.rpc.IsSerializable;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * Defines a set of datasets by either enumerating their codes or providing the grid configuration
@@ -31,12 +32,12 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 public final class DisplayedOrSelectedDatasetCriteria implements IsSerializable
 {
 
-    private TableExportCriteria<ExternalData> displayedItemsOrNull;
+    private TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItemsOrNull;
 
     private List<String> selectedDatasetCodesOrNull;
 
     public static DisplayedOrSelectedDatasetCriteria createDisplayedItems(
-            TableExportCriteria<ExternalData> displayedItems)
+            TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItems)
     {
         return new DisplayedOrSelectedDatasetCriteria(displayedItems, null);
     }
@@ -47,7 +48,7 @@ public final class DisplayedOrSelectedDatasetCriteria implements IsSerializable
     }
 
     private DisplayedOrSelectedDatasetCriteria(
-            TableExportCriteria<ExternalData> displayedItemsOrNull,
+            TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItemsOrNull,
             List<String> selectedDatasetCodesOrNull)
     {
         assert (displayedItemsOrNull == null) != (selectedDatasetCodesOrNull == null) : "Exactly one arg must be null and one non-null";
@@ -55,7 +56,7 @@ public final class DisplayedOrSelectedDatasetCriteria implements IsSerializable
         this.selectedDatasetCodesOrNull = selectedDatasetCodesOrNull;
     }
 
-    public TableExportCriteria<ExternalData> tryGetDisplayedItems()
+    public TableExportCriteria<TableModelRowWithObject<ExternalData>> tryGetDisplayedItems()
     {
         return displayedItemsOrNull;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
index 8b4960ee139066cc3ad433a0943d2a864fc536a6..2b3355dbdfba19cd9588d479dc609242376aca21 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
@@ -25,7 +25,7 @@ public class ExternalDataGridColumnIDs
 
     public static final String DATA_SET_TYPE = "DATA_SET_TYPE";
 
-    public static final String CONTAINER_DATA_SET = "CONTAINER_DATA_SET";
+    public static final String CONTAINER_DATASET = "CONTAINER_DATASET";
 
     public static final String ORDER_IN_CONTAINER = "ORDER_IN_CONTAINER";
 
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 562edb14791b99e333892979d3c78be5aeab2735..8d8fdf3e313572310ad23982199db1253c2eb81b 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
@@ -68,6 +68,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableModelReferenc
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.InvalidSessionException;
 import ch.systemsx.cisd.openbis.generic.client.web.server.calculator.ITableDataProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AbstractExternalDataProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AttachmentVersionsProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.AuthorizationGroupProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.CacheManager;
@@ -490,23 +491,35 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(provider, criteria);
     }
 
-    public ResultSetWithEntityTypes<ExternalData> searchForDataSets(
-            DetailedSearchCriteria criteria,
-            final IResultSetConfig<String, ExternalData> resultSetConfig)
+    public TypedTableResultSet<ExternalData> searchForDataSets(
+            final DetailedSearchCriteria criteria,
+            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig)
     {
         final String sessionToken = getSessionToken();
-        return listEntitiesWithTypes(resultSetConfig, new ListDataSetSearchOriginalDataProvider(
-                commonServer, sessionToken, criteria));
+        return listEntities(new AbstractExternalDataProvider(commonServer, sessionToken)
+            {
+                @Override
+                protected List<ExternalData> getDataSets()
+                {
+                    return commonServer.searchForDataSets(sessionToken, criteria);
+                }
+            }, resultSetConfig);
     }
 
-    public ResultSetWithEntityTypes<ExternalData> searchForDataSets(
+    public TypedTableResultSet<ExternalData> searchForDataSets(
             RelatedDataSetCriteria<? extends IEntityInformationHolder> criteria,
-            final IResultSetConfig<String, ExternalData> resultSetConfig)
+            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig)
     {
         final String sessionToken = getSessionToken();
-        DataSetRelatedEntities entities = extractRelatedEntities(criteria);
-        return listEntitiesWithTypes(resultSetConfig, new ListRelatedDataSetOriginalDataProvider(
-                commonServer, sessionToken, entities));
+        final DataSetRelatedEntities entities = extractRelatedEntities(criteria);
+        return listEntities(new AbstractExternalDataProvider(commonServer, sessionToken)
+            {
+                @Override
+                protected List<ExternalData> getDataSets()
+                {
+                    return commonServer.listRelatedDataSets(sessionToken, entities);
+                }
+            }, resultSetConfig);
     }
 
     private <E extends IEntityInformationHolder> DataSetRelatedEntities extractRelatedEntities(
@@ -558,7 +571,8 @@ public final class CommonClientService extends AbstractClientService implements
     public TypedTableResultSet<EntityTypePropertyType<?>> listPropertyTypeAssignments(
             DefaultResultSetConfig<String, TableModelRowWithObject<EntityTypePropertyType<?>>> criteria)
     {
-        return listEntities(new EntityTypePropertyTypeProvider(commonServer, getSessionToken()), criteria);
+        return listEntities(new EntityTypePropertyTypeProvider(commonServer, getSessionToken()),
+                criteria);
     }
 
     public TypedTableResultSet<Space> listGroups(
@@ -696,65 +710,49 @@ public final class CommonClientService extends AbstractClientService implements
         return listEntities(provider, criteria);
     }
 
-    public ResultSetWithEntityTypes<ExternalData> listSampleDataSets(final TechId sampleId,
-            DefaultResultSetConfig<String, ExternalData> criteria,
+    public TypedTableResultSet<ExternalData> listSampleDataSets(final TechId sampleId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
             final boolean showOnlyDirectlyConnected)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
-        return listEntitiesWithTypes(criteria,
-                new AbstractOriginalDataProviderWithoutHeaders<ExternalData>()
-                    {
-                        @Override
-                        public List<ExternalData> getFullOriginalData() throws UserFailureException
-                        {
-                            final String sessionToken = getSessionToken();
-                            final List<ExternalData> externalData =
-                                    commonServer.listSampleExternalData(sessionToken, sampleId,
-                                            showOnlyDirectlyConnected);
-                            return externalData;
-                        }
-                    });
+        return listEntities(new AbstractExternalDataProvider(commonServer, getSessionToken())
+            {
+                @Override
+                protected List<ExternalData> getDataSets()
+                {
+                    return commonServer.listSampleExternalData(sessionToken, sampleId,
+                            showOnlyDirectlyConnected);
+                }
+            }, criteria);
     }
 
-    public ResultSetWithEntityTypes<ExternalData> listExperimentDataSets(final TechId experimentId,
-            DefaultResultSetConfig<String, ExternalData> criteria)
+    public TypedTableResultSet<ExternalData> listExperimentDataSets(final TechId experimentId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
-        return listEntitiesWithTypes(criteria,
-                new AbstractOriginalDataProviderWithoutHeaders<ExternalData>()
-                    {
-
-                        @Override
-                        public List<ExternalData> getFullOriginalData() throws UserFailureException
-                        {
-                            final String sessionToken = getSessionToken();
-                            final List<ExternalData> externalData =
-                                    commonServer.listExperimentExternalData(sessionToken,
-                                            experimentId);
-                            return externalData;
-                        }
-
-                    });
+        return listEntities(new AbstractExternalDataProvider(commonServer, getSessionToken())
+            {
+                @Override
+                protected List<ExternalData> getDataSets()
+                {
+                    return commonServer.listExperimentExternalData(sessionToken, experimentId);
+                }
+            }, criteria);
     }
 
-    public ResultSetWithEntityTypes<ExternalData> listDataSetRelationships(final TechId datasetId,
+    public TypedTableResultSet<ExternalData> listDataSetRelationships(final TechId datasetId,
             final DataSetRelationshipRole role,
-            final DefaultResultSetConfig<String, ExternalData> criteria)
+            final DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
-        return listEntitiesWithTypes(criteria,
-                new AbstractOriginalDataProviderWithoutHeaders<ExternalData>()
-                    {
-                        @Override
-                        public List<ExternalData> getFullOriginalData() throws UserFailureException
-                        {
-                            final String sessionToken = getSessionToken();
-                            final List<ExternalData> externalData =
-                                    commonServer.listDataSetRelationships(sessionToken, datasetId,
-                                            role);
-                            return externalData;
-                        }
-                    });
+        return listEntities(new AbstractExternalDataProvider(commonServer, getSessionToken())
+            {
+                @Override
+                protected List<ExternalData> getDataSets()
+                {
+                    return commonServer.listDataSetRelationships(sessionToken, datasetId, role);
+                }
+            }, criteria);
     }
 
     // ---------------- end list using cache ----------
@@ -1143,7 +1141,8 @@ public final class CommonClientService extends AbstractClientService implements
 
     }
 
-    public String prepareExportDataSetSearchHits(TableExportCriteria<ExternalData> exportCriteria)
+    public String prepareExportDataSetSearchHits(
+            TableExportCriteria<TableModelRowWithObject<ExternalData>> exportCriteria)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         return prepareExportEntities(exportCriteria);
@@ -1761,37 +1760,45 @@ public final class CommonClientService extends AbstractClientService implements
             return displayedOrSelectedDatasetCriteria.tryGetSelectedItems();
         } else
         {
-            TableExportCriteria<ExternalData> displayedItemsCriteria =
+            TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItemsCriteria =
                     displayedOrSelectedDatasetCriteria.tryGetDisplayedItems();
             assert displayedItemsCriteria != null : "displayedItemsCriteria is null";
-            List<ExternalData> datasets =
+            List<TableModelRowWithObject<ExternalData>> datasets =
                     fetchCachedEntities(displayedItemsCriteria).extractOriginalObjects();
             if (serviceDescriptionOrNull != null)
             {
                 datasets = filterDatasets(datasets, serviceDescriptionOrNull);
             }
-            return Code.extractCodes(datasets);
+            List<String> codes = new ArrayList<String>();
+            for (TableModelRowWithObject<ExternalData> row : datasets)
+            {
+                codes.add(row.getObjectOrNull().getCode());
+            }
+            return codes;
         }
     }
 
     // returns datasets which have type code belonging to the specified set and belong to the same
     // dataset store as the plugin
-    private static List<ExternalData> filterDatasets(List<ExternalData> datasets,
+    private static List<TableModelRowWithObject<ExternalData>> filterDatasets(
+            List<TableModelRowWithObject<ExternalData>> datasets,
             DatastoreServiceDescription serviceDescription)
     {
         String[] datasetTypeCodes = serviceDescription.getDatasetTypeCodes();
         Set<String> datasetTypeCodesMap = new HashSet<String>(Arrays.asList(datasetTypeCodes));
-        List<ExternalData> result = new ArrayList<ExternalData>();
+        List<TableModelRowWithObject<ExternalData>> result =
+                new ArrayList<TableModelRowWithObject<ExternalData>>();
         String serviceDatastoreCode = serviceDescription.getDatastoreCode();
-        for (ExternalData dataset : datasets)
+        for (TableModelRowWithObject<ExternalData> row : datasets)
         {
+            ExternalData dataset = row.getObjectOrNull();
             String datasetTypeCode = dataset.getDataSetType().getCode();
             if (datasetTypeCodesMap.contains(datasetTypeCode))
             {
                 String datasetDatastoreCode = dataset.getDataStore().getCode();
                 if (datasetDatastoreCode.equals(serviceDatastoreCode))
                 {
-                    result.add(dataset);
+                    result.add(row);
                 }
             }
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
index 086f42516bcac0328faab7b479cd2bcacbd9409f..2f828697535c71c558309aa302db45d87e9cc047 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
@@ -18,7 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.server.resultset;
 
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.ARCHIVING_STATUS;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.CODE;
-import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.CONTAINER_DATA_SET;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.CONTAINER_DATASET;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.DATA_PRODUCER_CODE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.DATA_SET_TYPE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.DATA_STORE_CODE;
@@ -51,6 +51,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
 import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
@@ -61,7 +62,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
 public abstract class AbstractExternalDataProvider extends
         AbstractCommonTableModelProvider<ExternalData>
 {
-    AbstractExternalDataProvider(ICommonServer commonServer, String sessionToken)
+    public AbstractExternalDataProvider(ICommonServer commonServer, String sessionToken)
     {
         super(commonServer, sessionToken);
     }
@@ -73,7 +74,7 @@ public abstract class AbstractExternalDataProvider extends
         TypedTableModelBuilder<ExternalData> builder = new TypedTableModelBuilder<ExternalData>();
         builder.addColumn(CODE).withDefaultWidth(150);
         builder.addColumn(DATA_SET_TYPE).withDefaultWidth(200);
-        builder.addColumn(CONTAINER_DATA_SET).withDefaultWidth(150).hideByDefault();
+        builder.addColumn(CONTAINER_DATASET).withDefaultWidth(150).hideByDefault();
         builder.addColumn(ORDER_IN_CONTAINER).withDefaultWidth(100).hideByDefault();
         builder.addColumn(SAMPLE).withDefaultWidth(100).hideByDefault();
         builder.addColumn(EXTERNAL_DATA_SAMPLE_IDENTIFIER).withDefaultWidth(200);
@@ -99,24 +100,30 @@ public abstract class AbstractExternalDataProvider extends
         for (ExternalData dataSet : dataSets)
         {
             builder.addRow(dataSet);
-            builder.column(CODE).addString(dataSet.getCode());
+            builder.column(CODE).addEntityLink(dataSet, dataSet.getCode());
             builder.column(DATA_SET_TYPE).addString(dataSet.getDataSetType().getCode());
             ContainerDataSet container = dataSet.tryGetContainer();
-            builder.column(CONTAINER_DATA_SET).addString(
-                    container == null ? "" : container.getCode());
+            if (container != null)
+            {
+                builder.column(CONTAINER_DATASET).addEntityLink(container, container.getCode());
+            }
             Integer orderInContainer = dataSet.getOrderInContainer();
             builder.column(ORDER_IN_CONTAINER).addString(
                     orderInContainer == null ? "" : orderInContainer.toString());
-            builder.column(SAMPLE).addString(dataSet.getSampleCode());
-            builder.column(EXTERNAL_DATA_SAMPLE_IDENTIFIER)
-                    .addString(dataSet.getSampleIdentifier());
-            SampleType sampleType = dataSet.getSampleType();
-            builder.column(SAMPLE_TYPE).addString(sampleType == null ? "" : sampleType.getCode());
+            Sample sample = dataSet.getSample();
+            if (sample != null)
+            {
+                builder.column(SAMPLE).addEntityLink(sample, sample.getCode());
+                builder.column(EXTERNAL_DATA_SAMPLE_IDENTIFIER).addEntityLink(sample,
+                        sample.getIdentifier());
+                SampleType sampleType = dataSet.getSampleType();
+                builder.column(SAMPLE_TYPE).addString(sampleType.getCode());
+            }
             Experiment experiment = dataSet.getExperiment();
             if (experiment != null)
             {
-                builder.column(EXPERIMENT).addString(experiment.getCode());
-                builder.column(EXTERNAL_DATA_EXPERIMENT_IDENTIFIER).addString(
+                builder.column(EXPERIMENT).addEntityLink(experiment, experiment.getCode());
+                builder.column(EXTERNAL_DATA_EXPERIMENT_IDENTIFIER).addEntityLink(experiment,
                         experiment.getIdentifier());
                 builder.column(EXPERIMENT_TYPE).addString(experiment.getEntityType().getCode());
                 builder.column(PROJECT).addString(experiment.getProject().getCode());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index 5d71e5b1badefd730182be1d5aa58c49a200a5e9..b069e2ff1b888aa8792d34c3e6e98ddf94cfc95e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -274,7 +274,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     public final List<ExternalData> listSampleExternalData(final String sessionToken,
             final TechId sampleId, final boolean showOnlyDirectlyConnected)
     {
-        logAccess(sessionToken, "list_external_data", "ID(%s) DIRECT(%s)", sampleId,
+        logAccess(sessionToken, "list_sample_external_data", "ID(%s) DIRECT(%s)", sampleId,
                 showOnlyDirectlyConnected);
         return null;
     }
@@ -282,7 +282,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     public List<ExternalData> listExperimentExternalData(final String sessionToken,
             final TechId experimentId)
     {
-        logAccess(sessionToken, "list_external_data", "ID(%s)", experimentId);
+        logAccess(sessionToken, "list_experiment_external_data", "ID(%s)", experimentId);
         return null;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java
index 39dbd4e50bb6060892209ab07bcddd49eb69ba40..12ec3edfeb52f89cdb0b9cadef77b3b36d0f1a4f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java
@@ -24,11 +24,12 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * {@link AbstractExternalDataGrid} containing data sets directly connected with a specified data
@@ -85,8 +86,9 @@ public class DataSetRelationshipBrowser extends AbstractExternalDataGrid
     }
 
     @Override
-    protected void listDatasets(DefaultResultSetConfig<String, ExternalData> resultSetConfig,
-            final AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>> callback)
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
     {
         viewContext.getService().listDataSetRelationships(datasetId, role, resultSetConfig,
                 callback);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java
index 409fd76e0522e31eb52324bb9bdac0ffadabc7bb..08fd1c59f1c0830511f787db7a9b2f711d9c0239 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java
@@ -48,7 +48,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DataSetUpdates;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
@@ -58,6 +58,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypePropertyType
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 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.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.AbstractGenericEntityRegistrationForm;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment.PropertiesEditor;
@@ -299,7 +300,7 @@ public final class GenericDataSetEditForm extends
     {
         // not best performance but the same solution that is done for experiments
         // only codes are needed but we extract 'full' object
-        DefaultResultSetConfig<String, ExternalData> config =
+        DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> config =
                 DefaultResultSetConfig.createFetchAll();
         viewContext.getCommonService().listDataSetRelationships(techIdOrNull,
                 DataSetRelationshipRole.CHILD, config, new ListParentsCallback(viewContext));
@@ -329,6 +330,16 @@ public final class GenericDataSetEditForm extends
 
     }
 
+    private List<ExternalData> extractDataSets(List<TableModelRowWithObject<ExternalData>> rows)
+    {
+        List<ExternalData> dataSets = new ArrayList<ExternalData>();
+        for (TableModelRowWithObject<ExternalData> row : rows)
+        {
+            dataSets.add(row.getObjectOrNull());
+        }
+        return dataSets;
+    }
+
     private final class DataSetInfoCallback extends AbstractAsyncCallback<ExternalData>
     {
 
@@ -346,7 +357,7 @@ public final class GenericDataSetEditForm extends
     }
 
     private class ListParentsCallback extends
-            AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>>
+            AbstractAsyncCallback<TypedTableResultSet<ExternalData>>
     {
 
         public ListParentsCallback(IViewContext<?> viewContext)
@@ -355,9 +366,12 @@ public final class GenericDataSetEditForm extends
         }
 
         @Override
-        protected void process(ResultSetWithEntityTypes<ExternalData> result)
+        protected void process(TypedTableResultSet<ExternalData> result)
         {
-            parentsArea.setDataSets(result.getResultSet().getList().extractOriginalObjects());
+            List<TableModelRowWithObject<ExternalData>> rows =
+                    result.getResultSet().getList().extractOriginalObjects();
+            List<ExternalData> dataSets = extractDataSets(rows);
+            parentsArea.setDataSets(dataSets);
             if (parentsArea.isVisible())
             {
                 parentsArea.setEnabled(true);
@@ -489,7 +503,7 @@ public final class GenericDataSetEditForm extends
         {
             // not best performance but the same solution that is done for experiments
             // only codes are needed but we extract 'full' object
-            DefaultResultSetConfig<String, ExternalData> config =
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> config =
                     DefaultResultSetConfig.createFetchAll();
             viewContext.getCommonService().listDataSetRelationships(techIdOrNull,
                     DataSetRelationshipRole.CONTAINER, config,
@@ -497,7 +511,7 @@ public final class GenericDataSetEditForm extends
         }
 
         private class ListContainedDataSetsCallback extends
-                AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>>
+                AbstractAsyncCallback<TypedTableResultSet<ExternalData>>
         {
 
             public ListContainedDataSetsCallback(IViewContext<?> viewContext)
@@ -506,9 +520,11 @@ public final class GenericDataSetEditForm extends
             }
 
             @Override
-            protected void process(ResultSetWithEntityTypes<ExternalData> result)
+            protected void process(TypedTableResultSet<ExternalData> result)
             {
-                containedArea.setDataSets(result.getResultSet().getList().extractOriginalObjects());
+                List<TableModelRowWithObject<ExternalData>> rows =
+                        result.getResultSet().getList().extractOriginalObjects();
+                containedArea.setDataSets(extractDataSets(rows));
                 if (containedArea.isVisible())
                 {
                     containedArea.setEnabled(true);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
index 78d1130b129f20e3a048b255ebb084c29494bbb4..1706ece268e1ad93c7afdcedfeab533fae2da5c9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
@@ -62,6 +62,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKin
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 
 /**
@@ -151,7 +153,12 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
             {
                 public void handleEvent(BaseEvent be)
                 {
-                    final List<ExternalData> dataSets = Arrays.asList(originalData);
+                    TableModelRowWithObject<ExternalData> row =
+                            new TableModelRowWithObject<ExternalData>(originalData, Arrays
+                                    .<ISerializableComparable> asList());
+                    @SuppressWarnings("unchecked")
+                    final List<TableModelRowWithObject<ExternalData>> dataSets =
+                            Arrays.<TableModelRowWithObject<ExternalData>> asList(row);
                     IDelegatedActionWithResult<SelectedAndDisplayedItems> action =
                             new IDelegatedActionWithResult<SelectedAndDisplayedItems>()
                                 {
@@ -175,8 +182,11 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
                     final AsyncCallback<Void> callback =
                             isTrashEnabled() ? createDeletionCallback()
                                     : createPermanentDeletionCallback();
+                    TableModelRowWithObject<ExternalData> row =
+                            new TableModelRowWithObject<ExternalData>(getOriginalData(),
+                                    Arrays.<ISerializableComparable> asList());
                     new DataSetListDeletionConfirmationDialog(getViewContext()
-                            .getCommonViewContext(), callback, getOriginalData()).show();
+                            .getCommonViewContext(), callback, row).show();
                 }
 
             }));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java
index 0edcbf373b6f7f4e42d941261d73e7e25615ed05..bb9cd4c792a3bdc2bb275d53da00d851f9fea4a5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java
@@ -24,10 +24,11 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * @author Franz-Josef Elmer
@@ -76,8 +77,9 @@ public class ExperimentDataSetBrowser extends AbstractExternalDataGrid
     }
 
     @Override
-    protected void listDatasets(DefaultResultSetConfig<String, ExternalData> resultSetConfig,
-            final AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>> callback)
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
     {
         viewContext.getService().listExperimentDataSets(experimentId, resultSetConfig, callback);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java
index 060c51e16707b770cd1d292892106b4c4a1e0712..8ad35c7267e029574b46f67647587f3c07ff48cb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java
@@ -25,10 +25,11 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.Ab
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.GenericSampleViewer.DataSetConnectionTypeProvider;
 
 /**
@@ -91,8 +92,9 @@ class SampleDataSetBrowser extends AbstractExternalDataGrid
     }
 
     @Override
-    protected void listDatasets(DefaultResultSetConfig<String, ExternalData> resultSetConfig,
-            final AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>> callback)
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
     {
         boolean onlyDirectlyConnected = connectionTypeProvider.getShowOnlyDirectlyConnected();
         viewContext.getService().listSampleDataSets(sampleId, resultSetConfig,
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DataSetSearchTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DataSetSearchTest.java
index 0d92565b7a896d364cfdc8db8b927bbb6bb3ff9f..4bded090efd46e89bf0c07cbe1dd3d88313cf80a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DataSetSearchTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DataSetSearchTest.java
@@ -20,10 +20,10 @@ import com.google.gwt.junit.DoNotRunWith;
 import com.google.gwt.junit.Platform;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.data.CommonExternalDataColDefKind;
 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.columns.DataSetSearchRow;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.search.FillSearchCriteria;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.CheckTableCommand;
 import ch.systemsx.cisd.openbis.generic.shared.basic.Row;
@@ -50,7 +50,7 @@ public class DataSetSearchTest extends AbstractGWTTestCase
         final CheckTableCommand checkResultTableCmd = createCheckSearchGridCmd();
         checkResultTableCmd.expectedSize(10);
         DataSetSearchRow row = new DataSetSearchRow();
-        row.withCell(CommonExternalDataColDefKind.LOCATION.id(), "a/1");
+        row.withCell(ExternalDataGridColumnIDs.LOCATION, "a/1");
         row.withPropertyCell("comment", "no comment");
         checkResultTableCmd.expectedRow(row);
         checkResultTableCmd.expectedColumnsNumber(TOTAL_NUM_OF_COLUMNS);
@@ -69,10 +69,9 @@ public class DataSetSearchTest extends AbstractGWTTestCase
 
         final CheckTableCommand checkResultTableCmd = createCheckSearchGridCmd();
         checkResultTableCmd.expectedSize(2);
-        Row row1 =
-                createTiffRow().withCell(CommonExternalDataColDefKind.LOCATION.id(), "xxx/yyy/zzz");
+        Row row1 = createTiffRow().withCell(ExternalDataGridColumnIDs.LOCATION, "xxx/yyy/zzz");
         checkResultTableCmd.expectedRow(row1);
-        Row row2 = createTiffRow().withCell(CommonExternalDataColDefKind.LOCATION.id(), "a/1");
+        Row row2 = createTiffRow().withCell(ExternalDataGridColumnIDs.LOCATION, "a/1");
         checkResultTableCmd.expectedRow(row2);
 
         remoteConsole.prepare(checkResultTableCmd);
@@ -82,8 +81,7 @@ public class DataSetSearchTest extends AbstractGWTTestCase
 
     private Row createTiffRow()
     {
-        return new DataSetSearchRow().withCell(CommonExternalDataColDefKind.FILE_FORMAT_TYPE.id(),
-                "TIFF");
+        return new DataSetSearchRow().withCell(ExternalDataGridColumnIDs.FILE_FORMAT_TYPE, "TIFF");
     }
 
     private static CheckTableCommand createCheckSearchGridCmd()
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java
index 6db9328febe779e31e19f943cbf2e9161b93e718..21b09ff98844ed303d97c11a5ccd7b043d99494b 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java
@@ -17,8 +17,8 @@
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Login;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.data.CommonExternalDataColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.RelatedDataSetGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.MatchingEntitiesPanelColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase;
@@ -186,7 +186,7 @@ public class SearchTest extends AbstractGWTTestCase
 
     private static Row createRelatedDatasetRowWithLocation(String location)
     {
-        return new Row().withCell(CommonExternalDataColDefKind.LOCATION.id(), location);
+        return new Row().withCell(ExternalDataGridColumnIDs.LOCATION, location);
     }
 
     private AbstractDefaultTestCommand showDatasetsRelatedToAllDisplayedEntities()
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/ExportSamplesTestCommand.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/ExportSamplesTestCommand.java
index ac237b3ff92810a3f4fc229a83a7514bda646abb..5570327701af26820e67cdf2b7264cdf53ffef8e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/ExportSamplesTestCommand.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/ExportSamplesTestCommand.java
@@ -22,9 +22,11 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Client;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractEntityGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.GWTTestUtil;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.ITestCommand;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 /**
  * System tests for the server side of sample export.<BR>
@@ -51,8 +53,8 @@ public class ExportSamplesTestCommand extends AbstractDefaultTestCommand
 
     public void execute()
     {
-        SampleBrowserGrid sampleBrowserGrid =
-                (SampleBrowserGrid) GWTTestUtil.getWidgetWithID(SampleBrowserGrid.MAIN_BROWSER_ID);
+        AbstractEntityGrid<Sample> sampleBrowserGrid =
+                (AbstractEntityGrid<Sample>) GWTTestUtil.getWidgetWithID(SampleBrowserGrid.MAIN_BROWSER_ID);
         // we do not create view context earlier (e.g. in the class constructor), because we have to
         // wait until client is loaded and viewContext is available.
         IViewContext<ICommonClientServiceAsync> viewContext = getViewContext();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
index 20a416851eb62159188ad83b4911b982664b3c9c..d5eac23240dedd81ee10373867d3b8c94be83463 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
@@ -526,13 +526,14 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest
                 }
             });
 
-        DefaultResultSetConfig<String, ExternalData> resultSetConfig =
+        DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig =
                 DefaultResultSetConfig.createFetchAll();
-        ResultSetWithEntityTypes<ExternalData> resultSet =
+        TypedTableResultSet<ExternalData> resultSet =
                 commonClientService.listExperimentDataSets(experimentId, resultSetConfig);
-        List<ExternalData> list = resultSet.getResultSet().getList().extractOriginalObjects();
+        List<TableModelRowWithObject<ExternalData>> list =
+                resultSet.getResultSet().getList().extractOriginalObjects();
         assertEquals(1, list.size());
-        DataSet data = list.get(0).tryGetAsDataSet();
+        DataSet data = list.get(0).getObjectOrNull().tryGetAsDataSet();
         // assertEquals(code, data.getCode());
         assertEquals(DATA_STORE_BASE_URL, data.getDataStore().getHostUrl());
         assertEquals(DATA_STORE_BASE_URL + "/" + DATA_STORE_SERVER_WEB_APPLICATION_NAME, data
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/SampleDetailsTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/SampleDetailsTest.java
index a1584d2dd11dd6dd72ad7905d059269d61c6f80b..afef2865b8b09bbdd1745dff21a19cead07c3bc7 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/SampleDetailsTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/SampleDetailsTest.java
@@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetCo
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridRowModels;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListSampleDisplayCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
+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.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
@@ -37,6 +38,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.GenericSampleViewerTest;
 
 /**
@@ -86,8 +88,6 @@ public class SampleDetailsTest extends GenericSystemTestCase
 
     private static final String DIRECTLY_CONNECTED_DATA_SET_CODE = "20081105092159222-2";
 
-    private static final String DEFAULT_DATA_SET_TYPE = "HCS_IMAGE";
-
     @Test
     public void testGetMasterPlateDetails()
     {
@@ -186,14 +186,12 @@ public class SampleDetailsTest extends GenericSystemTestCase
         // directly connected
         boolean showOnlyDirectlyConnected = true;
 
-        final ResultSetWithEntityTypes<ExternalData> directlyConnectedResults =
+        final TypedTableResultSet<ExternalData> directlyConnectedResults =
                 commonClientService.listSampleDataSets(TechId.create(sample),
-                        DefaultResultSetConfig.<String, ExternalData> createFetchAll(),
+                        DefaultResultSetConfig
+                                .<String, TableModelRowWithObject<ExternalData>> createFetchAll(),
                         showOnlyDirectlyConnected);
 
-        assertEquals(1, directlyConnectedResults.getAvailableEntityTypes().size());
-        assertEquals(DEFAULT_DATA_SET_TYPE, directlyConnectedResults.getAvailableEntityTypes()
-                .iterator().next().getCode());
         assertEquals(1, directlyConnectedResults.getResultSet().getTotalLength());
         final DataSet directlyConnectedDataSet =
                 getDataSet(directlyConnectedResults.getResultSet().getList(),
@@ -206,14 +204,12 @@ public class SampleDetailsTest extends GenericSystemTestCase
 
         // indirectly connected
         showOnlyDirectlyConnected = false;
-        ResultSetWithEntityTypes<ExternalData> indirectlyConnectedResults =
+        TypedTableResultSet<ExternalData> indirectlyConnectedResults =
                 commonClientService.listSampleDataSets(TechId.create(sample),
-                        DefaultResultSetConfig.<String, ExternalData> createFetchAll(),
+                        DefaultResultSetConfig
+                                .<String, TableModelRowWithObject<ExternalData>> createFetchAll(),
                         showOnlyDirectlyConnected);
 
-        assertEquals(1, indirectlyConnectedResults.getAvailableEntityTypes().size());
-        assertEquals(DEFAULT_DATA_SET_TYPE, indirectlyConnectedResults.getAvailableEntityTypes()
-                .iterator().next().getCode());
         assertEquals(6, indirectlyConnectedResults.getResultSet().getTotalLength());
 
         // the directly connected data set should still be retrieved
@@ -371,11 +367,12 @@ public class SampleDetailsTest extends GenericSystemTestCase
         return null; // satisfy compiler
     }
 
-    private static ExternalData getDataSet(GridRowModels<ExternalData> list, String identifier)
+    private static ExternalData getDataSet(
+            GridRowModels<TableModelRowWithObject<ExternalData>> list, String identifier)
     {
-        for (GridRowModel<ExternalData> gridRowModel : list)
+        for (GridRowModel<TableModelRowWithObject<ExternalData>> gridRowModel : list)
         {
-            ExternalData externalData = gridRowModel.getOriginalObject();
+            ExternalData externalData = gridRowModel.getOriginalObject().getObjectOrNull();
             if (DEBUG)
             {
                 System.out.println(externalData.getIdentifier());
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ExperimentViewer.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ExperimentViewer.java
index 40d2da4153db09587c19f9e72d9b42b9fda2c723..7e9d2af995f38753845450df0a8ea6a12a45da1f 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ExperimentViewer.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/ExperimentViewer.java
@@ -42,7 +42,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ID
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetWithEntityTypes;
+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.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -50,6 +50,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 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.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.GenericViewContext;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment.GenericExperimentViewer;
@@ -109,11 +110,11 @@ public class ExperimentViewer extends GenericExperimentViewer
         final ContentPanel contentPanel = new ContentPanel(new RowLayout());
         contentPanel.setHeading(viewContext.getMessage(Dict.DATA_SET_PROCESSING_SECTION_TITLE));
         viewContext.getCommonService().listExperimentDataSets(new TechId(experimentId),
-                DefaultResultSetConfig.<String, ExternalData> createFetchAll(),
-                new AbstractAsyncCallback<ResultSetWithEntityTypes<ExternalData>>(viewContext)
+                DefaultResultSetConfig.<String, TableModelRowWithObject<ExternalData>> createFetchAll(),
+                new AbstractAsyncCallback<TypedTableResultSet<ExternalData>>(viewContext)
                     {
                         @Override
-                        protected void process(ResultSetWithEntityTypes<ExternalData> result)
+                        protected void process(TypedTableResultSet<ExternalData> result)
                         {
                             AsyncCallback<List<DatastoreServiceDescription>> callBack =
                                     createCallback(contentPanel, result);
@@ -126,12 +127,12 @@ public class ExperimentViewer extends GenericExperimentViewer
     }
 
     private AsyncCallback<List<DatastoreServiceDescription>> createCallback(
-            final ContentPanel contentPanel, ResultSetWithEntityTypes<ExternalData> result)
+            final ContentPanel contentPanel, TypedTableResultSet<ExternalData> result)
     {
         final List<String> dataSetCodes = new ArrayList<String>();
-        for (GridRowModel<ExternalData> gridRowModel : result.getResultSet().getList())
+        for (GridRowModel<TableModelRowWithObject<ExternalData>> gridRowModel : result.getResultSet().getList())
         {
-            dataSetCodes.add(gridRowModel.getOriginalObject().getCode());
+            dataSetCodes.add(gridRowModel.getOriginalObject().getObjectOrNull().getCode());
         }
         final DisplayedOrSelectedDatasetCriteria criteria =
                 DisplayedOrSelectedDatasetCriteria.createSelectedItems(dataSetCodes);