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 38579bf7d210ba6d0815ffbc6a1022ddfca05527..cee5c73a47125284994aae58734cbee831d4c7d9 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
@@ -241,14 +241,7 @@ public interface ICommonClientService extends IClientService
      * Returns a key which can be used be the export servlet (and eventually
      * {@link #getExportTable(String, String)}) to reference the export criteria in an easy way.
      */
-    public String prepareExportSamples(final TableExportCriteria<Sample> criteria)
-            throws UserFailureException;
-
-    /**
-     * Returns a key which can be used be the export servlet (and eventually
-     * {@link #getExportTable(String, String)}) to reference the export criteria in an easy way.
-     */
-    public String prepareExportSamples2(
+    public String prepareExportSamples(
             final TableExportCriteria<TableModelRowWithObject<Sample>> 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 c2e752a83a9776337ab6f8decde47c8b689c7bbc..1f50260354dce10a9ce169849e6d40c7279f02f9 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
@@ -198,14 +198,8 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     public void listSamples2(final ListSampleDisplayCriteria2 criteria,
             AsyncCallback<TypedTableResultSet<Sample>> asyncCallback);
     
-    /**
-     * @see ICommonClientService#prepareExportSamples(TableExportCriteria)
-     */
-    public void prepareExportSamples(final TableExportCriteria<Sample> criteria,
-            AsyncCallback<String> asyncCallback);
-
-    /** @see ICommonClientService#prepareExportSamples2(TableExportCriteria) */
-    public void prepareExportSamples2(
+    /** @see ICommonClientService#prepareExportSamples(TableExportCriteria) */
+    public void prepareExportSamples(
             TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria,
             AsyncCallback<String> callback);
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
index 14115e901586de9ce11fea37979c8df9e6d07ef4..d1f76d659809ce7bf5f71d926f0b7e4cc854058e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
@@ -50,7 +50,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.propert
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.PropertyTypeRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBatchRegisterUpdatePanel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid2;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleRegistrationPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleSearchHitGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleTypeGrid;
@@ -116,7 +116,7 @@ public final class ComponentProvider
                 public ITabItem create()
                 {
                     IDisposableComponent browser =
-                            SampleBrowserGrid2.create(viewContext, initialGroupOrNull,
+                            SampleBrowserGrid.create(viewContext, initialGroupOrNull,
                                     initialSampleTypeOrNull);
                     return createTab(getTabTitle(), browser);
                 }
@@ -124,7 +124,7 @@ public final class ComponentProvider
                 @Override
                 public String getId()
                 {
-                    return SampleBrowserGrid2.MAIN_BROWSER_ID;
+                    return SampleBrowserGrid.MAIN_BROWSER_ID;
                 }
 
                 @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/SampleModelFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/SampleModelFactory.java
deleted file mode 100644
index 6c631de947cf63da2d31b0d83252d57924aa68c4..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/SampleModelFactory.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright 2008 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.extjs.gxt.ui.client.data.ModelData;
-
-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.ui.columns.framework.IColumnDefinitionUI;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.AbstractParentSampleColDef;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.CommonSampleColDefKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.ParentContainerSampleColDef;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.ParentGeneratedFromSampleColDef;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
-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.PropertyType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RealNumberFormatingParameters;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
-
-/**
- * {@link ModelData} for {@link Sample}. Allows to display static columns, properties and sample
- * parents/containers.
- * 
- * @author Izabela Adamczyk
- * @author Tomasz Pylak
- * @author Piotr Buczek
- */
-public final class SampleModelFactory
-{
-    public static ColumnDefsAndConfigs<Sample> createColumnsSchema(
-            final IViewContext<?> viewContext, List<PropertyType> propertyTypes,
-            List<AbstractParentSampleColDef> parentColumnsSchema)
-    {
-        return new SampleModelFactory(viewContext).doCreateColumnsSchema(viewContext,
-                propertyTypes, parentColumnsSchema);
-    }
-
-    public static BaseEntityModel<Sample> createModel(final IViewContext<?> viewContext,
-            GridRowModel<Sample> sampleModel, SampleType sampleType,
-            RealNumberFormatingParameters realNumberFormatingParameters)
-    {
-        List<? extends IColumnDefinitionUI<Sample>> allColumnsDefinition =
-                new SampleModelFactory(viewContext).createColumnsSchemaForRendering(sampleModel,
-                        sampleType, realNumberFormatingParameters);
-        BaseEntityModel<Sample> model =
-                new BaseEntityModel<Sample>(sampleModel, allColumnsDefinition);
-        return model;
-    }
-
-    private final EntityGridModelFactory<Sample> entityGridModelFactory;
-
-    private SampleModelFactory(final IViewContext<?> viewContext)
-    {
-        this.entityGridModelFactory =
-                new EntityGridModelFactory<Sample>(viewContext, CommonSampleColDefKind.values());
-    }
-
-    private List<IColumnDefinitionUI<Sample>> createColumnsSchemaForRendering(
-            GridRowModel<Sample> sampleModel, SampleType sampleType,
-            RealNumberFormatingParameters realNumberFormatingParameters)
-    {
-        List<IColumnDefinitionUI<Sample>> columns =
-                entityGridModelFactory.createColumnsSchemaForRendering(sampleModel,
-                        realNumberFormatingParameters);
-        List<AbstractParentSampleColDef> parentColumns =
-                createParentColumnsSchema(null, sampleType);
-        columns.addAll(parentColumns);
-        return columns;
-    }
-
-    private ColumnDefsAndConfigs<Sample> doCreateColumnsSchema(IMessageProvider messageProvider,
-            List<PropertyType> propertyTypes,
-            List<? extends IColumnDefinitionUI<Sample>> parentColumnsSchema)
-    {
-        assert messageProvider != null : "message provider needed to create table headers";
-
-        ColumnDefsAndConfigs<Sample> columns =
-                entityGridModelFactory.createColumnsSchema(messageProvider, propertyTypes);
-        columns.addColumns(parentColumnsSchema);
-        return columns;
-    }
-
-    public static List<AbstractParentSampleColDef> createParentColumnsSchema(
-            IMessageProvider msgProviderOrNull, SampleType sampleTypeOrNull)
-    {
-        List<AbstractParentSampleColDef> list = createColDefList();
-        if (sampleTypeOrNull != null)
-        {
-            if (sampleTypeOrNull.isShowParents())
-            {
-                String headerText = tryGetMessage(msgProviderOrNull, Dict.PARENTS);
-                list.add(new ParentGeneratedFromSampleColDef(headerText));
-            }
-            if (sampleTypeOrNull.isShowContainer())
-            {
-                String headerText = tryGetMessage(msgProviderOrNull, Dict.PART_OF);
-                list.add(new ParentContainerSampleColDef(headerText));
-            }
-        }
-        return list;
-    }
-
-    private static List<AbstractParentSampleColDef> createColDefList()
-    {
-        return new ArrayList<AbstractParentSampleColDef>();
-    }
-
-    private static String tryGetMessage(IMessageProvider msgProviderOrNull, String messageKey)
-    {
-        return msgProviderOrNull == null ? null : msgProviderOrNull.getMessage(messageKey);
-    }
-
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java
deleted file mode 100644
index 7d4787f7e6cd809f129788a82934c14961510849..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2008 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample;
-
-import com.google.gwt.user.client.rpc.IsSerializable;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.AbstractColumnDefinition;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.AbstractColumnDefinitionKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
-
-public abstract class AbstractParentSampleColDef extends AbstractColumnDefinition<Sample> implements
-        IsSerializable
-{
-    abstract public Sample tryGetParent(Sample sample);
-
-    AbstractParentSampleColDef(String headerText)
-    {
-        super(headerText, AbstractColumnDefinitionKind.DEFAULT_COLUMN_WIDTH, false, false);
-    }
-
-    @Override
-    protected String tryGetValue(Sample sample)
-    {
-        Sample parent = tryGetParent(sample);
-        if (parent != null)
-        {
-            return getAsValue(parent);
-        } else
-        {
-            return null;
-        }
-    }
-
-    protected final String getAsValue(Sample sample)
-    {
-        return sample.getIdentifier();
-    }
-
-    @Override
-    public String tryGetLink(Sample sample)
-    {
-        return LinkExtractor.tryExtract(tryGetParent(sample));
-    }
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/CommonSampleColDefKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/CommonSampleColDefKind.java
deleted file mode 100644
index 2cafe198083262efb595019c97ae6aaaf5029b70..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/CommonSampleColDefKind.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright 2008 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.AbstractColumnDefinitionKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor;
-import ch.systemsx.cisd.openbis.generic.shared.basic.SimpleYesNoRenderer;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
-
-public enum CommonSampleColDefKind implements IColumnDefinitionKind<Sample>
-{
-    DATABASE_INSTANCE(new AbstractColumnDefinitionKind<Sample>(Dict.DATABASE_INSTANCE, true)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                DatabaseInstance databaseInstance = entity.getDatabaseInstance();
-                if (databaseInstance == null)
-                {
-                    databaseInstance = entity.getSpace().getInstance();
-                }
-                return databaseInstance.getCode();
-            }
-        }),
-
-    GROUP(new AbstractColumnDefinitionKind<Sample>(Dict.GROUP, true)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                final Space space = entity.getSpace();
-                return space == null ? "" : space.getCode();
-            }
-        }),
-
-    CODE(new AbstractColumnDefinitionKind<Sample>(Dict.CODE)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                return entity.getCode();
-            }
-
-            @Override
-            public String tryGetLink(Sample entity)
-            {
-                return LinkExtractor.tryExtract(entity);
-            }
-        }),
-
-    SUBCODE(new AbstractColumnDefinitionKind<Sample>(Dict.SUBCODE, true)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                return entity.getSubCode();
-            }
-
-            @Override
-            public String tryGetLink(Sample entity)
-            {
-                return LinkExtractor.tryExtract(entity);
-            }
-        }),
-
-    SAMPLE_IDENTIFIER(new AbstractColumnDefinitionKind<Sample>(Dict.SAMPLE_IDENTIFIER, 150, true)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                return entity.getIdentifier();
-            }
-
-            @Override
-            public String tryGetLink(Sample entity)
-            {
-                return LinkExtractor.tryExtract(entity);
-            }
-        }),
-
-    SAMPLE_TYPE(new AbstractColumnDefinitionKind<Sample>(Dict.SAMPLE_TYPE, 150, true)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                return entity.getSampleType().getCode();
-            }
-        }),
-
-    IS_INSTANCE_SAMPLE(new AbstractColumnDefinitionKind<Sample>(Dict.IS_INSTANCE_SAMPLE, true)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                return SimpleYesNoRenderer.render(entity.getDatabaseInstance() != null);
-            }
-        }),
-
-    IS_INVALID(new AbstractColumnDefinitionKind<Sample>(Dict.IS_INVALID, true)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                return renderInvalidationFlag(entity);
-            }
-        }),
-
-    EXPERIMENT(new AbstractColumnDefinitionKind<Sample>(Dict.EXPERIMENT)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                final Experiment exp = entity.getExperiment();
-                return exp == null ? null : exp.getCode();
-            }
-
-            @Override
-            public String tryGetLink(Sample entity)
-            {
-                return LinkExtractor.tryExtract(entity.getExperiment());
-            }
-        }),
-
-    EXPERIMENT_IDENTIFIER(new AbstractColumnDefinitionKind<Sample>(Dict.EXPERIMENT_IDENTIFIER, 200,
-            true)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                final Experiment exp = entity.getExperiment();
-                return exp == null ? null : exp.getIdentifier();
-            }
-
-            @Override
-            public String tryGetLink(Sample entity)
-            {
-                return LinkExtractor.tryExtract(entity.getExperiment());
-            }
-        }),
-
-    PROJECT(new AbstractColumnDefinitionKind<Sample>(Dict.PROJECT)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                final Experiment exp = entity.getExperiment();
-                return exp == null ? null : exp.getProject().getCode();
-            }
-
-            @Override
-            public String tryGetLink(Sample entity)
-            {
-                final Experiment exp = entity.getExperiment();
-                return exp == null ? null : LinkExtractor.tryExtract(exp.getProject());
-            }
-        }),
-
-    REGISTRATOR(new AbstractColumnDefinitionKind<Sample>(Dict.REGISTRATOR)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                return renderRegistrator(entity);
-            }
-        }),
-
-    REGISTRATION_DATE(new AbstractColumnDefinitionKind<Sample>(Dict.REGISTRATION_DATE,
-            AbstractColumnDefinitionKind.DATE_COLUMN_WIDTH)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                return renderRegistrationDate(entity);
-            }
-        }),
-
-    PERM_ID(new AbstractColumnDefinitionKind<Sample>(Dict.PERM_ID, true)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                return entity.getPermId();
-            }
-        }),
-
-    SHOW_DETAILS_LINK(new AbstractColumnDefinitionKind<Sample>(Dict.SHOW_DETAILS_LINK, true)
-        {
-            @Override
-            public String tryGetValue(Sample entity)
-            {
-                return entity.getPermlink();
-            }
-        });
-
-    private final AbstractColumnDefinitionKind<Sample> columnDefinitionKind;
-
-    private CommonSampleColDefKind(AbstractColumnDefinitionKind<Sample> columnDefinitionKind)
-    {
-        this.columnDefinitionKind = columnDefinitionKind;
-    }
-
-    public String id()
-    {
-        return name();
-    }
-
-    public AbstractColumnDefinitionKind<Sample> getDescriptor()
-    {
-        return columnDefinitionKind;
-    }
-
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentContainerSampleColDef.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentContainerSampleColDef.java
deleted file mode 100644
index e10873e432a0283642afab1b243882ad16bd881b..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentContainerSampleColDef.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2008 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample;
-
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
-
-/**
- * @author Izabela Adamczyk
- */
-public class ParentContainerSampleColDef extends AbstractParentSampleColDef
-{
-    private static final String IDENTIFIER = "containerParent";
-
-    // GWT only
-    public ParentContainerSampleColDef()
-    {
-        this(null);
-    }
-
-    public ParentContainerSampleColDef(String headerText)
-    {
-        super(headerText);
-    }
-
-    public String getIdentifier()
-    {
-        return IDENTIFIER;
-    }
-
-    @Override
-    public Sample tryGetParent(Sample sample)
-    {
-        return sample.getContainer();
-    }
-
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java
deleted file mode 100644
index 549ca83249d864f6403b29ed6f881865cc05d469..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2008 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample;
-
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
-
-public class ParentGeneratedFromSampleColDef extends AbstractParentSampleColDef
-{
-    private static final String IDENTIFIER = "generatedFromParent";
-
-    private static final int MAX_PARENTS = 4;
-
-    // GWT only
-    public ParentGeneratedFromSampleColDef()
-    {
-        this(null);
-    }
-
-    public ParentGeneratedFromSampleColDef(String headerText)
-    {
-        super(headerText);
-    }
-
-    public String getIdentifier()
-    {
-        return IDENTIFIER;
-    }
-
-    @Override
-    public Sample tryGetParent(Sample sample)
-    {
-        if (sample.getParents().size() == 1)
-        {
-            return sample.getGeneratedFrom();
-        } else
-        {
-            return null;
-        }
-    }
-
-    @Override
-    protected String tryGetValue(Sample sample)
-    {
-        int parentsSize = sample.getParents().size();
-        if (parentsSize == 0)
-        {
-            return null;
-        } else if (parentsSize == 1)
-        {
-            return super.tryGetValue(sample);
-        } else
-        {
-            StringBuilder sb = new StringBuilder();
-            int counter = 0;
-            for (Sample parent : sample.getParents())
-            {
-                if (counter == MAX_PARENTS)
-                {
-                    sb.append("... (").append(parentsSize - MAX_PARENTS).append(" more)");
-                    break;
-                }
-                sb.append(getAsValue(parent)).append("\n");
-                counter++;
-            }
-            return sb.toString();
-        }
-    }
-
-}
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 0c7b50938e03697470ca26c5d3a496ec27fd9046..559220334f6a3933d9a58ab3776e771f40de1ade 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
@@ -41,7 +41,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Display
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.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.columns.specific.sample.CommonSampleColDefKind;
 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.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
@@ -145,9 +144,9 @@ public class ExperimentBrowserGrid extends
     {
         super(viewContext, GRID_ID, DisplayTypeIDGenerator.ENTITY_BROWSER_GRID);
         this.criteriaProvider = criteriaProvider;
-        registerLinkClickListenerFor(CommonSampleColDefKind.EXPERIMENT_IDENTIFIER.id(),
+        registerLinkClickListenerFor(CommonExperimentColDefKind.EXPERIMENT_IDENTIFIER.id(),
                 showEntityViewerLinkClickListener);
-        registerLinkClickListenerFor(CommonSampleColDefKind.PROJECT.id(),
+        registerLinkClickListenerFor(CommonExperimentColDefKind.PROJECT.id(),
                 new ICellListener<Experiment>()
                     {
                         public void handle(Experiment rowItem, boolean keyPressed)
@@ -265,12 +264,12 @@ public class ExperimentBrowserGrid extends
     {
         ColumnDefsAndConfigs<Experiment> schema =
                 getColumnsFactory().createColumnsSchema(viewContext, criteria.getExperimentType());
-        schema.setGridCellRendererFor(CommonSampleColDefKind.SHOW_DETAILS_LINK.id(),
+        schema.setGridCellRendererFor(CommonExperimentColDefKind.SHOW_DETAILS_LINK.id(),
                 createShowDetailsLinkCellRenderer());
         GridCellRenderer<BaseEntityModel<?>> linkCellRenderer = createInternalLinkCellRenderer();
-        schema.setGridCellRendererFor(CommonSampleColDefKind.EXPERIMENT_IDENTIFIER.id(),
+        schema.setGridCellRendererFor(CommonExperimentColDefKind.EXPERIMENT_IDENTIFIER.id(),
                 linkCellRenderer);
-        schema.setGridCellRendererFor(CommonSampleColDefKind.PROJECT.id(), linkCellRenderer);
+        schema.setGridCellRendererFor(CommonExperimentColDefKind.PROJECT.id(), linkCellRenderer);
         return schema;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserButton.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserButton.java
index 6c06eb8521d1ea9ac179266e2db3f9275b82d04d..e093bd674d9c9af9dfc1b30e6340c8e3e9617696 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserButton.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserButton.java
@@ -30,7 +30,7 @@ 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.SampleTypeDisplayID;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid2;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
@@ -127,7 +127,7 @@ public class SampleChooserButton extends Button implements IChosenEntitySetter<T
             SampleTypeDisplayID sampleTypeDisplayID)
     {
         DisposableEntityChooser<TableModelRowWithObject<Sample>> browser =
-                SampleBrowserGrid2.createChooser(viewContext, addShared, addAll,
+                SampleBrowserGrid.createChooser(viewContext, addShared, addAll,
                         excludeWithoutExperiment, sampleTypeDisplayID);
         String title = viewContext.getMessage(Dict.TITLE_CHOOSE_SAMPLE);
         new EntityChooserDialog<TableModelRowWithObject<Sample>>(browser, chooserSampleSetter, title, viewContext).show();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserField.java
index be142ff7e08a0b9b6223ac56d1bf849d4228ef6b..aad5c9e76a97fc46c940a26dbc435606041d7355 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserField.java
@@ -24,7 +24,7 @@ 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.SampleTypeDisplayID;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid2;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
@@ -130,7 +130,7 @@ public class SampleChooserField extends ChosenEntitySetter<TableModelRowWithObje
             SampleTypeDisplayID sampleTypeDisplayID)
     {
         DisposableEntityChooser<TableModelRowWithObject<Sample>> browser =
-                SampleBrowserGrid2.createChooser(viewContext, addShared, addAll,
+                SampleBrowserGrid.createChooser(viewContext, addShared, addAll,
                         excludeWithoutExperiment, sampleTypeDisplayID);
         String title = viewContext.getMessage(Dict.TITLE_CHOOSE_SAMPLE);
         new EntityChooserDialog<TableModelRowWithObject<Sample>>(browser, chosenSampleField, title, viewContext).show();
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 1c2378b57e7dfdb51190f5b4906517372bf2591c..46723308627c0db170ed3cc98613a82147420b2b 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
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008 ETH Zuerich, CISD
+ * Copyright 2010 ETH Zuerich, CISD
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,8 +16,11 @@
 
 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;
 import java.util.Set;
@@ -25,9 +28,9 @@ import java.util.Set;
 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.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;
@@ -41,18 +44,16 @@ 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.model.SampleModelFactory;
 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.sample.AbstractParentSampleColDef;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.CommonSampleColDefKind;
-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.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.IDisposableComponent;
 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;
@@ -60,16 +61,16 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.en
 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.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;
-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.ListSampleDisplayCriteria2;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleGridColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
+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.DatabaseModificationKind;
@@ -77,20 +78,20 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKin
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 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;
 
 /**
- * A {@link LayoutContainer} which contains the grid where the samples are displayed.
- * 
- * @author Christian Ribeaud
- * @author Tomasz Pylak
+ * Grid showing {@link Sample} instances.
+ *
+ * @author Franz-Josef Elmer
  */
-public class SampleBrowserGrid extends
-        AbstractEntityBrowserGrid<Sample, BaseEntityModel<Sample>, ListSampleDisplayCriteria>
+public class SampleBrowserGrid extends TypedTableGrid<Sample>
 {
     private static final String PREFIX = GenericConstants.ID_PREFIX + "sample-browser";
 
@@ -99,14 +100,17 @@ public class SampleBrowserGrid extends
 
     public static final String MAIN_GRID_ID = createGridId(MAIN_BROWSER_ID);
 
-    public static final String GRID_ID_SUFFIX = "_grid";
-
     public static final String EDIT_BUTTON_ID_SUFFIX = "_edit-button";
 
     public static final String SHOW_DETAILS_BUTTON_ID_SUFFIX = "_show-details-button";
 
+    public static final String createGridId(final String browserId)
+    {
+        return browserId + GRID_POSTFIX;
+    }
+
     /** Creates a grid without additional toolbar buttons. It can serve as a entity chooser. */
-    public static DisposableEntityChooser<Sample> createChooser(
+    public static DisposableEntityChooser<TableModelRowWithObject<Sample>> createChooser(
             final IViewContext<ICommonClientServiceAsync> viewContext, final boolean addShared,
             boolean addAll, final boolean excludeWithoutExperiment, SampleTypeDisplayID sampleTypeID)
     {
@@ -119,7 +123,7 @@ public class SampleBrowserGrid extends
                         DisplayTypeIDGenerator.ENTITY_BROWSER_GRID)
                     {
                         @Override
-                        protected void showEntityViewer(Sample sample, boolean editMode,
+                        protected void showEntityViewer(TableModelRowWithObject<Sample> row, boolean editMode,
                                 boolean active)
                         {
                             // do nothing - avoid showing the details after double click
@@ -309,9 +313,6 @@ public class SampleBrowserGrid extends
 
     }
 
-    // property types used in the previous refresh operation or null if it has not occurred yet
-    private List<PropertyType> previousPropertyTypes;
-
     // provides property types which will be used to build property columns in the grid and
     // criteria to filter samples
     private final ISampleCriteriaProvider propertyTypesAndCriteriaProvider;
@@ -322,69 +323,293 @@ public class SampleBrowserGrid extends
             ISampleCriteriaProvider criteriaProvider, String browserId,
             boolean refreshAutomatically, IDisplayTypeIDGenerator displayTypeIDGenerator)
     {
-        super(viewContext, createGridId(browserId), refreshAutomatically, displayTypeIDGenerator);
-        this.propertyTypesAndCriteriaProvider = criteriaProvider;
-        this.previousPropertyTypes = null;
+        super(viewContext, browserId, displayTypeIDGenerator);
+        propertyTypesAndCriteriaProvider = criteriaProvider;
+        linkSample();
+        linkExperiment();
+        linkProject();
+        linkParent();
+        linkContainer();
+    }
 
-        registerLinkClickListenerFor(CommonSampleColDefKind.SUBCODE.id(),
-                showEntityViewerLinkClickListener);
-        registerLinkClickListenerFor(CommonSampleColDefKind.SAMPLE_IDENTIFIER.id(),
-                showEntityViewerLinkClickListener);
-        ICellListener<Sample> experimentClickListener = new OpenEntityDetailsTabCellClickListener()
-            {
-                @Override
-                protected IEntityInformationHolderWithPermId getEntity(Sample rowItem)
-                {
-                    return rowItem.getExperiment();
-                }
-            };
-        registerLinkClickListenerFor(CommonSampleColDefKind.EXPERIMENT.id(),
-                experimentClickListener);
-        registerLinkClickListenerFor(CommonSampleColDefKind.EXPERIMENT_IDENTIFIER.id(),
-                experimentClickListener);
-        registerLinkClickListenerFor(CommonSampleColDefKind.PROJECT.id(),
-                new ICellListener<Sample>()
+    @Override
+    public String getGridDisplayTypeID()
+    {
+        ListSampleDisplayCriteria criteria = getCriteriaProvider().tryGetCriteria();
+        String suffix = createDisplayIdSuffix(EntityKind.SAMPLE, criteria == null ? null : criteria.tryGetSampleType());
+        return createGridDisplayTypeID(suffix);
+    }
+    
+    private static String createDisplayIdSuffix(EntityKind entityKindOrNull,
+            EntityType entityTypeOrNull)
+    {
+        String suffix = "";
+        if (entityKindOrNull != null)
+        {
+            suffix += "-" + entityKindOrNull.toString();
+        }
+        if (entityTypeOrNull != null)
+        {
+            suffix += "-" + entityTypeOrNull.getCode();
+        }
+        return suffix;
+    }
+    
+    private void linkSample()
+    {
+        ICellListenerAndLinkGenerator<Sample> listenerLinkGenerator =
+                new ICellListenerAndLinkGenerator<Sample>()
+                    {
+                        public void handle(TableModelRowWithObject<Sample> rowItem,
+                                boolean specialKeyPressed)
+                        {
+                            showEntityInformationHolderViewer(rowItem.getObjectOrNull(), false, specialKeyPressed);
+                        }
+
+                        public String tryGetLink(Sample entity,
+                                ISerializableComparable comparableValue)
+                        {
+                            return LinkExtractor.tryExtract(entity);
+                        }
+                    };
+        registerListenerAndLinkGenerator(SampleGridColumnIDs.CODE, listenerLinkGenerator);
+        registerListenerAndLinkGenerator(SampleGridColumnIDs.SUBCODE, listenerLinkGenerator);
+        registerListenerAndLinkGenerator(SampleGridColumnIDs.SAMPLE_IDENTIFIER,
+                listenerLinkGenerator);
+    }
+
+    private void linkExperiment()
+    {
+        ICellListenerAndLinkGenerator<Sample> listenerLinkGenerator =
+                new ICellListenerAndLinkGenerator<Sample>()
+                    {
+                        public void handle(TableModelRowWithObject<Sample> rowItem,
+                                boolean specialKeyPressed)
+                        {
+                            Experiment experiment = rowItem.getObjectOrNull().getExperiment();
+                            new OpenEntityDetailsTabAction(experiment, viewContext,
+                                    specialKeyPressed).execute();
+                        }
+
+                        public String tryGetLink(Sample entity,
+                                ISerializableComparable comparableValue)
+                        {
+                            return LinkExtractor.tryExtract(entity.getExperiment());
+                        }
+                    };
+        registerListenerAndLinkGenerator(SampleGridColumnIDs.EXPERIMENT, listenerLinkGenerator);
+        registerListenerAndLinkGenerator(SampleGridColumnIDs.EXPERIMENT_IDENTIFIER,
+                listenerLinkGenerator);
+    }
+    
+    private void linkProject()
+    {
+        registerListenerAndLinkGenerator(SampleGridColumnIDs.PROJECT,
+                new ICellListenerAndLinkGenerator<Sample>()
                     {
-                        public void handle(Sample rowItem, boolean keyPressed)
+                        public void handle(TableModelRowWithObject<Sample> rowItem,
+                                boolean specialKeyPressed)
                         {
-                            final Project project = rowItem.getExperiment().getProject();
+                            final Project project =
+                                    rowItem.getObjectOrNull().getExperiment().getProject();
                             final String href = LinkExtractor.tryExtract(project);
-                            OpenEntityDetailsTabHelper.open(viewContext, project, keyPressed, href);
+                            OpenEntityDetailsTabHelper.open(viewContext, project,
+                                    specialKeyPressed, href);
+                        }
+
+                        public String tryGetLink(Sample entity,
+                                ISerializableComparable comparableValue)
+                        {
+                            final Experiment exp = entity.getExperiment();
+                            return exp == null ? null : LinkExtractor.tryExtract(exp.getProject());
                         }
                     });
-        setId(browserId);
     }
 
-    public static final String createGridId(final String browserId)
+    private void linkParent()
     {
-        return browserId + GRID_ID_SUFFIX;
+        registerListenerAndLinkGenerator(SampleGridColumnIDs.PARENTS,
+                new ICellListenerAndLinkGenerator<Sample>()
+                    {
+                        public void handle(TableModelRowWithObject<Sample> rowItem,
+                                boolean specialKeyPressed)
+                        {
+                            Sample parent = getParentOrNull(rowItem.getObjectOrNull());
+                            if (parent != null)
+                            {
+                                showEntityInformationHolderViewer(parent, false, specialKeyPressed);
+                            }
+                        }
+
+                        public String tryGetLink(Sample entity,
+                                ISerializableComparable comparableValue)
+                        {
+                            Sample parent = getParentOrNull(entity);
+                            return LinkExtractor.tryExtract(parent);
+                        }
+
+                        private Sample getParentOrNull(Sample entity)
+                        {
+                            if (entity.getParents().size() == 1)
+                            {
+                                return entity.getGeneratedFrom();
+                            }
+                            return null;
+                        }
+                    });
     }
 
-    public static final String createChildComponentId(final String browserId,
-            final String childSuffix)
+    private void linkContainer()
     {
-        return browserId + childSuffix;
+        registerListenerAndLinkGenerator(SampleGridColumnIDs.CONTAINER_SAMPLE,
+                new ICellListenerAndLinkGenerator<Sample>()
+                    {
+                        public void handle(TableModelRowWithObject<Sample> rowItem,
+                                boolean specialKeyPressed)
+                        {
+                            showEntityInformationHolderViewer(rowItem.getObjectOrNull().getContainer(), false,
+                                    specialKeyPressed);
+                        }
+
+                        public String tryGetLink(Sample entity,
+                                ISerializableComparable comparableValue)
+                        {
+                            Sample container = entity.getContainer();
+                            return LinkExtractor.tryExtract(container);
+                        }
+                    });
     }
 
-    private final String createChildComponentId(final String childSuffix)
+    
+
+    @Override
+    protected GridCellRenderer<BaseEntityModel<?>> createInternalLinkCellRenderer()
     {
-        return createChildComponentId(getId(), childSuffix);
+        return LinkRenderer.createLinkRenderer(true);
+    }
+
+    @Override
+    protected String translateColumnIdToDictionaryKey(String columnID)
+    {
+        return columnID.toLowerCase();
+    }
+
+    @Override
+    protected ColumnDefsAndConfigs<TableModelRowWithObject<Sample>> createColumnsDefinition()
+    {
+        ColumnDefsAndConfigs<TableModelRowWithObject<Sample>> definitions =
+                super.createColumnsDefinition();
+        definitions.setGridCellRendererFor(SampleGridColumnIDs.REGISTRATOR,
+                PersonRenderer.REGISTRATOR_RENDERER);
+        definitions.setGridCellRendererFor(SampleGridColumnIDs.SHOW_DETAILS_LINK_COLUMN_NAME,
+                createShowDetailsLinkCellRenderer());
+        return definitions;
+    }
+
+    protected final GridCellRenderer<BaseEntityModel<?>> createShowDetailsLinkCellRenderer()
+    {
+        return LinkRenderer.createExternalLinkRenderer(viewContext
+                .getMessage(Dict.SHOW_DETAILS_LINK_TEXT_VALUE));
+
     }
 
-    private abstract class OpenEntityDetailsTabCellClickListener implements ICellListener<Sample>
+    @Override
+    protected List<String> getColumnIdsOfFilters()
     {
-        protected abstract IEntityInformationHolderWithPermId getEntity(Sample rowItem);
+        return Arrays.asList(SampleGridColumnIDs.CODE, SampleGridColumnIDs.EXPERIMENT, SampleGridColumnIDs.PROJECT);
+    }
 
-        public final void handle(Sample rowItem, boolean keyPressed)
+    @Override
+    protected void listTableRows(
+            DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> resultSetConfig,
+            AsyncCallback<TypedTableResultSet<Sample>> callback)
+    {
+        ListSampleDisplayCriteria c1 = getCriteriaProvider().tryGetCriteria();
+        ListSampleDisplayCriteria2 criteria;
+        if (c1.getCriteriaKind() == ListEntityDisplayCriteriaKind.BROWSE)
         {
-            // don't need to check whether the value is null
-            // because there will not be a link for null value
-            final IEntityInformationHolderWithPermId entity = getEntity(rowItem);
-            new OpenEntityDetailsTabAction(entity, viewContext, keyPressed).execute();
+            criteria = new ListSampleDisplayCriteria2(c1.getBrowseCriteria());
+        } else
+        {
+            criteria = new ListSampleDisplayCriteria2(c1.getSearchCriteria());
         }
+        criteria.copyPagingConfig(resultSetConfig);
+        viewContext.getService().listSamples2(criteria, callback);
+    }
+
+    @Override
+    protected void prepareExportEntities(
+            TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria,
+            AbstractAsyncCallback<String> callback)
+    {
+        viewContext.getService().prepareExportSamples(exportCriteria, callback);
+    }
+
+    @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;
     }
 
     @Override
+    public void update(Set<DatabaseModificationKind> observedModifications)
+    {
+        getCriteriaProvider().update(observedModifications, new IDataRefreshCallback()
+            {
+                public void postRefresh(boolean wasSuccessful)
+                {
+                }
+            });
+        super.update(observedModifications);
+    }
+
+    /**
+     * Initializes criteria and refreshes the grid when criteria are fetched. <br>
+     * Note that in this way we do not refresh the grid automatically, but we wait until all the
+     * property types will be fetched from the server (criteria provider will be updated), to set
+     * the available grid columns.
+     */
+    protected void updateCriteriaProviderAndRefresh()
+    {
+        HashSet<DatabaseModificationKind> observedModifications =
+                new HashSet<DatabaseModificationKind>();
+        getCriteriaProvider().update(observedModifications, new IDataRefreshCallback()
+            {
+                public void postRefresh(boolean wasSuccessful)
+                {
+                    refresh();
+                }
+            });
+    }
+
+    private void addGridRefreshListener(SampleBrowserToolbar topToolbar)
+    {
+        topToolbar.setCriteriaChangedListeners(createGridRefreshDelegatedAction());
+    }
+
     protected ICriteriaProvider<ListSampleDisplayCriteria> getCriteriaProvider()
     {
         return propertyTypesAndCriteriaProvider;
@@ -433,12 +658,14 @@ public class SampleBrowserGrid extends
         final Button deleteButton = new Button(deleteAllTitle, new AbstractCreateDialogListener()
             {
                 @Override
-                protected Dialog createDialog(List<Sample> samples,
+                protected Dialog createDialog(List<TableModelRowWithObject<Sample>> samples,
                         IBrowserGridActionInvoker invoker)
                 {
-                    return new SampleListDeletionConfirmationDialog<Sample>(viewContext, samples,
-                            createDeletionCallback(invoker), getDisplayedAndSelectedItemsAction()
-                                    .execute());
+                    AsyncCallback<Void> callback = createDeletionCallback(invoker);
+                    DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>> s =
+                            getDisplayedAndSelectedItemsAction().execute();
+                    return new SampleListDeletionConfirmationDialog<TableModelRowWithObject<Sample>>(
+                            viewContext, samples, callback, s);
                 }
             });
         changeButtonTitleOnSelectedItems(deleteButton, deleteAllTitle, deleteTitle);
@@ -446,6 +673,31 @@ public class SampleBrowserGrid extends
         allowMultipleSelection(); // we allow deletion of multiple samples
     }
 
+    protected final IDelegatedActionWithResult<DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>>> getDisplayedAndSelectedItemsAction()
+    {
+        return new IDelegatedActionWithResult<DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>>>()
+            {
+                public DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>> execute()
+                {
+                    TableExportCriteria<TableModelRowWithObject<Sample>> tableExportCriteria =
+                            createTableExportCriteria();
+                    List<TableModelRowWithObject<Sample>> selectedBaseObjects = getSelectedBaseObjects();
+                    return new DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>>(selectedBaseObjects,
+                            tableExportCriteria, getTotalCount());
+                }
+            };
+    }
+    public static final String createChildComponentId(final String browserId,
+            final String childSuffix)
+    {
+        return browserId + childSuffix;
+    }
+
+    private final String createChildComponentId(final String childSuffix)
+    {
+        return createChildComponentId(getId(), childSuffix);
+    }
+
     private void openSampleRegistrationTab()
     {
         if (experimentIdOrNull != null)
@@ -488,206 +740,22 @@ public class SampleBrowserGrid extends
         }
     }
 
-    private void addGridRefreshListener(SampleBrowserToolbar topToolbar)
-    {
-        topToolbar.setCriteriaChangedListeners(createGridRefreshDelegatedAction());
-    }
-
-    @Override
-    protected EntityType tryToGetEntityType()
-    {
-        return criteria == null ? null : criteria.tryGetSampleType();
-    }
-
-    @Override
-    protected void refresh()
-    {
-        super.refresh();
-        previousPropertyTypes = propertyTypesAndCriteriaProvider.tryGetPropertyTypes();
-    }
-
-    @Override
-    protected void listEntities(DefaultResultSetConfig<String, Sample> resultSetConfig,
-            final AbstractAsyncCallback<ResultSet<Sample>> callback)
-    {
-        AbstractAsyncCallback<ResultSetWithEntityTypes<Sample>> extendedCallback =
-                new AbstractAsyncCallback<ResultSetWithEntityTypes<Sample>>(viewContext)
-                    {
-                        @Override
-                        protected void process(ResultSetWithEntityTypes<Sample> result)
-                        {
-                            propertyTypesAndCriteriaProvider
-                                    .setEntityTypes(extractAvailableSampleTypes(result));
-                            callback.onSuccess(result.getResultSet());
-                            refreshColumnsSettingsIfNecessary();
-                            previousPropertyTypes =
-                                    propertyTypesAndCriteriaProvider.tryGetPropertyTypes();
-                        }
-
-                        private Set<SampleType> extractAvailableSampleTypes(
-                                ResultSetWithEntityTypes<Sample> result)
-                        {
-                            Set<SampleType> sampleTypes = new HashSet<SampleType>();
-                            for (BasicEntityType basicType : result.getAvailableEntityTypes())
-                            {
-                                assert basicType instanceof SampleType;
-                                sampleTypes.add((SampleType) basicType);
-                            }
-                            return sampleTypes;
-                        }
-
-                        @Override
-                        public void finishOnFailure(Throwable caught)
-                        {
-                            callback.finishOnFailure(caught);
-                        }
-
-                    };
-        criteria.copyPagingConfig(resultSetConfig);
-        viewContext.getService().listSamples(criteria, extendedCallback);
-    }
-
     @Override
-    protected BaseEntityModel<Sample> createModel(GridRowModel<Sample> entity)
+    protected void showEntityViewer(TableModelRowWithObject<Sample> row, boolean editMode, boolean inBackground)
     {
-        return SampleModelFactory.createModel(viewContext, entity, criteria.tryGetSampleType(),
-                viewContext.getDisplaySettingsManager().getRealNumberFormatingParameters());
+        showEntityInformationHolderViewer(row.getObjectOrNull(), editMode, inBackground);
     }
-
-    @Override
-    protected List<IColumnDefinition<Sample>> getInitialFilters()
+    
+    protected final IDelegatedAction createGridRefreshDelegatedAction()
     {
-        return asColumnFilters(new CommonSampleColDefKind[]
-            { CommonSampleColDefKind.CODE, CommonSampleColDefKind.EXPERIMENT,
-                    CommonSampleColDefKind.PROJECT });
-    }
-
-    @Override
-    protected void showEntityViewer(Sample sample, boolean editMode, boolean inBackground)
-    {
-        showEntityInformationHolderViewer(sample, editMode, inBackground);
-    }
-
-    @Override
-    protected void prepareExportEntities(TableExportCriteria<Sample> exportCriteria,
-            AbstractAsyncCallback<String> callback)
-    {
-        viewContext.getService().prepareExportSamples(exportCriteria, callback);
-    }
-
-    @Override
-    protected ColumnDefsAndConfigs<Sample> createColumnsDefinition()
-    {
-        assert criteria != null : "criteria not set!";
-        final List<PropertyType> propertyTypes =
-                propertyTypesAndCriteriaProvider.tryGetPropertyTypes();
-        assert propertyTypes != null : "propertyTypes not set!";
-
-        final List<AbstractParentSampleColDef> parentColumnsSchema =
-                SampleModelFactory.createParentColumnsSchema(viewContext,
-                        criteria.tryGetSampleType());
-        assert parentColumnsSchema != null : "parentColumnsSchema not set!";
-
-        ColumnDefsAndConfigs<Sample> schema =
-                SampleModelFactory.createColumnsSchema(viewContext, propertyTypes,
-                        parentColumnsSchema);
-
-        schema.setGridCellRendererFor(CommonSampleColDefKind.SHOW_DETAILS_LINK.id(),
-                createShowDetailsLinkCellRenderer());
-
-        GridCellRenderer<BaseEntityModel<?>> linkCellRenderer = createInternalLinkCellRenderer();
-        schema.setGridCellRendererFor(CommonSampleColDefKind.SUBCODE.id(), linkCellRenderer);
-        schema.setGridCellRendererFor(CommonSampleColDefKind.SAMPLE_IDENTIFIER.id(),
-                linkCellRenderer);
-        schema.setGridCellRendererFor(CommonSampleColDefKind.EXPERIMENT.id(), linkCellRenderer);
-        schema.setGridCellRendererFor(CommonSampleColDefKind.EXPERIMENT_IDENTIFIER.id(),
-                linkCellRenderer);
-        schema.setGridCellRendererFor(CommonSampleColDefKind.PROJECT.id(), linkCellRenderer);
-        // setup link renderers and listeners on parent columns
-        GridCellRenderer<BaseEntityModel<?>> parentLinkCellRenderer =
-                createParentLinkCellRenderer();
-        for (final AbstractParentSampleColDef parentColDef : parentColumnsSchema)
-        {
-            schema.setGridCellRendererFor(parentColDef.getIdentifier(), parentLinkCellRenderer);
-            registerLinkClickListenerFor(parentColDef.getIdentifier(),
-                    new OpenEntityDetailsTabCellClickListener()
-                        {
-                            @Override
-                            protected IEntityInformationHolderWithPermId getEntity(Sample rowItem)
-                            {
-                                return parentColDef.tryGetParent(rowItem);
-                            }
-                        });
-        }
-
-        return schema;
-    }
-
-    protected final GridCellRenderer<BaseEntityModel<?>> createParentLinkCellRenderer()
-    {
-        return LinkRenderer.createLinkRenderer(true);
-    }
-
-    @Override
-    protected boolean hasColumnsDefinitionChanged(ListSampleDisplayCriteria newCriteria)
-    {
-        List<PropertyType> newPropertyTypes =
-                propertyTypesAndCriteriaProvider.tryGetPropertyTypes();
-        if (newPropertyTypes == null)
-        {
-            return false; // we are before the first auto-refresh
-        }
-        if (previousPropertyTypes == null)
-        {
-            return true; // first refresh
-        }
-        if (previousPropertyTypes.equals(newPropertyTypes) == false)
-        {
-            return true;
-        }
-        EntityType newEntityType = newCriteria.tryGetSampleType();
-        EntityType prevEntityType = (criteria == null ? null : criteria.tryGetSampleType());
-        return hasColumnsDefinitionChanged(newEntityType, prevEntityType);
-    }
-
-    @Override
-    protected Set<DatabaseModificationKind> getGridRelevantModifications()
-    {
-        Set<DatabaseModificationKind> result = getGridRelevantModifications(ObjectKind.SAMPLE);
-        result.add(edit(ObjectKind.PROJECT));
-        return result;
-    }
-
-    @Override
-    protected IColumnDefinitionKind<Sample>[] getStaticColumnsDefinition()
-    {
-        return CommonSampleColDefKind.values();
-    }
-
-    @Override
-    protected EntityKind getEntityKind()
-    {
-        return EntityKind.SAMPLE;
-    }
-
-    public final class DisplayedAndSelectedSamples extends DisplayedAndSelectedEntities<Sample>
-    {
-        public DisplayedAndSelectedSamples(List<Sample> selectedItems,
-                TableExportCriteria<Sample> displayedItemsConfig, int displayedItemsCount)
-        {
-            super(selectedItems, displayedItemsConfig, displayedItemsCount);
-        }
-
-    }
-
-    protected final IDelegatedActionWithResult<DisplayedAndSelectedSamples> getDisplayedAndSelectedItemsAction()
-    {
-        return new IDelegatedActionWithResult<DisplayedAndSelectedSamples>()
+        return new IDelegatedAction()
             {
-                public DisplayedAndSelectedSamples execute()
+                public void execute()
                 {
-                    return new DisplayedAndSelectedSamples(getSelectedBaseObjects(),
-                            createTableExportCriteria(), getTotalCount());
+                    if (getCriteriaProvider().tryGetCriteria() != null)
+                    {
+                        refreshGridWithFilters();
+                    }
                 }
             };
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid2.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid2.java
deleted file mode 100644
index 3d495dafbd69b5f7ba29602068289dfa44a5fa48..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid2.java
+++ /dev/null
@@ -1,763 +0,0 @@
-/*
- * Copyright 2010 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.systemsx.cisd.openbis.generic.client.web.client.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;
-import java.util.Set;
-
-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 com.google.gwt.user.client.rpc.AsyncCallback;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-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.ComponentProvider;
-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.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.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.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.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;
-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.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;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListSampleDisplayCriteria2;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleGridColumnIDs;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
-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.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.ISerializableComparable;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
-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;
-
-/**
- * 
- *
- * @author Franz-Josef Elmer
- */
-public class SampleBrowserGrid2 extends TypedTableGrid<Sample>
-{
-    private static final String PREFIX = GenericConstants.ID_PREFIX + "sample-browser";
-
-    // browser consists of the grid and additional toolbars (paging, filtering)
-    public static final String MAIN_BROWSER_ID = PREFIX + "_main";
-
-    public static final String MAIN_GRID_ID = createGridId(MAIN_BROWSER_ID);
-
-    public static final String EDIT_BUTTON_ID_SUFFIX = "_edit-button";
-
-    public static final String SHOW_DETAILS_BUTTON_ID_SUFFIX = "_show-details-button";
-
-    public static final String createGridId(final String browserId)
-    {
-        return browserId + GRID_POSTFIX;
-    }
-
-    /** Creates a grid without additional toolbar buttons. It can serve as a entity chooser. */
-    public static DisposableEntityChooser<TableModelRowWithObject<Sample>> createChooser(
-            final IViewContext<ICommonClientServiceAsync> viewContext, final boolean addShared,
-            boolean addAll, final boolean excludeWithoutExperiment, SampleTypeDisplayID sampleTypeID)
-    {
-        final SampleBrowserToolbar toolbar =
-                new SampleBrowserToolbar(viewContext, addShared, addAll, excludeWithoutExperiment,
-                        sampleTypeID);
-        ISampleCriteriaProvider criteriaProvider = toolbar;
-        final SampleBrowserGrid2 browserGrid =
-                new SampleBrowserGrid2(viewContext, criteriaProvider, MAIN_BROWSER_ID, false,
-                        DisplayTypeIDGenerator.ENTITY_BROWSER_GRID)
-                    {
-                        @Override
-                        protected void showEntityViewer(TableModelRowWithObject<Sample> row, boolean editMode,
-                                boolean active)
-                        {
-                            // do nothing - avoid showing the details after double click
-                        }
-                    };
-        browserGrid.addGridRefreshListener(toolbar);
-        return browserGrid.asDisposableWithToolbar(toolbar);
-    }
-
-    /**
-     * Create a grid with a toolbar with no initial selection and optional initial selection of
-     * sample type and group.
-     */
-    public static IDisposableComponent create(IViewContext<ICommonClientServiceAsync> viewContext,
-            String initialGroupOrNull, String initialSampleTypeOrNull)
-    {
-        final SampleBrowserToolbar toolbar =
-                new SampleBrowserToolbar(viewContext, true, true, false, initialGroupOrNull,
-                        initialSampleTypeOrNull, SampleTypeDisplayID.MAIN_SAMPLE_BROWSER);
-        ISampleCriteriaProvider criteriaProvider = toolbar;
-        final SampleBrowserGrid2 browserGrid =
-                new SampleBrowserGrid2(viewContext, criteriaProvider, MAIN_BROWSER_ID, false,
-                        DisplayTypeIDGenerator.ENTITY_BROWSER_GRID);
-        browserGrid.addGridRefreshListener(toolbar);
-        browserGrid.extendBottomToolbar();
-        return browserGrid.asDisposableWithToolbar(toolbar);
-    }
-
-    public static IDisposableComponent createGridForContainerSamples(
-            final IViewContext<ICommonClientServiceAsync> viewContext,
-            final TechId containerSampleId, final String browserId, final SampleType sampleType)
-    {
-        final ListSampleDisplayCriteria criteria =
-                ListSampleDisplayCriteria.createForContainer(containerSampleId);
-        return createGridForRelatedSamples(viewContext, criteria, browserId, sampleType);
-    }
-
-    public static IDisposableComponent createGridForDerivedSamples(
-            final IViewContext<ICommonClientServiceAsync> viewContext, final TechId parentSampleId,
-            final String browserId, final SampleType sampleType)
-    {
-        final ListSampleDisplayCriteria criteria =
-                ListSampleDisplayCriteria.createForParent(parentSampleId);
-        return createGridForRelatedSamples(viewContext, criteria, browserId, sampleType);
-    }
-
-    public static IDisposableComponent createGridForParentSamples(
-            final IViewContext<ICommonClientServiceAsync> viewContext, final TechId childSampleId,
-            final String browserId, final SampleType sampleType)
-    {
-        final ListSampleDisplayCriteria criteria =
-                ListSampleDisplayCriteria.createForChild(childSampleId);
-        return createGridForRelatedSamples(viewContext, criteria, browserId, sampleType);
-    }
-
-    private static IDisposableComponent createGridForRelatedSamples(
-            final IViewContext<ICommonClientServiceAsync> viewContext,
-            final ListSampleDisplayCriteria criteria, final String browserId,
-            final SampleType sampleType)
-    {
-        final String entityTypeCode = sampleType.getCode();
-        final SampleBrowserGrid2 browserGrid =
-                createGridAsComponent(viewContext, browserId, criteria, entityTypeCode,
-                        DisplayTypeIDGenerator.SAMPLE_DETAILS_GRID);
-        browserGrid.updateCriteriaProviderAndRefresh();
-        browserGrid.extendBottomToolbar();
-        return browserGrid.asDisposableWithoutToolbar();
-    }
-
-    public static IDisposableComponent createGridForExperimentSamples(
-            final IViewContext<ICommonClientServiceAsync> viewContext, final TechId experimentId,
-            final String browserId, final BasicEntityType experimentType)
-    {
-        final ListSampleDisplayCriteria criteria =
-                ListSampleDisplayCriteria.createForExperiment(experimentId);
-        final String entityTypeCode = experimentType.getCode();
-
-        final SampleBrowserGrid2 browserGrid =
-                createGridAsComponent(viewContext, browserId, criteria, entityTypeCode,
-                        DisplayTypeIDGenerator.EXPERIMENT_DETAILS_GRID);
-        browserGrid.experimentIdOrNull = experimentId;
-        browserGrid.updateCriteriaProviderAndRefresh();
-        browserGrid.extendBottomToolbar();
-        return browserGrid.asDisposableWithoutToolbar();
-    }
-
-    private static SampleBrowserGrid2 createGridAsComponent(
-            final IViewContext<ICommonClientServiceAsync> viewContext, final String browserId,
-            final ListSampleDisplayCriteria criteria, final String entityTypeCode,
-            DisplayTypeIDGenerator displayTypeIDGenerator)
-    {
-        ISampleCriteriaProvider criteriaProvider =
-                new SampleCriteriaProvider(viewContext, criteria);
-        // we do not refresh the grid, the criteria provider will do this when property types will
-        // be loaded
-        boolean refreshAutomatically = false;
-        final SampleBrowserGrid2 browserGrid =
-                new SampleBrowserGrid2(viewContext, criteriaProvider, browserId,
-                        refreshAutomatically, displayTypeIDGenerator)
-                    {
-                        @Override
-                        public String getGridDisplayTypeID()
-                        {
-                            return super.getGridDisplayTypeID() + "-" + entityTypeCode;
-                        }
-                    };
-        return browserGrid;
-    }
-
-    /**
-     * Besides providing the static {@link ListSampleCriteria} this class provides all property
-     * types which should be used to build the grid property columns. It is also able to refresh
-     * these properties from the server.
-     */
-    protected static class SampleCriteriaProvider implements ISampleCriteriaProvider
-    {
-        private final ICriteriaProvider<PropertyTypesCriteria> propertyTypeProvider;
-
-        private final ListSampleDisplayCriteria criteria;
-
-        // 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<SampleType> shownEntityTypesOrNull;
-
-        public SampleCriteriaProvider(IViewContext<?> viewContext,
-                ListSampleDisplayCriteria criteria)
-        {
-            this.propertyTypeProvider =
-                    createPropertyTypesCriteriaProvider(viewContext, EntityKind.SAMPLE);
-            this.criteria = criteria;
-        }
-
-        /*
-         * Provides property types which should be shown as the grid columns. Takes into account
-         * what types of entities are displayed and does not show property types which are not
-         * assigned to any of those types.
-         */
-        private ICriteriaProvider<PropertyTypesCriteria> createPropertyTypesCriteriaProvider(
-                IViewContext<?> viewContext, final EntityKind entityKind)
-        {
-            return new PropertyTypesCriteriaProvider(viewContext, entityKind)
-                {
-                    @Override
-                    public PropertyTypesCriteria tryGetCriteria()
-                    {
-                        PropertyTypesCriteria propertyTypesCriteria = super.tryGetCriteria();
-                        return PropertyTypesFilterUtil.filterPropertyTypesForEntityTypes(
-                                propertyTypesCriteria, entityKind, shownEntityTypesOrNull);
-                    }
-                };
-        }
-
-        public List<PropertyType> tryGetPropertyTypes()
-        {
-            PropertyTypesCriteria propertyTypesCriteria = propertyTypeProvider.tryGetCriteria();
-            if (propertyTypesCriteria != null)
-            {
-                return propertyTypesCriteria.tryGetPropertyTypes();
-            } else
-            {
-                return null;
-            }
-        }
-
-        public ListSampleDisplayCriteria tryGetCriteria()
-        {
-            return criteria;
-        }
-
-        public void update(Set<DatabaseModificationKind> observedModifications,
-                IDataRefreshCallback dataRefreshCallback)
-        {
-            propertyTypeProvider.update(observedModifications, dataRefreshCallback);
-        }
-
-        public DatabaseModificationKind[] getRelevantModifications()
-        {
-            return propertyTypeProvider.getRelevantModifications();
-        }
-
-        public void setEntityTypes(Set<SampleType> entityTypes)
-        {
-            criteria.setAllSampleType(SampleType.createAllSampleType(entityTypes, false));
-            this.shownEntityTypesOrNull = entityTypes;
-        }
-
-    }
-
-    // provides property types which will be used to build property columns in the grid and
-    // criteria to filter samples
-    private final ISampleCriteriaProvider propertyTypesAndCriteriaProvider;
-
-    private TechId experimentIdOrNull;
-
-    protected SampleBrowserGrid2(final IViewContext<ICommonClientServiceAsync> viewContext,
-            ISampleCriteriaProvider criteriaProvider, String browserId,
-            boolean refreshAutomatically, IDisplayTypeIDGenerator displayTypeIDGenerator)
-    {
-        super(viewContext, browserId, displayTypeIDGenerator);
-        propertyTypesAndCriteriaProvider = criteriaProvider;
-        linkSample();
-        linkExperiment();
-        linkProject();
-        linkParent();
-        linkContainer();
-    }
-
-    @Override
-    public String getGridDisplayTypeID()
-    {
-        ListSampleDisplayCriteria criteria = getCriteriaProvider().tryGetCriteria();
-        String suffix = createDisplayIdSuffix(EntityKind.SAMPLE, criteria == null ? null : criteria.tryGetSampleType());
-        return createGridDisplayTypeID(suffix);
-    }
-    
-    private static String createDisplayIdSuffix(EntityKind entityKindOrNull,
-            EntityType entityTypeOrNull)
-    {
-        String suffix = "";
-        if (entityKindOrNull != null)
-        {
-            suffix += "-" + entityKindOrNull.toString();
-        }
-        if (entityTypeOrNull != null)
-        {
-            suffix += "-" + entityTypeOrNull.getCode();
-        }
-        return suffix;
-    }
-    
-    private void linkSample()
-    {
-        ICellListenerAndLinkGenerator<Sample> listenerLinkGenerator =
-                new ICellListenerAndLinkGenerator<Sample>()
-                    {
-                        public void handle(TableModelRowWithObject<Sample> rowItem,
-                                boolean specialKeyPressed)
-                        {
-                            showEntityInformationHolderViewer(rowItem.getObjectOrNull(), false, specialKeyPressed);
-                        }
-
-                        public String tryGetLink(Sample entity,
-                                ISerializableComparable comparableValue)
-                        {
-                            return LinkExtractor.tryExtract(entity);
-                        }
-                    };
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.CODE, listenerLinkGenerator);
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.SUBCODE, listenerLinkGenerator);
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.SAMPLE_IDENTIFIER,
-                listenerLinkGenerator);
-    }
-
-    private void linkExperiment()
-    {
-        ICellListenerAndLinkGenerator<Sample> listenerLinkGenerator =
-                new ICellListenerAndLinkGenerator<Sample>()
-                    {
-                        public void handle(TableModelRowWithObject<Sample> rowItem,
-                                boolean specialKeyPressed)
-                        {
-                            Experiment experiment = rowItem.getObjectOrNull().getExperiment();
-                            new OpenEntityDetailsTabAction(experiment, viewContext,
-                                    specialKeyPressed).execute();
-                        }
-
-                        public String tryGetLink(Sample entity,
-                                ISerializableComparable comparableValue)
-                        {
-                            return LinkExtractor.tryExtract(entity.getExperiment());
-                        }
-                    };
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.EXPERIMENT, listenerLinkGenerator);
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.EXPERIMENT_IDENTIFIER,
-                listenerLinkGenerator);
-    }
-    
-    private void linkProject()
-    {
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.PROJECT,
-                new ICellListenerAndLinkGenerator<Sample>()
-                    {
-                        public void handle(TableModelRowWithObject<Sample> rowItem,
-                                boolean specialKeyPressed)
-                        {
-                            final Project project =
-                                    rowItem.getObjectOrNull().getExperiment().getProject();
-                            final String href = LinkExtractor.tryExtract(project);
-                            OpenEntityDetailsTabHelper.open(viewContext, project,
-                                    specialKeyPressed, href);
-                        }
-
-                        public String tryGetLink(Sample entity,
-                                ISerializableComparable comparableValue)
-                        {
-                            final Experiment exp = entity.getExperiment();
-                            return exp == null ? null : LinkExtractor.tryExtract(exp.getProject());
-                        }
-                    });
-    }
-
-    private void linkParent()
-    {
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.PARENTS,
-                new ICellListenerAndLinkGenerator<Sample>()
-                    {
-                        public void handle(TableModelRowWithObject<Sample> rowItem,
-                                boolean specialKeyPressed)
-                        {
-                            Sample parent = getParentOrNull(rowItem.getObjectOrNull());
-                            if (parent != null)
-                            {
-                                showEntityInformationHolderViewer(parent, false, specialKeyPressed);
-                            }
-                        }
-
-                        public String tryGetLink(Sample entity,
-                                ISerializableComparable comparableValue)
-                        {
-                            Sample parent = getParentOrNull(entity);
-                            return LinkExtractor.tryExtract(parent);
-                        }
-
-                        private Sample getParentOrNull(Sample entity)
-                        {
-                            if (entity.getParents().size() == 1)
-                            {
-                                return entity.getGeneratedFrom();
-                            }
-                            return null;
-                        }
-                    });
-    }
-
-    private void linkContainer()
-    {
-        registerListenerAndLinkGenerator(SampleGridColumnIDs.CONTAINER_SAMPLE,
-                new ICellListenerAndLinkGenerator<Sample>()
-                    {
-                        public void handle(TableModelRowWithObject<Sample> rowItem,
-                                boolean specialKeyPressed)
-                        {
-                            showEntityInformationHolderViewer(rowItem.getObjectOrNull().getContainer(), false,
-                                    specialKeyPressed);
-                        }
-
-                        public String tryGetLink(Sample entity,
-                                ISerializableComparable comparableValue)
-                        {
-                            Sample container = entity.getContainer();
-                            return LinkExtractor.tryExtract(container);
-                        }
-                    });
-    }
-
-    
-
-    @Override
-    protected GridCellRenderer<BaseEntityModel<?>> createInternalLinkCellRenderer()
-    {
-        return LinkRenderer.createLinkRenderer(true);
-    }
-
-    @Override
-    protected String translateColumnIdToDictionaryKey(String columnID)
-    {
-        return columnID.toLowerCase();
-    }
-
-    @Override
-    protected ColumnDefsAndConfigs<TableModelRowWithObject<Sample>> createColumnsDefinition()
-    {
-        ColumnDefsAndConfigs<TableModelRowWithObject<Sample>> definitions =
-                super.createColumnsDefinition();
-        definitions.setGridCellRendererFor(SampleGridColumnIDs.REGISTRATOR,
-                PersonRenderer.REGISTRATOR_RENDERER);
-        definitions.setGridCellRendererFor(SampleGridColumnIDs.SHOW_DETAILS_LINK_COLUMN_NAME,
-                createShowDetailsLinkCellRenderer());
-        return definitions;
-    }
-
-    protected final GridCellRenderer<BaseEntityModel<?>> createShowDetailsLinkCellRenderer()
-    {
-        return LinkRenderer.createExternalLinkRenderer(viewContext
-                .getMessage(Dict.SHOW_DETAILS_LINK_TEXT_VALUE));
-
-    }
-
-    @Override
-    protected List<String> getColumnIdsOfFilters()
-    {
-        return Arrays.asList(SampleGridColumnIDs.CODE, SampleGridColumnIDs.EXPERIMENT, SampleGridColumnIDs.PROJECT);
-    }
-
-    @Override
-    protected void listTableRows(
-            DefaultResultSetConfig<String, TableModelRowWithObject<Sample>> resultSetConfig,
-            AsyncCallback<TypedTableResultSet<Sample>> callback)
-    {
-        ListSampleDisplayCriteria c1 = getCriteriaProvider().tryGetCriteria();
-        ListSampleDisplayCriteria2 criteria;
-        if (c1.getCriteriaKind() == ListEntityDisplayCriteriaKind.BROWSE)
-        {
-            criteria = new ListSampleDisplayCriteria2(c1.getBrowseCriteria());
-        } else
-        {
-            criteria = new ListSampleDisplayCriteria2(c1.getSearchCriteria());
-        }
-        criteria.copyPagingConfig(resultSetConfig);
-        viewContext.getService().listSamples2(criteria, callback);
-    }
-
-    @Override
-    protected void prepareExportEntities(
-            TableExportCriteria<TableModelRowWithObject<Sample>> exportCriteria,
-            AbstractAsyncCallback<String> callback)
-    {
-        viewContext.getService().prepareExportSamples2(exportCriteria, callback);
-    }
-
-    @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;
-    }
-
-    @Override
-    public void update(Set<DatabaseModificationKind> observedModifications)
-    {
-        getCriteriaProvider().update(observedModifications, new IDataRefreshCallback()
-            {
-                public void postRefresh(boolean wasSuccessful)
-                {
-                }
-            });
-        super.update(observedModifications);
-    }
-
-    /**
-     * Initializes criteria and refreshes the grid when criteria are fetched. <br>
-     * Note that in this way we do not refresh the grid automatically, but we wait until all the
-     * property types will be fetched from the server (criteria provider will be updated), to set
-     * the available grid columns.
-     */
-    protected void updateCriteriaProviderAndRefresh()
-    {
-        HashSet<DatabaseModificationKind> observedModifications =
-                new HashSet<DatabaseModificationKind>();
-        getCriteriaProvider().update(observedModifications, new IDataRefreshCallback()
-            {
-                public void postRefresh(boolean wasSuccessful)
-                {
-                    refresh();
-                }
-            });
-    }
-
-    private void addGridRefreshListener(SampleBrowserToolbar topToolbar)
-    {
-        topToolbar.setCriteriaChangedListeners(createGridRefreshDelegatedAction());
-    }
-
-    protected ICriteriaProvider<ListSampleDisplayCriteria> getCriteriaProvider()
-    {
-        return propertyTypesAndCriteriaProvider;
-    }
-
-    // adds show, show-details and invalidate buttons
-    protected void extendBottomToolbar()
-    {
-        if (viewContext.isSimpleMode())
-        {
-            return;
-        }
-        addEntityOperationsLabel();
-        addEntityOperationButtons();
-        addEntityOperationsSeparator();
-    }
-
-    protected void addEntityOperationButtons()
-    {
-
-        final Button addButton =
-                new Button(viewContext.getMessage(Dict.BUTTON_ADD, "Sample"),
-                        new SelectionListener<ButtonEvent>()
-                            {
-                                @Override
-                                public void componentSelected(ButtonEvent ce)
-                                {
-                                    openSampleRegistrationTab();
-                                }
-                            });
-        addButton(addButton);
-
-        String showDetailsTitle = viewContext.getMessage(Dict.BUTTON_SHOW_DETAILS);
-        Button showDetailsButton =
-                createSelectedItemButton(showDetailsTitle, asShowEntityInvoker(false));
-        showDetailsButton.setId(createChildComponentId(SHOW_DETAILS_BUTTON_ID_SUFFIX));
-        addButton(showDetailsButton);
-
-        String editTitle = viewContext.getMessage(Dict.BUTTON_EDIT);
-        Button editButton = createSelectedItemButton(editTitle, asShowEntityInvoker(true));
-        editButton.setId(createChildComponentId(EDIT_BUTTON_ID_SUFFIX));
-        addButton(editButton);
-
-        final String deleteTitle = viewContext.getMessage(Dict.BUTTON_DELETE);
-        final String deleteAllTitle = deleteTitle + " All";
-        final Button deleteButton = new Button(deleteAllTitle, new AbstractCreateDialogListener()
-            {
-                @Override
-                protected Dialog createDialog(List<TableModelRowWithObject<Sample>> samples,
-                        IBrowserGridActionInvoker invoker)
-                {
-                    AsyncCallback<Void> callback = createDeletionCallback(invoker);
-                    DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>> s =
-                            getDisplayedAndSelectedItemsAction().execute();
-                    return new SampleListDeletionConfirmationDialog<TableModelRowWithObject<Sample>>(
-                            viewContext, samples, callback, s);
-                }
-            });
-        changeButtonTitleOnSelectedItems(deleteButton, deleteAllTitle, deleteTitle);
-        addButton(deleteButton);
-        allowMultipleSelection(); // we allow deletion of multiple samples
-    }
-
-    protected final IDelegatedActionWithResult<DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>>> getDisplayedAndSelectedItemsAction()
-    {
-        return new IDelegatedActionWithResult<DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>>>()
-            {
-                public DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>> execute()
-                {
-                    TableExportCriteria<TableModelRowWithObject<Sample>> tableExportCriteria =
-                            createTableExportCriteria();
-                    List<TableModelRowWithObject<Sample>> selectedBaseObjects = getSelectedBaseObjects();
-                    return new DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>>(selectedBaseObjects,
-                            tableExportCriteria, getTotalCount());
-                }
-            };
-    }
-    public static final String createChildComponentId(final String browserId,
-            final String childSuffix)
-    {
-        return browserId + childSuffix;
-    }
-
-    private final String createChildComponentId(final String childSuffix)
-    {
-        return createChildComponentId(getId(), childSuffix);
-    }
-
-    private void openSampleRegistrationTab()
-    {
-        if (experimentIdOrNull != null)
-        {
-            viewContext.getService().getExperimentInfo(experimentIdOrNull,
-                    new SampleRegistrationWithExperimentInfoCallback(viewContext));
-        } else
-        {
-            final ActionContext context = new ActionContext();
-            final ListSampleDisplayCriteria criteriaOrNull = getCriteriaProvider().tryGetCriteria();
-            if (criteriaOrNull != null
-                    && criteriaOrNull.getCriteriaKind() == ListEntityDisplayCriteriaKind.BROWSE)
-            {
-                final ListSampleCriteria browseCriteria = criteriaOrNull.getBrowseCriteria();
-                final SampleType sampleType = browseCriteria.getSampleType();
-                context.setSampleType(sampleType);
-                final String spaceCode = browseCriteria.getSpaceCode();
-                context.setSpaceCode(spaceCode);
-            }
-            DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext)
-                    .getSampleRegistration(context));
-        }
-    }
-
-    private final class SampleRegistrationWithExperimentInfoCallback extends
-            AbstractAsyncCallback<Experiment>
-    {
-        public SampleRegistrationWithExperimentInfoCallback(
-                IViewContext<ICommonClientServiceAsync> viewContext)
-        {
-            super(viewContext);
-        }
-
-        @Override
-        protected void process(Experiment result)
-        {
-            ActionContext experimentContext = new ActionContext(result);
-            DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext
-                    .getCommonViewContext()).getSampleRegistration(experimentContext));
-        }
-    }
-
-    @Override
-    protected void showEntityViewer(TableModelRowWithObject<Sample> row, boolean editMode, boolean inBackground)
-    {
-        showEntityInformationHolderViewer(row.getObjectOrNull(), editMode, inBackground);
-    }
-    
-    protected final IDelegatedAction createGridRefreshDelegatedAction()
-    {
-        return new IDelegatedAction()
-            {
-                public void execute()
-                {
-                    if (getCriteriaProvider().tryGetCriteria() != null)
-                    {
-                        refreshGridWithFilters();
-                    }
-                }
-            };
-    }
-
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleSearchHitGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleSearchHitGrid.java
index 593244e3cbb8e183f6237a5262be24e20c3932d9..c27ce2994f2c561a6fce1fefe71acd0b57909364 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleSearchHitGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleSearchHitGrid.java
@@ -49,7 +49,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject
  * 
  * @author Piotr Buczek
  */
-public class SampleSearchHitGrid extends SampleBrowserGrid2 implements IDetailedSearchHitGrid
+public class SampleSearchHitGrid extends SampleBrowserGrid implements IDetailedSearchHitGrid
 {
     // browser consists of the grid and the paging toolbar
     public static final String SEARCH_BROWSER_ID = GenericConstants.ID_PREFIX
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleGridColumnIDs.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleGridColumnIDs.java
index 7519883774a28820e36420d8c7845f810e38f5ab..198b0e3190582ae846566e409a41a1e8908075db 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleGridColumnIDs.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleGridColumnIDs.java
@@ -16,11 +16,11 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.dto;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid2;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 
 
 /**
- * IDs of static columns of {@link SampleBrowserGrid2}.
+ * IDs of static columns of {@link SampleBrowserGrid}.
  *
  * @author Franz-Josef Elmer
  */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index b7bd39ef9b6458fd5296ef7fa6d674e285268d56..ae4ff68fb429019f1ea8bd39f1142bc1217b62d6 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
@@ -414,12 +414,7 @@ public final class CommonClientService extends AbstractClientService implements
     // --------- methods preparing exported content. Note: GWT does not support
     // generic methods :(
 
-    public final String prepareExportSamples(final TableExportCriteria<Sample> criteria)
-    {
-        return prepareExportEntities(criteria);
-    }
-
-    public String prepareExportSamples2(
+    public String prepareExportSamples(
             TableExportCriteria<TableModelRowWithObject<Sample>> criteria)
     {
         return prepareExportEntities(criteria);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesSection.java
index 548aaa6972237aa9deac4451c0dfdda419c831de..5f9aa3cacbb0c6e9fda5b5fac3de282245d6ed0d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesSection.java
@@ -23,7 +23,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid2;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
@@ -56,7 +56,7 @@ public class ExperimentSamplesSection extends DisposableTabContent
     // @Private
     static String createGridId(TechId experimentId)
     {
-        return SampleBrowserGrid2.createGridId(createBrowserId(experimentId));
+        return SampleBrowserGrid.createGridId(createBrowserId(experimentId));
     }
 
     private static String createBrowserId(TechId experimentId)
@@ -67,7 +67,7 @@ public class ExperimentSamplesSection extends DisposableTabContent
     @Override
     protected IDisposableComponent createDisposableContent()
     {
-        return SampleBrowserGrid2.createGridForExperimentSamples(viewContext.getCommonViewContext(),
+        return SampleBrowserGrid.createGridForExperimentSamples(viewContext.getCommonViewContext(),
                 experimentId, createBrowserId(experimentId), experimentType);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ContainerSamplesSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ContainerSamplesSection.java
index 02698655b61baa0f2c1e4a128f3653e90da7b87f..d73d8f032ef56459a75d93d3fa61ba47fdca18af 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ContainerSamplesSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ContainerSamplesSection.java
@@ -23,7 +23,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid2;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
@@ -50,7 +50,7 @@ public class ContainerSamplesSection extends DisposableTabContent
     // @Private
     static String createGridId(TechId containerId)
     {
-        return SampleBrowserGrid2.createGridId(createBrowserId(containerId));
+        return SampleBrowserGrid.createGridId(createBrowserId(containerId));
     }
 
     private static String createBrowserId(TechId containerId)
@@ -62,7 +62,7 @@ public class ContainerSamplesSection extends DisposableTabContent
     protected IDisposableComponent createDisposableContent()
     {
         TechId containerId = TechId.create(container);
-        return SampleBrowserGrid2.createGridForContainerSamples(viewContext.getCommonViewContext(),
+        return SampleBrowserGrid.createGridForContainerSamples(viewContext.getCommonViewContext(),
                 containerId, createBrowserId(containerId), container.getSampleType());
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/DerivedSamplesSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/DerivedSamplesSection.java
index 8bdb39d96ab78972b78acd43664244f9a6a09368..78d61ed098ae2c74aa14650533aa779b39d99738 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/DerivedSamplesSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/DerivedSamplesSection.java
@@ -23,7 +23,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid2;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
@@ -50,7 +50,7 @@ public class DerivedSamplesSection extends DisposableTabContent
     // @Private
     static String createGridId(TechId parentId)
     {
-        return SampleBrowserGrid2.createGridId(createBrowserId(parentId));
+        return SampleBrowserGrid.createGridId(createBrowserId(parentId));
     }
 
     private static String createBrowserId(TechId parentId)
@@ -62,7 +62,7 @@ public class DerivedSamplesSection extends DisposableTabContent
     protected IDisposableComponent createDisposableContent()
     {
         TechId parentId = TechId.create(parent);
-        return SampleBrowserGrid2.createGridForDerivedSamples(viewContext.getCommonViewContext(),
+        return SampleBrowserGrid.createGridForDerivedSamples(viewContext.getCommonViewContext(),
                 parentId, createBrowserId(parentId), parent.getSampleType());
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesSection.java
index 2af6d897104d815b182848ca721a1d12788ce059..f78f6233896cc77473e001ef3349814a1ec929cc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesSection.java
@@ -23,7 +23,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid2;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
@@ -50,7 +50,7 @@ public class ParentSamplesSection extends DisposableTabContent
     // @Private
     static String createGridId(TechId childId)
     {
-        return SampleBrowserGrid2.createGridId(createBrowserId(childId));
+        return SampleBrowserGrid.createGridId(createBrowserId(childId));
     }
 
     private static String createBrowserId(TechId childId)
@@ -62,7 +62,7 @@ public class ParentSamplesSection extends DisposableTabContent
     protected IDisposableComponent createDisposableContent()
     {
         TechId childId = TechId.create(child);
-        return SampleBrowserGrid2.createGridForParentSamples(viewContext.getCommonViewContext(),
+        return SampleBrowserGrid.createGridForParentSamples(viewContext.getCommonViewContext(),
                 childId, createBrowserId(childId), child.getSampleType());
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SampleBrowserTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SampleBrowserTest.java
index 2a277586664c910fed3669ba29b1c7fdf1e64095..72b0623fbd8ddcfbfd5427325a5dd3f0a7200635 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SampleBrowserTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SampleBrowserTest.java
@@ -23,12 +23,12 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.GroupSe
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.InvokeActionMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Login;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Logout;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.CommonSampleColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.CheckSampleTable;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.ExportSamplesTestCommand;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.ListSamples;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid2;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.SampleRow;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleGridColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.ChangeTableColumnSettingsCommand;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.Row;
@@ -48,9 +48,9 @@ public class SampleBrowserTest extends AbstractGWTTestCase
         loginAndGotoListSamplesTab();
         remoteConsole.prepare(new ListSamples("CISD", "MASTER_PLATE"));
         ChangeTableColumnSettingsCommand settingsCommand =
-                new ChangeTableColumnSettingsCommand(SampleBrowserGrid2.MAIN_GRID_ID);
-        settingsCommand.hiddenChangeEvent(CommonSampleColDefKind.CODE.name(), true);
-        settingsCommand.widthChangeEvent(CommonSampleColDefKind.REGISTRATOR.name(),
+                new ChangeTableColumnSettingsCommand(SampleBrowserGrid.MAIN_GRID_ID);
+        settingsCommand.hiddenChangeEvent(SampleGridColumnIDs.CODE, true);
+        settingsCommand.widthChangeEvent(SampleGridColumnIDs.REGISTRATOR,
                 2 * DEFAULT_COLUMN_WIDTH);
         remoteConsole.prepare(settingsCommand);
         remoteConsole.prepare(new Logout());
@@ -59,8 +59,8 @@ public class SampleBrowserTest extends AbstractGWTTestCase
         remoteConsole.prepare(new InvokeActionMenu(ActionMenuKind.SAMPLE_MENU_BROWSE));
         remoteConsole.prepare(new ListSamples("CISD", "MASTER_PLATE"));
         CheckSampleTable checkCommand = new CheckSampleTable();
-        checkCommand.expectedColumnHidden(CommonSampleColDefKind.CODE.name(), true);
-        checkCommand.expectedColumnWidth(CommonSampleColDefKind.REGISTRATOR.name(),
+        checkCommand.expectedColumnHidden(SampleGridColumnIDs.CODE, true);
+        checkCommand.expectedColumnWidth(SampleGridColumnIDs.REGISTRATOR,
                 2 * DEFAULT_COLUMN_WIDTH);
         checkCommand.expectedColumnsNumber(17);
         remoteConsole.prepare(checkCommand);
@@ -73,8 +73,8 @@ public class SampleBrowserTest extends AbstractGWTTestCase
         loginAndGotoListSamplesTab();
         remoteConsole.prepare(new ListSamples("CISD", "MASTER_PLATE"));
         CheckSampleTable table = new CheckSampleTable();
-        table.expectedColumnHidden(CommonSampleColDefKind.CODE.name(), false);
-        table.expectedColumnWidth(CommonSampleColDefKind.REGISTRATOR.name(), DEFAULT_COLUMN_WIDTH);
+        table.expectedColumnHidden(SampleGridColumnIDs.CODE, false);
+        table.expectedColumnWidth(SampleGridColumnIDs.REGISTRATOR, DEFAULT_COLUMN_WIDTH);
         table.expectedRow(new SampleRow("MP001-1").identifier("CISD", "CISD").invalid()
                 .noExperiment().withInternalPropertyCell("PLATE_GEOMETRY",
                         DEFAULT_PLATE_GEOMETRY_VALUE));
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/CheckSampleTable.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/CheckSampleTable.java
index a83a952baa2e77254af2e2bd411feb63ebffea10..f29e1357346554e87ac21d90e1140711ecdcca29 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/CheckSampleTable.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/CheckSampleTable.java
@@ -28,7 +28,7 @@ public class CheckSampleTable extends CheckTableCommand
 {
     public CheckSampleTable()
     {
-        super(SampleBrowserGrid2.MAIN_GRID_ID);
+        super(SampleBrowserGrid.MAIN_GRID_ID);
     }
 
 }
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 28e5c95d6a9730a17c21cd4dcff9110b20047914..6b004bc010002907963cfe487a7e66212b13a405 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
@@ -51,8 +51,8 @@ public class ExportSamplesTestCommand extends AbstractDefaultTestCommand
 
     public void execute()
     {
-        SampleBrowserGrid2 sampleBrowserGrid =
-                (SampleBrowserGrid2) GWTTestUtil.getWidgetWithID(SampleBrowserGrid2.MAIN_BROWSER_ID);
+        SampleBrowserGrid sampleBrowserGrid =
+                (SampleBrowserGrid) 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/client/application/ui/sample/ShowSample.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/ShowSample.java
index 1bd8a502eb5e6b6fb11d274db3643a2021c5d866..df6128a93f82ed1014ad4cef3e45ca0f8f71596f 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/ShowSample.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/ShowSample.java
@@ -20,8 +20,8 @@ import com.extjs.gxt.ui.client.widget.grid.Grid;
 import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.CommonSampleColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.util.GridTestUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleGridColumnIDs;
 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.shared.basic.dto.Sample;
@@ -44,13 +44,13 @@ public final class ShowSample extends AbstractDefaultTestCommand
     @SuppressWarnings("unchecked")
     public void execute()
     {
-        final Widget widget = GWTTestUtil.getWidgetWithID(SampleBrowserGrid2.MAIN_GRID_ID);
+        final Widget widget = GWTTestUtil.getWidgetWithID(SampleBrowserGrid.MAIN_GRID_ID);
         assertTrue(widget instanceof Grid);
         final Grid<BaseEntityModel<Sample>> table = (Grid<BaseEntityModel<Sample>>) widget;
-        GridTestUtils.fireSelectRow(table, CommonSampleColDefKind.CODE.id(), code);
+        GridTestUtils.fireSelectRow(table, SampleGridColumnIDs.CODE, code);
         GWTTestUtil
-                .clickButtonWithID(SampleBrowserGrid2.createChildComponentId(
-                        SampleBrowserGrid2.MAIN_BROWSER_ID,
-                        SampleBrowserGrid2.SHOW_DETAILS_BUTTON_ID_SUFFIX));
+                .clickButtonWithID(SampleBrowserGrid.createChildComponentId(
+                        SampleBrowserGrid.MAIN_BROWSER_ID,
+                        SampleBrowserGrid.SHOW_DETAILS_BUTTON_ID_SUFFIX));
     }
 }
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 bd208f839494ca5cc071e6789f9a5a7c490c387d..3d9976fd243ba5d2d859e8e40c19cc2b8ef01eff 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
@@ -63,6 +63,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 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.generic.shared.basic.dto.Vocabulary;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
@@ -354,8 +355,10 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest
     @Test
     public final void testPrepareExportSamples()
     {
-        final TableExportCriteria<Sample> criteria = new TableExportCriteria<Sample>();
-        final CacheManager<String, TableExportCriteria<Sample>> manager = createCacheManager();
+        final TableExportCriteria<TableModelRowWithObject<Sample>> criteria =
+                new TableExportCriteria<TableModelRowWithObject<Sample>>();
+        final CacheManager<String, TableExportCriteria<TableModelRowWithObject<Sample>>> manager =
+                createCacheManager();
         context.checking(new Expectations()
             {
                 {
@@ -370,7 +373,7 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest
     }
 
     private void prepareGetCacheManager(final Expectations exp,
-            final CacheManager<String, TableExportCriteria<Sample>> manager)
+            final CacheManager<String, TableExportCriteria<TableModelRowWithObject<Sample>>> manager)
     {
         prepareGetHttpSession(exp);
         exp.allowing(httpSession).getAttribute(SessionConstants.OPENBIS_EXPORT_MANAGER);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewerTest.java
index 426d069e72e81f8849efffa60fd5e2c834ec0bcd..7eb3cd646d907da3522384796d338ca82c51c8fc 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewerTest.java
@@ -20,13 +20,13 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDisplayTypeIDGenerator;
 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.sample.CommonSampleColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.columns.DataSetRow;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.ListSamples;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.ShowSample;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.SampleRow;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.util.GridTestUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.SectionsPanel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleGridColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.CheckTableCommand;
@@ -97,7 +97,7 @@ public class GenericSampleViewerTest extends AbstractGWTTestCase
                 createSectionId(DisplayTypeIDGenerator.CONTAINER_SAMPLES_SECTION));
         final CheckTableCommand checkComponentsTable =
                 checkSample.createComponentsTableCheck().expectedSize(2);
-        final String sampleSubcodeFieldIdent = CommonSampleColDefKind.SUBCODE.id();
+        final String sampleSubcodeFieldIdent = SampleGridColumnIDs.SUBCODE;
         checkComponentsTable.expectedRow(new SampleRow(CONTROL_LAYOUT_EXAMPLE + ":A01", "WELL")
                 .identifier("CISD", "CISD").partOfContainer(CONTROL_LAYOUT_EXAMPLE_ID).withCell(
                         sampleSubcodeFieldIdent, "A01"));