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 3427cc79dff0df3fe19b36035e802dd0460bf8db..6b28f525742708658799c0b2263ff930dd04c9bd 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
@@ -258,7 +258,7 @@ public interface ICommonClientService extends IClientService
     /**
      * Returns a list of experiments.
      */
-    public ResultSet<Experiment> listExperiments(final ListExperimentsCriteria criteria)
+    public TypedTableResultSet<Experiment> listExperiments(final ListExperimentsCriteria criteria)
             throws UserFailureException;
 
     /**
@@ -271,7 +271,8 @@ public interface ICommonClientService extends IClientService
      * Like {@link #prepareExportSamples(TableExportCriteria)}, but for experiments.
      */
 
-    public String prepareExportExperiments(final TableExportCriteria<Experiment> criteria)
+    public String prepareExportExperiments(
+            final TableExportCriteria<TableModelRowWithObject<Experiment>> criteria)
             throws UserFailureException;
 
     /**
@@ -654,7 +655,8 @@ public interface ICommonClientService extends IClientService
     public void deleteSample(TechId sampleId, String reason) throws UserFailureException;
 
     /** Deletes the specified experiments. */
-    public void deleteExperiments(DisplayedOrSelectedIdHolderCriteria<Experiment> criteria,
+    public void deleteExperiments(
+            DisplayedOrSelectedIdHolderCriteria<TableModelRowWithObject<Experiment>> criteria,
             String reason) throws UserFailureException;
 
     /** Deletes the specified experiment. */
@@ -856,14 +858,14 @@ public interface ICommonClientService extends IClientService
      * Schedules archiving of the datasets connected to the specified experiments.
      */
     public ArchivingResult archiveDatasets(
-            DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria)
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria)
             throws UserFailureException;
 
     /**
      * Schedules unarchiving of the datasets connected to the specified experiments.
      */
     public ArchivingResult unarchiveDatasets(
-            DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria)
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria)
             throws UserFailureException;
 
     /**
@@ -1010,14 +1012,15 @@ public interface ICommonClientService extends IClientService
     /**
      * Locks the datasets connected to the specified experiments.
      */
-    public ArchivingResult lockDatasets(DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria)
+    public ArchivingResult lockDatasets(
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria)
             throws UserFailureException;
 
     /**
      * Unlocks the datasets connected to the specified experiments.
      */
     public ArchivingResult unlockDatasets(
-            DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria)
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria)
             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 8a8356bc19d0b496f8b6b43e4ecaa42ce26aeaf4..7aa55da6f2584a87e642e47904da36a62031a7ff 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
@@ -234,12 +234,13 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
      */
     public void listExperiments(
             final ListExperimentsCriteria criteria,
-            AsyncCallback<ResultSet<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment>> asyncCallback);
+            AsyncCallback<TypedTableResultSet<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment>> asyncCallback);
 
     /**
      * @see ICommonClientService#prepareExportExperiments(TableExportCriteria)
      */
-    public void prepareExportExperiments(TableExportCriteria<Experiment> exportCriteria,
+    public void prepareExportExperiments(
+            TableExportCriteria<TableModelRowWithObject<Experiment>> exportCriteria,
             AsyncCallback<String> callback);
 
     /**
@@ -557,7 +558,8 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     public void deleteSample(TechId sampleIs, String value, AsyncCallback<Void> asyncCallback);
 
     /** @see ICommonClientService#deleteExperiments(DisplayedOrSelectedIdHolderCriteria, String) */
-    public void deleteExperiments(DisplayedOrSelectedIdHolderCriteria<Experiment> criteria,
+    public void deleteExperiments(
+            DisplayedOrSelectedIdHolderCriteria<TableModelRowWithObject<Experiment>> criteria,
             String value, AsyncCallback<Void> asyncCallback);
 
     /** @see ICommonClientService#deleteExperiment(TechId, String) */
@@ -751,13 +753,13 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     /**
      * @see ICommonClientService#archiveDatasets(DisplayedCriteriaOrSelectedEntityHolder)
      */
-    public void archiveDatasets(DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria,
+    public void archiveDatasets(DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria,
             AsyncCallback<ArchivingResult> callback);
 
     /**
      * @see ICommonClientService#unarchiveDatasets(DisplayedCriteriaOrSelectedEntityHolder)
      */
-    public void unarchiveDatasets(DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria,
+    public void unarchiveDatasets(DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria,
             AsyncCallback<ArchivingResult> callback);
 
     /**
@@ -897,13 +899,15 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     /**
      * @see ICommonClientService#lockDatasets(DisplayedCriteriaOrSelectedEntityHolder)
      */
-    public void lockDatasets(DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria,
+    public void lockDatasets(
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria,
             AsyncCallback<ArchivingResult> callback);
 
     /**
      * @see ICommonClientService#unlockDatasets(DisplayedCriteriaOrSelectedEntityHolder)
      */
-    public void unlockDatasets(DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria,
+    public void unlockDatasets(
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria,
             AsyncCallback<ArchivingResult> callback);
 
     /**
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 e526cc577eb9497218ecda9542d49c2e08473bed..86c780572103ec6f23fe206108bfe396e803e440 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
@@ -16,8 +16,9 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
-import java.util.Set;
 
 import com.extjs.gxt.ui.client.event.ButtonEvent;
 import com.extjs.gxt.ui.client.event.SelectionListener;
@@ -25,6 +26,7 @@ import com.extjs.gxt.ui.client.widget.Dialog;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
 import com.extjs.gxt.ui.client.widget.button.Button;
 import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
+import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -36,49 +38,50 @@ 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.model.EntityGridModelFactory;
+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.IColumnDefinitionKind;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.experiment.CommonExperimentColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentDataSetArchivingMenu.SelectedAndDisplayedItems;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractEntityBrowserGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractEntityBrowserGrid.ICriteriaProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.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.listener.OpenEntityDetailsTabHelper;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 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.ExperimentBrowserGridColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListExperimentsCriteria;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.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.ExperimentType;
+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;
 
 /**
  * A {@link LayoutContainer} which contains the grid where the experiments are displayed.
  * 
  * @author Tomasz Pylak
  */
-public class ExperimentBrowserGrid extends
-        AbstractEntityBrowserGrid<Experiment, BaseEntityModel<Experiment>, ListExperimentsCriteria>
+public class ExperimentBrowserGrid extends TypedTableGrid<Experiment>
 {
 
     private static final String PREFIX = "experiment-browser";
 
     public static final String BROWSER_ID = GenericConstants.ID_PREFIX + PREFIX;
 
-    public static final String GRID_ID = BROWSER_ID + "_grid";
+    public static final String GRID_ID = BROWSER_ID + TypedTableGrid.GRID_POSTFIX;
 
     public static final String EDIT_BUTTON_ID = BROWSER_ID + "_edit-button";
 
@@ -87,7 +90,7 @@ public class ExperimentBrowserGrid extends
     /**
      * Creates a grid without additional toolbar buttons. It can serve as a entity chooser.
      */
-    public static DisposableEntityChooser<Experiment> createChooser(
+    public static DisposableEntityChooser<TableModelRowWithObject<Experiment>> createChooser(
             final IViewContext<ICommonClientServiceAsync> viewContext)
     {
         final ProjectSelectionTreeGridContainer tree =
@@ -96,8 +99,8 @@ public class ExperimentBrowserGrid extends
         final ExperimentBrowserGrid browserGrid = new ExperimentBrowserGrid(viewContext, toolbar)
             {
                 @Override
-                protected void showEntityViewer(Experiment experiment, boolean editMode,
-                        boolean active)
+                protected void showEntityViewer(TableModelRowWithObject<Experiment> experiment,
+                        boolean editMode, boolean active)
                 {
                     // do nothing - avoid showing the details after double click
                 }
@@ -106,7 +109,7 @@ public class ExperimentBrowserGrid extends
         return createExperimentBrowser(tree, toolbar, browserGrid, viewContext);
     }
 
-    private static DisposableEntityChooser<Experiment> createExperimentBrowser(
+    private static DisposableEntityChooser<TableModelRowWithObject<Experiment>> createExperimentBrowser(
             final ProjectSelectionTreeGridContainer tree, final ExperimentBrowserToolbar toolbar,
             final ExperimentBrowserGrid browserGrid, IMessageProvider messageProvider)
     {
@@ -118,7 +121,7 @@ public class ExperimentBrowserGrid extends
      * Create a grid with the toolbar and a tree and optional initial selection of experiment type
      * and project.
      */
-    public static DisposableEntityChooser<Experiment> create(
+    public static DisposableEntityChooser<TableModelRowWithObject<Experiment>> create(
             final IViewContext<ICommonClientServiceAsync> viewContext, String initialProjectOrNull,
             String initialExperimentTypeOrNull)
     {
@@ -133,7 +136,7 @@ public class ExperimentBrowserGrid extends
     }
 
     /** Create a grid with the toolbar and a tree with no initial selection. */
-    public static DisposableEntityChooser<Experiment> create(
+    public static DisposableEntityChooser<TableModelRowWithObject<Experiment>> create(
             final IViewContext<ICommonClientServiceAsync> viewContext)
     {
         return create(viewContext, null, null);
@@ -148,25 +151,57 @@ public class ExperimentBrowserGrid extends
         this.criteriaProvider = criteriaProvider;
         registerLinkClickListenerFor(CommonExperimentColDefKind.EXPERIMENT_IDENTIFIER.id(),
                 showEntityViewerLinkClickListener);
-        registerLinkClickListenerFor(CommonExperimentColDefKind.PROJECT.id(),
-                new ICellListener<Experiment>()
+        linkExperiment();
+        linkProject();
+        setId(BROWSER_ID);
+    }
+
+    private void linkExperiment()
+    {
+        ICellListenerAndLinkGenerator<Experiment> listenerLinkGenerator =
+                new ICellListenerAndLinkGenerator<Experiment>()
                     {
-                        public void handle(Experiment rowItem, boolean keyPressed)
+                        public void handle(TableModelRowWithObject<Experiment> rowItem,
+                                boolean specialKeyPressed)
                         {
-                            final Project project = rowItem.getProject();
-                            final String href = LinkExtractor.tryExtract(project);
-                            OpenEntityDetailsTabHelper.open(viewContext, project, keyPressed, href);
+                            showEntityInformationHolderViewer(rowItem.getObjectOrNull(), false,
+                                    specialKeyPressed);
                         }
-                    });
-        setId(BROWSER_ID);
+
+                        public String tryGetLink(Experiment entity,
+                                ISerializableComparable comparableValue)
+                        {
+                            return LinkExtractor.tryExtract(entity);
+                        }
+                    };
+        registerListenerAndLinkGenerator(ExperimentBrowserGridColumnIDs.CODE, listenerLinkGenerator);
+        registerListenerAndLinkGenerator(ExperimentBrowserGridColumnIDs.EXPERIMENT_IDENTIFIER,
+                listenerLinkGenerator);
     }
 
-    @Override
-    protected ICriteriaProvider<ListExperimentsCriteria> getCriteriaProvider()
+    private void linkProject()
     {
-        return criteriaProvider;
-    }
+        registerListenerAndLinkGenerator(ExperimentBrowserGridColumnIDs.PROJECT,
+                new ICellListenerAndLinkGenerator<Experiment>()
+                    {
+                        public void handle(TableModelRowWithObject<Experiment> rowItem,
+                                boolean specialKeyPressed)
+                        {
+                            final Project project =
+                                    rowItem.getObjectOrNull().getProject();
+                            final String href = LinkExtractor.tryExtract(project);
+                            OpenEntityDetailsTabHelper.open(viewContext, project,
+                                    specialKeyPressed, href);
+                        }
 
+                        public String tryGetLink(Experiment entity,
+                                ISerializableComparable comparableValue)
+                        {
+                            return LinkExtractor.tryExtract(entity.getProject());
+                        }
+                    });
+    }
+    
     private void extendBottomToolbar()
     {
         if (viewContext.isSimpleOrEmbeddedMode())
@@ -205,7 +240,7 @@ public class ExperimentBrowserGrid extends
         final Button deleteButton = new Button(deleteAllTitle, new AbstractCreateDialogListener()
             {
                 @Override
-                protected Dialog createDialog(List<Experiment> experiments,
+                protected Dialog createDialog(List<TableModelRowWithObject<Experiment>> experiments,
                         IBrowserGridActionInvoker invoker)
                 {
                     return new ExperimentListDeletionConfirmationDialog(viewContext,
@@ -248,7 +283,7 @@ public class ExperimentBrowserGrid extends
     private void openExperimentRegistrationTab()
     {
         final ActionContext context = new ActionContext();
-        ListExperimentsCriteria criteriaOrNull = getCriteriaProvider().tryGetCriteria();
+        ListExperimentsCriteria criteriaOrNull = criteriaProvider.tryGetCriteria();
         if (criteriaOrNull != null)
         {
             final ExperimentType experimentType = criteriaOrNull.getExperimentType();
@@ -265,103 +300,99 @@ public class ExperimentBrowserGrid extends
         topToolbar.setCriteriaChangedListeners(createGridRefreshDelegatedAction());
     }
 
+    private final IDelegatedAction createGridRefreshDelegatedAction()
+    {
+        return new IDelegatedAction()
+            {
+                public void execute()
+                {
+                    if (criteriaProvider.tryGetCriteria() != null)
+                    {
+                        refreshGridWithFilters();
+                    }
+                }
+            };
+    }
+    
     @Override
-    protected void listEntities(DefaultResultSetConfig<String, Experiment> resultSetConfig,
-            AbstractAsyncCallback<ResultSet<Experiment>> callback)
+    protected String translateColumnIdToDictionaryKey(String columnID)
     {
-        criteria.copyPagingConfig(resultSetConfig);
-        viewContext.getService().listExperiments(criteria, callback);
+        return columnID.toLowerCase();
     }
 
     @Override
-    protected void showEntityViewer(Experiment experiment, boolean editMode, boolean inBackground)
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<Experiment>> resultSetConfig,
+            AsyncCallback<TypedTableResultSet<Experiment>> callback)
     {
-        showEntityInformationHolderViewer(experiment, editMode, inBackground);
+        ListExperimentsCriteria criteria = criteriaProvider.tryGetCriteria();
+        criteria.copyPagingConfig(resultSetConfig);
+        viewContext.getService().listExperiments(criteria, callback);
     }
 
     @Override
-    protected BaseEntityModel<Experiment> createModel(GridRowModel<Experiment> entity)
+    protected void showEntityViewer(TableModelRowWithObject<Experiment> experiment, boolean editMode, boolean inBackground)
     {
-        return getColumnsFactory().createModel(entity,
-                viewContext.getDisplaySettingsManager().getRealNumberFormatingParameters());
+        showEntityInformationHolderViewer(experiment.getObjectOrNull(), editMode, inBackground);
     }
 
     @Override
-    protected ColumnDefsAndConfigs<Experiment> createColumnsDefinition()
+    protected ColumnDefsAndConfigs<TableModelRowWithObject<Experiment>> createColumnsDefinition()
     {
-        ColumnDefsAndConfigs<Experiment> schema =
-                getColumnsFactory().createColumnsSchema(viewContext, criteria.getExperimentType(),
-                        viewContext.getDisplaySettingsManager().getRealNumberFormatingParameters());
-        schema.setGridCellRendererFor(CommonExperimentColDefKind.SHOW_DETAILS_LINK.id(),
-                createShowDetailsLinkCellRenderer());
+        ColumnDefsAndConfigs<TableModelRowWithObject<Experiment>> schema = super.createColumnsDefinition();
         GridCellRenderer<BaseEntityModel<?>> linkCellRenderer = createInternalLinkCellRenderer();
-        schema.setGridCellRendererFor(CommonExperimentColDefKind.EXPERIMENT_IDENTIFIER.id(),
+        schema.setGridCellRendererFor(ExperimentBrowserGridColumnIDs.EXPERIMENT_IDENTIFIER,
                 linkCellRenderer);
-        schema.setGridCellRendererFor(CommonExperimentColDefKind.PROJECT.id(), linkCellRenderer);
+        schema.setGridCellRendererFor(ExperimentBrowserGridColumnIDs.REGISTRATOR,
+                PersonRenderer.REGISTRATOR_RENDERER);
+        schema.setGridCellRendererFor(ExperimentBrowserGridColumnIDs.SHOW_DETAILS_LINK,
+                LinkRenderer.createExternalLinkRenderer(viewContext
+                        .getMessage(Dict.SHOW_DETAILS_LINK_TEXT_VALUE)));
         return schema;
     }
 
-    private EntityGridModelFactory<Experiment> getColumnsFactory()
-    {
-        return new EntityGridModelFactory<Experiment>(viewContext, getStaticColumnsDefinition());
-    }
-
     @Override
-    protected IColumnDefinitionKind<Experiment>[] getStaticColumnsDefinition()
-    {
-        return CommonExperimentColDefKind.values();
-    }
-
-    @Override
-    protected void prepareExportEntities(TableExportCriteria<Experiment> exportCriteria,
+    protected void prepareExportEntities(
+            TableExportCriteria<TableModelRowWithObject<Experiment>> exportCriteria,
             AbstractAsyncCallback<String> callback)
     {
         viewContext.getService().prepareExportExperiments(exportCriteria, callback);
     }
 
     @Override
-    protected EntityType tryToGetEntityType()
+    protected List<String> getColumnIdsOfFilters()
     {
-        return criteria == null ? null : criteria.getExperimentType();
+        return Arrays.asList(ExperimentBrowserGridColumnIDs.CODE);
     }
 
     @Override
-    protected boolean hasColumnsDefinitionChanged(ListExperimentsCriteria newCriteria)
+    public DatabaseModificationKind[] getRelevantModifications()
     {
-        EntityType newEntityType = newCriteria.getExperimentType();
-        EntityType prevEntityType = (criteria == null ? null : criteria.getExperimentType());
-        return hasColumnsDefinitionChanged(newEntityType, prevEntityType);
-    }
-
-    @Override
-    protected List<IColumnDefinition<Experiment>> getInitialFilters()
-    {
-        return asColumnFilters(new CommonExperimentColDefKind[]
-            { CommonExperimentColDefKind.CODE });
-    }
-
-    @Override
-    protected Set<DatabaseModificationKind> getGridRelevantModifications()
-    {
-        return getGridRelevantModifications(ObjectKind.EXPERIMENT);
-    }
-
-    @Override
-    protected EntityKind getEntityKind()
-    {
-        return EntityKind.EXPERIMENT;
+        return GridUtils.getRelevantModifications(ObjectKind.EXPERIMENT, criteriaProvider);
     }
 
     public final class DisplayedAndSelectedExperiments extends
-            DisplayedAndSelectedEntities<Experiment>
+            DisplayedAndSelectedEntities<TableModelRowWithObject<Experiment>>
     {
 
-        public DisplayedAndSelectedExperiments(List<Experiment> selectedItems,
-                TableExportCriteria<Experiment> displayedItemsConfig, int displayedItemsCount)
+        public DisplayedAndSelectedExperiments(
+                List<TableModelRowWithObject<Experiment>> selectedItems,
+                TableExportCriteria<TableModelRowWithObject<Experiment>> displayedItemsConfig,
+                int displayedItemsCount)
         {
             super(selectedItems, displayedItemsConfig, displayedItemsCount);
         }
-
+        
+        public List<Experiment> getExperiments()
+        {
+            ArrayList<Experiment> experiments = new ArrayList<Experiment>();
+            List<TableModelRowWithObject<Experiment>> rows = getSelectedItems();
+            for (TableModelRowWithObject<Experiment> row : rows)
+            {
+                experiments.add(row.getObjectOrNull());
+            }
+            return experiments;
+        }
     }
 
     protected final IDelegatedActionWithResult<DisplayedAndSelectedExperiments> getDisplayedAndSelectedItemsAction()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentDataSetArchivingMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentDataSetArchivingMenu.java
index c851a81967693c67978e2ee6539b2be63c52e71f..ff76840f861c2a355592de7c611bc5f80551e67f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentDataSetArchivingMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentDataSetArchivingMenu.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import com.extjs.gxt.ui.client.widget.Dialog;
@@ -49,6 +50,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ArchivingServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * 'Archiving' menu for data sets connected to experiments. Here, experiments are the central
@@ -174,7 +176,13 @@ public class ExperimentDataSetArchivingMenu extends TextToolItem
 
         public List<Experiment> getSelectedExperiments()
         {
-            return selectedAndDisplayedItems.getSelectedItems();
+            List<TableModelRowWithObject<Experiment>> items = selectedAndDisplayedItems.getSelectedItems();
+            List<Experiment> experiments = new ArrayList<Experiment>();
+            for (TableModelRowWithObject<Experiment> row : items)
+            {
+                experiments.add(row.getObjectOrNull());
+            }
+            return experiments;
         }
     }
 
@@ -186,7 +194,7 @@ public class ExperimentDataSetArchivingMenu extends TextToolItem
             {
                 public void execute(DatastoreServiceDescription service, boolean computeOnSelected)
                 {
-                    DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria =
+                        DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria =
                             selectedAndDisplayedItems.createCriteria(computeOnSelected);
                     switch (taskKind)
                     {
@@ -356,22 +364,27 @@ public class ExperimentDataSetArchivingMenu extends TextToolItem
     public final static class SelectedAndDisplayedItems
     {
         // describes all items which are displayed in the grid (including all grid pages)
-        private final TableExportCriteria<Experiment> displayedItemsConfig;
+        private final TableExportCriteria<TableModelRowWithObject<Experiment>> displayedItemsConfig;
 
         // currently selected items
-        private final List<Experiment> selectedItems;
+        private final List<TableModelRowWithObject<Experiment>> selectedItems;
 
         private final int displayedItemsCount;
 
-        public SelectedAndDisplayedItems(List<Experiment> selectedItems,
-                TableExportCriteria<Experiment> displayedItemsConfig, int displayedItemsCount)
+        public SelectedAndDisplayedItems(List<TableModelRowWithObject<Experiment>> selectedItems,
+                TableExportCriteria<TableModelRowWithObject<Experiment>> displayedItemsConfig, int displayedItemsCount)
         {
             this.displayedItemsConfig = displayedItemsConfig;
             this.selectedItems = selectedItems;
+//            this.selectedItems = new ArrayList<Experiment>();
+//            for (TableModelRowWithObject<Experiment> row : selectedItems)
+//            {
+//                this.selectedItems.add(row.getObjectOrNull());
+//            }
             this.displayedItemsCount = displayedItemsCount;
         }
 
-        public TableExportCriteria<Experiment> getDisplayedItemsConfig()
+        public TableExportCriteria<TableModelRowWithObject<Experiment>> getDisplayedItemsConfig()
         {
             return displayedItemsConfig;
         }
@@ -381,17 +394,16 @@ public class ExperimentDataSetArchivingMenu extends TextToolItem
             return displayedItemsCount;
         }
 
-        public List<Experiment> getSelectedItems()
+        public List<TableModelRowWithObject<Experiment>> getSelectedItems()
         {
             return selectedItems;
         }
 
-        public DisplayedCriteriaOrSelectedEntityHolder<Experiment> createCriteria(boolean selected)
+        public DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> createCriteria(boolean selected)
         {
             if (selected)
             {
-                List<Experiment> items = getSelectedItems();
-                return DisplayedCriteriaOrSelectedEntityHolder.createSelectedItems(items);
+                return DisplayedCriteriaOrSelectedEntityHolder.createSelectedItems(getSelectedItems());
             } else
             {
                 return DisplayedCriteriaOrSelectedEntityHolder
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
index d415e7e26d3182f6e5043c7d3bc73f3c2a291e56..79eea1e8958a0219deaca1f54d4af31817a5ca5b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelecte
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 public final class ExperimentListDeletionConfirmationDialog extends
         AbstractDataListDeletionConfirmationDialog<Experiment>
@@ -48,7 +49,7 @@ public final class ExperimentListDeletionConfirmationDialog extends
             AbstractAsyncCallback<Void> callback,
             DisplayedAndSelectedExperiments selectedAndDisplayedItems)
     {
-        super(viewContext, selectedAndDisplayedItems.getSelectedItems(), callback, true);
+        super(viewContext, selectedAndDisplayedItems.getExperiments(), callback, true);
         this.viewContext = viewContext;
         this.singleDataOrNull = null;
         this.selectedAndDisplayedItemsOrNull = selectedAndDisplayedItems;
@@ -69,7 +70,7 @@ public final class ExperimentListDeletionConfirmationDialog extends
     {
         if (selectedAndDisplayedItemsOrNull != null)
         {
-            final DisplayedOrSelectedIdHolderCriteria<Experiment> uploadCriteria =
+            final DisplayedOrSelectedIdHolderCriteria<TableModelRowWithObject<Experiment>> uploadCriteria =
                     selectedAndDisplayedItemsOrNull.createCriteria(isOnlySelected());
             viewContext.getCommonService().deleteExperiments(uploadCriteria, reason.getValue(),
                     deletionCallback);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ExperimentChooserField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ExperimentChooserField.java
index 86308d8a6c23191cc809e602e8950c300e2721c8..9b41feac29de1b97237886a3ad1dc9ed9ddbcf3f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ExperimentChooserField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ExperimentChooserField.java
@@ -28,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.Di
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * A field for selecting an experiment in a fixed group from a list or by specifying code and
@@ -35,7 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
  * 
  * @author Tomasz Pylak
  */
-public class ExperimentChooserField extends ChosenEntitySetter<Experiment>
+public class ExperimentChooserField extends ChosenEntitySetter<TableModelRowWithObject<Experiment>>
 {
 
     public interface ExperimentChooserFieldAdaptor
@@ -104,12 +105,13 @@ public class ExperimentChooserField extends ChosenEntitySetter<Experiment>
     }
 
     private static void browse(final IViewContext<ICommonClientServiceAsync> viewContext,
-            final ChosenEntitySetter<Experiment> chosenEntityField)
+            final ChosenEntitySetter<TableModelRowWithObject<Experiment>> chosenEntityField)
     {
-        DisposableEntityChooser<Experiment> browser =
+        DisposableEntityChooser<TableModelRowWithObject<Experiment>> browser =
                 ExperimentBrowserGrid.createChooser(viewContext);
         String title = viewContext.getMessage(Dict.TITLE_CHOOSE_EXPERIMENT);
-        new EntityChooserDialog<Experiment>(browser, chosenEntityField, title, viewContext).show();
+        new EntityChooserDialog<TableModelRowWithObject<Experiment>>(browser, chosenEntityField,
+                title, viewContext).show();
     }
 
     // ------------------
@@ -127,9 +129,9 @@ public class ExperimentChooserField extends ChosenEntitySetter<Experiment>
                     + EXPERIMENT_IDENTIFIER_WITHOUT_GROUP_PATTERN + ")";
 
     @Override
-    public String renderEntity(Experiment entity)
+    public String renderEntity(TableModelRowWithObject<Experiment> entity)
     {
-        return print(ExperimentIdentifier.createIdentifier(entity));
+        return print(ExperimentIdentifier.createIdentifier(entity.getObjectOrNull()));
     }
 
     private ExperimentIdentifier tryGetIdentifier()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/GridUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/GridUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..fb4945ae713a55e05d07dca4c2b8ad1f33f8fd9a
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/GridUtils.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid;
+
+import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.createOrDelete;
+import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.edit;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractEntityBrowserGrid.ICriteriaProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.SetUtils;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class GridUtils
+{
+    public static DatabaseModificationKind[] getRelevantModifications(ObjectKind entityKind,
+            ICriteriaProvider<?> criteriaProvider)
+    {
+        List<DatabaseModificationKind> relevantModifications =
+                new ArrayList<DatabaseModificationKind>();
+        SetUtils.addAll(relevantModifications, criteriaProvider.getRelevantModifications());
+        relevantModifications.addAll(GridUtils.getGridRelevantModifications(entityKind, true));
+        return relevantModifications.toArray(DatabaseModificationKind.EMPTY_ARRAY);
+    }
+    
+    public final static Set<DatabaseModificationKind> getGridRelevantModifications(
+            ObjectKind entity, boolean withProject)
+    {
+        Set<DatabaseModificationKind> result = new HashSet<DatabaseModificationKind>();
+        result.add(createOrDelete(entity));
+        result.add(edit(entity));
+        result.add(createOrDelete(ObjectKind.PROPERTY_TYPE_ASSIGNMENT));
+        result.add(edit(ObjectKind.PROPERTY_TYPE_ASSIGNMENT));
+        result.add(edit(ObjectKind.VOCABULARY_TERM));
+        if (withProject)
+        {
+            result.add(edit((ObjectKind.PROJECT)));
+        }
+        return result;
+    }
+
+}
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 f3a137fb173bd6eaa57e3271e7fbc974683703e8..3fd72ea98becacb3fd7b676fb38caa722d7cc77a 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
@@ -16,10 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample;
 
-import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.createOrDelete;
-import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.edit;
-
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
@@ -52,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractEntityBrowserGrid.ICriteriaProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.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.ICellListenerAndLinkGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
@@ -63,7 +60,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listene
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.IDataRefreshCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.SetUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListEntityDisplayCriteriaKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListSampleDisplayCriteria;
@@ -597,30 +593,8 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
     @Override
     public DatabaseModificationKind[] getRelevantModifications()
     {
-        List<DatabaseModificationKind> relevantModifications =
-                new ArrayList<DatabaseModificationKind>();
-        SetUtils.addAll(relevantModifications, getCriteriaProvider().getRelevantModifications());
-        relevantModifications.addAll(getGridRelevantModifications());
-        return relevantModifications.toArray(DatabaseModificationKind.EMPTY_ARRAY);
-    }
-
-    protected Set<DatabaseModificationKind> getGridRelevantModifications()
-    {
-        Set<DatabaseModificationKind> result = getGridRelevantModifications(ObjectKind.SAMPLE);
-        result.add(edit(ObjectKind.PROJECT));
-        return result;
-    }
-
-    protected final static Set<DatabaseModificationKind> getGridRelevantModifications(
-            ObjectKind entity)
-    {
-        Set<DatabaseModificationKind> result = new HashSet<DatabaseModificationKind>();
-        result.add(createOrDelete(entity));
-        result.add(edit(entity));
-        result.add(createOrDelete(ObjectKind.PROPERTY_TYPE_ASSIGNMENT));
-        result.add(edit(ObjectKind.PROPERTY_TYPE_ASSIGNMENT));
-        result.add(edit(ObjectKind.VOCABULARY_TERM));
-        return result;
+        ICriteriaProvider<?> criteriaProvider = getCriteriaProvider();
+        return GridUtils.getRelevantModifications(ObjectKind.SAMPLE, criteriaProvider);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExperimentBrowserGridColumnIDs.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExperimentBrowserGridColumnIDs.java
new file mode 100644
index 0000000000000000000000000000000000000000..17b3c05db54020b855841e8d0e7e7fbd94379151
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExperimentBrowserGridColumnIDs.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.dto;
+
+/**
+ * Column IDs for experiment browser grid.
+ *
+ * @author Franz-Josef Elmer
+ */
+public class ExperimentBrowserGridColumnIDs
+{
+    public static final String CODE  = "CODE";
+    public static final String EXPERIMENT_TYPE  = "EXPERIMENT_TYPE";
+    public static final String EXPERIMENT_IDENTIFIER  = "EXPERIMENT_IDENTIFIER";
+    public static final String DATABASE_INSTANCE  = "DATABASE_INSTANCE";
+    public static final String GROUP  = "GROUP";
+    public static final String PROJECT  = "PROJECT";
+    public static final String REGISTRATOR  = "REGISTRATOR";
+    public static final String REGISTRATION_DATE  = "REGISTRATION_DATE";
+    public static final String IS_INVALID  = "IS_INVALID";
+    public static final String PERM_ID  = "PERM_ID";
+    public static final String SHOW_DETAILS_LINK = "SHOW_DETAILS_LINK";
+
+    public static final String PROPERTIES_PREFIX = "property-";
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListExperimentsCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListExperimentsCriteria.java
index 2eaac57e533738852bcb7f3bbc32e2186f55a944..eb11e8340878c63a1569e06ce50cefc58023de78 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListExperimentsCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListExperimentsCriteria.java
@@ -21,13 +21,14 @@ import com.google.gwt.user.client.rpc.IsSerializable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * Criteria for listing <i>experiments</i>.
  * 
  * @author Izabela Adamczyk
  */
-public final class ListExperimentsCriteria extends DefaultResultSetConfig<String, Experiment>
+public final class ListExperimentsCriteria extends DefaultResultSetConfig<String, TableModelRowWithObject<Experiment>>
         implements IsSerializable
 {
     private ExperimentType experimentType;
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 b7f992069b06e422c26d38cd64f0721489263136..8e983523ba957ec335f4b128a8881b3e1a9b8060 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
@@ -70,6 +70,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.Authorizatio
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.CacheManager;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.DataSetTypeProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.EntityTypeProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.ExperimentProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.FileFormatTypesProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSet;
@@ -432,7 +433,8 @@ public final class CommonClientService extends AbstractClientService implements
         return prepareExportEntities(criteria);
     }
 
-    public final String prepareExportExperiments(final TableExportCriteria<Experiment> criteria)
+    public final String prepareExportExperiments(
+            final TableExportCriteria<TableModelRowWithObject<Experiment>> criteria)
     {
         return prepareExportEntities(criteria);
     }
@@ -582,11 +584,12 @@ public final class CommonClientService extends AbstractClientService implements
         return new DataSetRelatedEntities(entities);
     }
 
-    public final ResultSet<Experiment> listExperiments(final ListExperimentsCriteria listCriteria)
+    public final TypedTableResultSet<Experiment> listExperiments(
+            final ListExperimentsCriteria listCriteria)
     {
         final String sessionToken = getSessionToken();
-        return listEntities(listCriteria, new ListExperimentsOriginalDataProvider(commonServer,
-                listCriteria, sessionToken));
+        return listEntities(new ExperimentProvider(commonServer, sessionToken, listCriteria),
+                listCriteria);
     }
 
     public ResultSet<PropertyType> listPropertyTypes(
@@ -1626,7 +1629,8 @@ public final class CommonClientService extends AbstractClientService implements
         }
     }
 
-    public void deleteExperiments(DisplayedOrSelectedIdHolderCriteria<Experiment> criteria,
+    public void deleteExperiments(
+            DisplayedOrSelectedIdHolderCriteria<TableModelRowWithObject<Experiment>> criteria,
             String reason)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
@@ -2150,7 +2154,7 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     private List<String> extractDatasetCodes(
-            DisplayedCriteriaOrSelectedEntityHolder<Experiment> experimentCriteria)
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> experimentCriteria)
     {
         // Get the referenced experiments
         List<Experiment> experiments = getReferencedExperiments(experimentCriteria);
@@ -2167,20 +2171,26 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     private List<Experiment> getReferencedExperiments(
-            DisplayedCriteriaOrSelectedEntityHolder<Experiment> experimentCriteria)
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> experimentCriteria)
     {
+        List<TableModelRowWithObject<Experiment>> rows;
         if (experimentCriteria.hasSelectedItems())
         {
-            return experimentCriteria.tryGetSelectedItems();
+            rows = experimentCriteria.tryGetSelectedItems();
         } else
         {
-            TableExportCriteria<Experiment> displayedItemsCriteria =
+            TableExportCriteria<TableModelRowWithObject<Experiment>> displayedItemsCriteria =
                     experimentCriteria.tryGetDisplayedItems();
             assert displayedItemsCriteria != null : "displayedItemsCriteria is null";
-            List<Experiment> experiments =
+            rows =
                     fetchCachedEntities(displayedItemsCriteria).extractOriginalObjects();
-            return experiments;
         }
+        List<Experiment> experiments = new ArrayList<Experiment>();
+        for (TableModelRowWithObject<Experiment> row : rows)
+        {
+            experiments.add(row.getObjectOrNull());
+        }
+        return experiments;
     }
 
     private List<String> extractDatasetCodes(
@@ -2708,7 +2718,7 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     public ArchivingResult archiveDatasets(
-            DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria)
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria)
     {
         try
         {
@@ -2723,7 +2733,7 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     public ArchivingResult unarchiveDatasets(
-            DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria)
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria)
     {
         try
         {
@@ -2737,7 +2747,7 @@ public final class CommonClientService extends AbstractClientService implements
         }
     }
 
-    public ArchivingResult lockDatasets(DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria)
+    public ArchivingResult lockDatasets(DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         try
@@ -2753,7 +2763,7 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     public ArchivingResult unlockDatasets(
-            DisplayedCriteriaOrSelectedEntityHolder<Experiment> criteria)
+            DisplayedCriteriaOrSelectedEntityHolder<TableModelRowWithObject<Experiment>> criteria)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         try
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..a23806e1cb3a628dc6c86e7bba25cbbf4e2ab3b4
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ExperimentProvider.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.server.resultset;
+
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.CODE;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.DATABASE_INSTANCE;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.EXPERIMENT_IDENTIFIER;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.EXPERIMENT_TYPE;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.GROUP;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.IS_INVALID;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.PERM_ID;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.PROJECT;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.REGISTRATION_DATE;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.REGISTRATOR;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs.SHOW_DETAILS_LINK;
+
+import java.util.List;
+
+import ch.systemsx.cisd.common.collections.IKeyExtractor;
+import ch.systemsx.cisd.common.collections.TableMap;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListExperimentsCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.SimpleYesNoRenderer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.util.IColumnGroup;
+import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class ExperimentProvider extends AbstractCommonTableModelProvider<Experiment>
+{
+
+    private final ListExperimentsCriteria criteria;
+
+    public ExperimentProvider(ICommonServer commonServer, String sessionToken,
+            ListExperimentsCriteria criteria)
+    {
+        super(commonServer, sessionToken);
+        this.criteria = criteria;
+    }
+
+    @Override
+    protected TypedTableModel<Experiment> createTableModel()
+    {
+        List<Experiment> experiments =
+            commonServer.listExperiments(sessionToken, criteria.getExperimentType(),
+                    new ProjectIdentifier(criteria.getGroupCode(), criteria
+                            .getProjectCode()));
+        TypedTableModelBuilder<Experiment> builder = new TypedTableModelBuilder<Experiment>();
+        builder.addColumn(CODE);
+        builder.addColumn(EXPERIMENT_TYPE).hideByDefault();
+        builder.addColumn(EXPERIMENT_IDENTIFIER).hideByDefault().withDefaultWidth(150);
+        builder.addColumn(DATABASE_INSTANCE).hideByDefault();
+        builder.addColumn(GROUP).hideByDefault();
+        builder.addColumn(PROJECT).hideByDefault();
+        builder.addColumn(REGISTRATOR);
+        builder.addColumn(REGISTRATION_DATE).withDefaultWidth(200);
+        builder.addColumn(IS_INVALID).hideByDefault();
+        builder.addColumn(PERM_ID).hideByDefault();
+        builder.addColumn(SHOW_DETAILS_LINK).hideByDefault();
+        TableMap<String, ExperimentType> experimentTypes = getExperimentTypes();
+        for (Experiment experiment : experiments)
+        {
+            builder.addRow(experiment);
+            builder.column(CODE).addString(experiment.getCode());
+            builder.column(EXPERIMENT_TYPE).addString(experiment.getExperimentType().getCode());
+            builder.column(EXPERIMENT_IDENTIFIER).addString(experiment.getIdentifier());
+            builder.column(DATABASE_INSTANCE).addString(experiment.getProject().getSpace().getInstance().getCode());
+            builder.column(GROUP).addString(experiment.getProject().getSpace().getCode());
+            builder.column(PROJECT).addString(experiment.getProject().getCode());
+            builder.column(REGISTRATOR).addPerson(experiment.getRegistrator());
+            builder.column(REGISTRATION_DATE).addDate(experiment.getRegistrationDate());
+            builder.column(IS_INVALID).addString(SimpleYesNoRenderer.render(experiment.getInvalidation() != null));
+            builder.column(PERM_ID).addString(experiment.getPermId());
+            builder.column(SHOW_DETAILS_LINK).addString(experiment.getPermlink());
+            ExperimentType experimentType = experimentTypes.tryGet(experiment.getExperimentType().getCode());
+            IColumnGroup columnGroup = builder.columnGroup(ExperimentBrowserGridColumnIDs.PROPERTIES_PREFIX);
+            if (experimentType != null)
+            {
+                columnGroup.addColumnsForAssignedProperties(experimentType);
+            }
+            columnGroup.addProperties(experiment.getProperties());
+        }
+        return builder.getModel();
+    }
+
+    protected TableMap<String, ExperimentType> getExperimentTypes()
+    {
+        List<ExperimentType> experimentTypes = commonServer.listExperimentTypes(sessionToken);
+        TableMap<String, ExperimentType> experimentTypMap =
+                new TableMap<String, ExperimentType>(experimentTypes,
+                        new IKeyExtractor<String, ExperimentType>()
+                            {
+                                public String getKey(ExperimentType e)
+                                {
+                                    return e.getCode();
+                                }
+                            });
+        return experimentTypMap;
+    }
+
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/ExperimentBrowsingTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/ExperimentBrowsingTest.java
index 71aa2e0a208c673642ae671aaf0d8acf9f312f72..0cd2d124b43b02cac92be1164dd1ff212fead910 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/ExperimentBrowsingTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/ExperimentBrowsingTest.java
@@ -24,6 +24,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListExperimentsCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSetFetchConfig;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 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.ExperimentType;
@@ -52,14 +53,14 @@ public class ExperimentBrowsingTest extends SystemTestCase
         project.setSpace(space);
         project.setCode("NEMO");
         criteria.setProject(project);
-        ResultSet<Experiment> resultSet = commonClientService.listExperiments(criteria);
+        TypedTableResultSet<Experiment> resultSet = commonClientService.listExperiments(criteria);
         Experiment e1 = getOriginalObjectByCode(resultSet, "EXP-TEST-1");
         assertProperty(e1, "COMMENT", "cmnt");
         Experiment e2 = getOriginalObjectByCode(resultSet, "EXP-TEST-2");
         assertProperty(e2, "GENDER", "FEMALE");
-        assertEquals(false, resultSet.isPartial());
-        assertEquals(5, resultSet.getTotalLength());
-        assertEquals(5, resultSet.getList().size());
+        assertEquals(false, resultSet.getResultSet().isPartial());
+        assertEquals(5, resultSet.getResultSet().getTotalLength());
+        assertEquals(5, resultSet.getResultSet().getList().size());
     }
     
     @Test
@@ -76,14 +77,14 @@ public class ExperimentBrowsingTest extends SystemTestCase
         project.setSpace(space);
         project.setCode("DEFAULT");
         criteria.setProject(project);
-        ResultSet<Experiment> resultSet = commonClientService.listExperiments(criteria);
+        TypedTableResultSet<Experiment> resultSet = commonClientService.listExperiments(criteria);
         Experiment e1 = getOriginalObjectByCode(resultSet, "EXP-REUSE");
         assertEquals(null, e1.getInvalidation());
         Experiment e2 = getOriginalObjectByCode(resultSet, "EXP-X");
         assertEquals(null, e2.getInvalidation().getReason());
-        assertEquals(false, resultSet.isPartial());
-        assertEquals(3, resultSet.getTotalLength());
-        assertEquals(3, resultSet.getList().size());
+        assertEquals(false, resultSet.getResultSet().isPartial());
+        assertEquals(3, resultSet.getResultSet().getTotalLength());
+        assertEquals(3, resultSet.getResultSet().getList().size());
     }
     
     @Test
@@ -102,17 +103,17 @@ public class ExperimentBrowsingTest extends SystemTestCase
         criteria.setProject(project);
         criteria.setLimit(2);
         criteria.setCacheConfig(ResultSetFetchConfig.<String>createComputeAndCache());
-        ResultSet<Experiment> resultSet = commonClientService.listExperiments(criteria);
-        String key = resultSet.getResultSetKey();
-        assertEquals(true, resultSet.isPartial());
-        assertEquals(2, resultSet.getTotalLength());
-        assertEquals(2, resultSet.getList().size());
+        TypedTableResultSet<Experiment> resultSet = commonClientService.listExperiments(criteria);
+        String key = resultSet.getResultSet().getResultSetKey();
+        assertEquals(true, resultSet.getResultSet().isPartial());
+        assertEquals(2, resultSet.getResultSet().getTotalLength());
+        assertEquals(2, resultSet.getResultSet().getList().size());
         
         criteria.setCacheConfig(ResultSetFetchConfig.createFetchFromCacheAndRecompute(key));
         resultSet = commonClientService.listExperiments(criteria);
-        assertEquals(key, resultSet.getResultSetKey());
-        assertEquals(false, resultSet.isPartial());
-        assertEquals(5, resultSet.getTotalLength());
-        assertEquals(2, resultSet.getList().size());
+        assertEquals(key, resultSet.getResultSet().getResultSetKey());
+        assertEquals(false, resultSet.getResultSet().isPartial());
+        assertEquals(5, resultSet.getResultSet().getTotalLength());
+        assertEquals(2, resultSet.getResultSet().getList().size());
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
index 423dda0aebd144e64229f096e7c88e04276839b5..463253b0e692c5b01839627ec20a7193208864b1 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/SystemTestCase.java
@@ -37,16 +37,17 @@ import org.testng.annotations.BeforeSuite;
 import ch.systemsx.cisd.common.servlet.SpringRequestContextProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientService;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridRowModels;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SessionContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.server.UploadedFilesBean;
 import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
 import ch.systemsx.cisd.openbis.generic.server.util.TestInitializer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeWithRegistration;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientService;
 import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
 
@@ -168,13 +169,13 @@ public abstract class SystemTestCase extends AbstractTransactionalTestNGSpringCo
         session.setAttribute(SESSION_KEY, bean);
     }
 
-    protected <T extends ICodeHolder> T getOriginalObjectByCode(ResultSet<T> resultSet, String code)
+    protected <T extends CodeWithRegistration<?>> T getOriginalObjectByCode(TypedTableResultSet<T> resultSet, String code)
     {
-        GridRowModels<T> list = resultSet.getList();
+        GridRowModels<TableModelRowWithObject<T>> list = resultSet.getResultSet().getList();
         List<String> codes = new ArrayList<String>();
-        for (GridRowModel<T> gridRowModel : list)
+        for (GridRowModel<TableModelRowWithObject<T>> gridRowModel : list)
         {
-            T originalObject = gridRowModel.getOriginalObject();
+            T originalObject = gridRowModel.getOriginalObject().getObjectOrNull();
             String objectCode = originalObject.getCode();
             if (objectCode.equals(code))
             {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
index 17d6625cea89c8eadd78870f02559d824b847a7d..9aa497c7870039753897aedda23cb12cedb07723 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
@@ -528,13 +528,13 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
         ExperimentChooserFieldAdaptor experimentChooser =
                 ExperimentChooserField.create("", true, null, viewContext.getCommonViewContext());
         final ExperimentChooserField chooserField = experimentChooser.getChooserField();
-        chooserField.addChosenEntityListener(new IChosenEntityListener<Experiment>()
+        chooserField.addChosenEntityListener(new IChosenEntityListener<TableModelRowWithObject<Experiment>>()
             {
-                public void entityChosen(Experiment experiment)
+                public void entityChosen(TableModelRowWithObject<Experiment> row)
                 {
-                    if (experiment != null)
+                    if (row != null)
                     {
-                        chooseSingleExperiment(chooserField, experiment);
+                        chooseSingleExperiment(chooserField, row.getObjectOrNull());
                     }
                 }
             });