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 7280afed7042b96ad86e79ecefc835a339e3a31f..7f3ea42160197119c2630f5234c5fa5effc22f04 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
@@ -159,7 +159,8 @@ public interface ICommonClientService extends IClientService
      */
     public ResultSet<MatchingEntity> listMatchingEntities(
             final SearchableEntity searchableEntityOrNull, final String queryText,
-            final IResultSetConfig<String> resultSetConfig) throws UserFailureException;
+            final IResultSetConfig<String, MatchingEntity> resultSetConfig)
+            throws UserFailureException;
 
     /**
      * Removes the session result set associated with given key.
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 d00f050bd664e20ede8101b486557c1f110b0e9e..860ff671f7566982e4c520a698a7a30b3424fc20 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
@@ -138,7 +138,7 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
      * @see ICommonClientService#listMatchingEntities(SearchableEntity, String, IResultSetConfig)
      */
     public void listMatchingEntities(final SearchableEntity searchableEntity,
-            final String queryText, final IResultSetConfig<String> resultSetConfig,
+            final String queryText, final IResultSetConfig<String, MatchingEntity> resultSetConfig,
             final AsyncCallback<ResultSet<MatchingEntity>> asyncCallback);
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
index a51a45218eac3ab74e21fec08adddb538ade6984..5771d3ffb45e0d31f552eb0be0ecb5732eb23342 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MatchingEntitiesPanel.java
@@ -81,7 +81,7 @@ final class MatchingEntitiesPanel extends AbstractBrowserGrid<MatchingEntity, Ma
     {
         List<IColumnDefinitionUI<MatchingEntity>> list =
                 MatchingEntityModel.createColumnsSchema(viewContext);
-        return ColumnDefsAndConfigs.create(list, true);
+        return ColumnDefsAndConfigs.create(list);
     }
 
     @Override
@@ -91,7 +91,7 @@ final class MatchingEntitiesPanel extends AbstractBrowserGrid<MatchingEntity, Ma
     }
 
     @Override
-    protected void listEntities(DefaultResultSetConfig<String> resultSetConfig,
+    protected void listEntities(DefaultResultSetConfig<String, MatchingEntity> resultSetConfig,
             AbstractAsyncCallback<ResultSet<MatchingEntity>> callback)
     {
         viewContext.getService().listMatchingEntities(searchableEntity, queryText, resultSetConfig,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ExperimentModel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ExperimentModel.java
index 810770e57d560fa7e9b54e3045c2528a0481ac10..4d85f93bfcdea2c412b0d5d0e57766ab721ea737 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ExperimentModel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ExperimentModel.java
@@ -81,12 +81,12 @@ public final class ExperimentModel extends AbstractEntityModel<Experiment>
             IMessageProvider messageProvider, ExperimentType selectedTypeOrNull)
     {
         ColumnDefsAndConfigs<Experiment> columns = new ColumnDefsAndConfigs<Experiment>();
-        columns.addColumns(createCommonColumnsSchema(messageProvider), true);
+        columns.addColumns(createCommonColumnsSchema(messageProvider));
         if (selectedTypeOrNull != null)
         {
             List<IColumnDefinitionUI<Experiment>> propertyColumnsSchema =
                     createPropertyColumnsSchema(selectedTypeOrNull);
-            columns.addColumns(propertyColumnsSchema, false);
+            columns.addColumns(propertyColumnsSchema);
         }
         return columns;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/MatchingEntityModel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/MatchingEntityModel.java
index 223dfe7ded808e0d5f88c9133f141a30da0de1bc..4d2c62b519cdb323855a1050f0a979a234694b6f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/MatchingEntityModel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/MatchingEntityModel.java
@@ -66,63 +66,66 @@ public final class MatchingEntityModel extends AbstractEntityModel<MatchingEntit
 
     public enum MatchingEntityColumnKind implements IColumnDefinitionKind<MatchingEntity>
     {
-        ENTITY_KIND(new AbstractColumnDefinitionKind<MatchingEntity>(
-                ModelDataPropertyNames.ENTITY_KIND, Dict.ENTITY_KIND)
+        ENTITY_KIND(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.ENTITY_KIND)
             {
+                @Override
                 public String tryGetValue(MatchingEntity entity)
                 {
                     return entity.getEntityKind().getDescription();
                 }
             }),
 
-        ENTITY_TYPE(new AbstractColumnDefinitionKind<MatchingEntity>(
-                ModelDataPropertyNames.ENTITY_TYPE, Dict.ENTITY_TYPE)
+        ENTITY_TYPE(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.ENTITY_TYPE)
             {
+                @Override
                 public String tryGetValue(MatchingEntity entity)
                 {
                     return entity.getEntityType().getCode();
                 }
             }),
 
-        IDENTIFIER(new AbstractColumnDefinitionKind<MatchingEntity>(
-                ModelDataPropertyNames.IDENTIFIER, Dict.IDENTIFIER, 140, false)
+        IDENTIFIER(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.IDENTIFIER, 140, false)
             {
+                @Override
                 public String tryGetValue(MatchingEntity entity)
                 {
                     return entity.getIdentifier();
                 }
             }),
 
-        REGISTRATOR(new AbstractColumnDefinitionKind<MatchingEntity>(
-                ModelDataPropertyNames.REGISTRATOR, Dict.REGISTRATOR)
+        REGISTRATOR(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.REGISTRATOR)
             {
+                @Override
                 public String tryGetValue(MatchingEntity entity)
                 {
                     return renderRegistrator(entity.getRegistrator());
                 }
             }),
 
-        MATCHING_FIELD(new AbstractColumnDefinitionKind<MatchingEntity>(
-                ModelDataPropertyNames.MATCHING_FIELD, Dict.MATCHING_FIELD, 140, false)
+        MATCHING_FIELD(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.MATCHING_FIELD, 140,
+                false)
             {
+                @Override
                 public String tryGetValue(MatchingEntity entity)
                 {
                     return entity.getFieldDescription();
                 }
             }),
 
-        MATCHING_TEXT(new AbstractColumnDefinitionKind<MatchingEntity>(
-                ModelDataPropertyNames.MATCHING_TEXT, Dict.MATCHING_TEXT, 200, false)
+        MATCHING_TEXT(new AbstractColumnDefinitionKind<MatchingEntity>(Dict.MATCHING_TEXT, 200,
+                false)
             {
+                @Override
                 public String tryGetValue(MatchingEntity entity)
                 {
                     return entity.getTextFragment();
                 }
             });
 
-        private final IColumnDefinitionKind<MatchingEntity> columnDefinitionKind;
+        private final AbstractColumnDefinitionKind<MatchingEntity> columnDefinitionKind;
 
-        private MatchingEntityColumnKind(IColumnDefinitionKind<MatchingEntity> columnDefinitionKind)
+        private MatchingEntityColumnKind(
+                AbstractColumnDefinitionKind<MatchingEntity> columnDefinitionKind)
         {
             this.columnDefinitionKind = columnDefinitionKind;
         }
@@ -139,7 +142,7 @@ public final class MatchingEntityModel extends AbstractEntityModel<MatchingEntit
 
         public String id()
         {
-            return columnDefinitionKind.id();
+            return name();
         }
 
         public boolean isHidden()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java
index 555255e4f53729618a4e0b73e9bda75a9b64e705..c30e91d96a015bb55eb75a8f7894c0f0e60068be 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java
@@ -19,9 +19,6 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.model;
 import com.extjs.gxt.ui.client.data.ModelData;
 import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Experiment;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Sample;
-
 /**
  * Some constants used in {@link ModelData} implementations. These constants are typically used in
  * {@link ColumnConfig#setId(String)}. Because they serve a different purpose, they should not be
@@ -39,9 +36,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Sample;
  */
 public final class ModelDataPropertyNames
 {
-    /** Because <i>Javascript</i> can not handle 'dot' in the property name. */
-    private static final String FIELD_PATH_SEPARATOR = "_";
-
     public static final String CODE = "code";
 
     public static final String FILE_NAME = "fileName";
@@ -56,59 +50,14 @@ public final class ModelDataPropertyNames
 
     public static final String ENTITY_TYPE = "entityType";
 
-    public static final String MATCHING_FIELD = "fieldDescription";
-
-    public static final String MATCHING_TEXT = "textFragment";
-
-    /**
-     * This is the path to the experiment field starting from {@link Sample}.
-     * <p>
-     * Changing this may mean that sorting no longer works on the server side if result set is used.
-     * </p>
-     */
-    public static final String EXPERIMENT_FOR_SAMPLE =
-            "validProcedure" + FIELD_PATH_SEPARATOR + "experiment";
-
-    /**
-     * This is the path to the experiment identifier field starting from {@link Sample}.
-     * <p>
-     * Changing this may mean that sorting no longer works on the server side if result set is used.
-     * </p>
-     */
-    public static final String EXPERIMENT_IDENTIFIER_FOR_SAMPLE =
-            EXPERIMENT_FOR_SAMPLE + FIELD_PATH_SEPARATOR + "experimentIdentifier";
-
-    /**
-     * This is the path to the experiment type code field starting from {@link Experiment}.
-     * <p>
-     * Changing this may mean that sorting no longer works on the server side if result set is used.
-     * </p>
-     */
-    public static final String EXPERIMENT_TYPE_CODE_FOR_EXPERIMENT =
-            "experimentType" + FIELD_PATH_SEPARATOR + "code";
-
     public static final String FILE_FORMAT_TYPE = "fileFormatType";
 
     public static final String FIRST_NAME = "firstName";
 
     public static final String GROUP = "group";
 
-    /**
-     * This is the path to the project field starting from {@link Experiment}.
-     * <p>
-     * Changing this may mean that sorting no longer works on the server side if result set is used.
-     * </p>
-     */
-    public static final String GROUP_FOR_EXPERIMENT = "project" + FIELD_PATH_SEPARATOR + "group";
-
-    public static final String IDENTIFIER = "identifier";
-
     public static final String DATABASE_INSTANCE = "databaseInstance";
 
-    public static final String IS_GROUP_SAMPLE = "isGroupSample";
-
-    public static final String IS_INSTANCE_SAMPLE = "isInstanceSample";
-
     public static final String IS_INVALID = "isInvalid";
 
     public static final String LAST_NAME = "lastName";
@@ -121,15 +70,6 @@ public final class ModelDataPropertyNames
 
     public static final String PERSON = "person";
 
-    /**
-     * This is the path to the project field starting from {@link Sample}.
-     * <p>
-     * Changing this may mean that sorting no longer works on the server side if result set is used.
-     * </p>
-     */
-    public static final String PROJECT_FOR_SAMPLE =
-            EXPERIMENT_FOR_SAMPLE + FIELD_PATH_SEPARATOR + "project";
-
     public static final String REGISTRATION_DATE = "registrationDate";
 
     public static final String REGISTRATOR = "registrator";
@@ -138,8 +78,6 @@ public final class ModelDataPropertyNames
 
     public static final String ROLES = "roles";
 
-    public static final String SAMPLE_IDENTIFIER = "sampleIdentifier";
-
     public static final String SAMPLE_TYPE = "sampleType";
 
     public static final String USER_ID = "userId";
@@ -148,8 +86,6 @@ public final class ModelDataPropertyNames
 
     public static final String PROJECT = "project";
 
-    public static final String EXPERIMENT_IDENTIFIER = "identifier";
-
     public static final String VERSIONS = "versions";
 
     public static final String VERSION_FILE_NAME = "versionsFileName";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ColumnConfigFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ColumnConfigFactory.java
index a2ca6d45f3836d2b0146917c9dccfe4142755b82..63cef4f131378b852602f577513c3c3be165d994 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ColumnConfigFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ColumnConfigFactory.java
@@ -39,22 +39,38 @@ public final class ColumnConfigFactory
     public final static ColumnConfig createRegistratorColumnConfig(
             final IMessageProvider messageProvider)
     {
-        return createDefaultColumnConfig(messageProvider.getMessage(Dict.REGISTRATOR),
-                ModelDataPropertyNames.REGISTRATOR);
+        return createRegistratorColumnConfig(messageProvider, ModelDataPropertyNames.REGISTRATOR);
+    }
+
+    public final static ColumnConfig createRegistratorColumnConfig(
+            final IMessageProvider messageProvider, String id)
+    {
+        return createDefaultColumnConfig(messageProvider.getMessage(Dict.REGISTRATOR), id);
     }
 
     public final static ColumnConfig createCodeColumnConfig(final IMessageProvider messageProvider)
     {
-        return createDefaultColumnConfig(messageProvider.getMessage(Dict.CODE),
-                ModelDataPropertyNames.CODE);
+        return createCodeColumnConfig(messageProvider, ModelDataPropertyNames.CODE);
+    }
+
+    public final static ColumnConfig createCodeColumnConfig(final IMessageProvider messageProvider,
+            String id)
+    {
+        return createDefaultColumnConfig(messageProvider.getMessage(Dict.CODE), id);
     }
 
     public final static ColumnConfig createRegistrationDateColumnConfig(
             final IMessageProvider messageProvider)
+    {
+        return createRegistrationDateColumnConfig(messageProvider,
+                ModelDataPropertyNames.REGISTRATION_DATE);
+    }
+
+    public final static ColumnConfig createRegistrationDateColumnConfig(
+            final IMessageProvider messageProvider, String id)
     {
         final ColumnConfig registrationDateColumnConfig =
-                createDefaultColumnConfig(messageProvider.getMessage(Dict.REGISTRATION_DATE),
-                        ModelDataPropertyNames.REGISTRATION_DATE);
+                createDefaultColumnConfig(messageProvider.getMessage(Dict.REGISTRATION_DATE), id);
         registrationDateColumnConfig.setWidth(200);
         return registrationDateColumnConfig;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ExternalDataGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ExternalDataGrid.java
index d59484de912a68d2820fcdbbe0f9204cb303f302..b9079c4116236c1d9e150d2b444cb031b1a7836f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ExternalDataGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ExternalDataGrid.java
@@ -45,7 +45,7 @@ public class ExternalDataGrid extends AbstractBrowserGrid<ExternalData, External
     {
         List<IColumnDefinitionUI<ExternalData>> list =
                 ExternalDataModel.createColumnsSchema(viewContext);
-        return ColumnDefsAndConfigs.create(list, true);
+        return ColumnDefsAndConfigs.create(list);
     }
 
     @Override
@@ -55,7 +55,7 @@ public class ExternalDataGrid extends AbstractBrowserGrid<ExternalData, External
     }
 
     @Override
-    protected void listEntities(DefaultResultSetConfig<String> resultSetConfig,
+    protected void listEntities(DefaultResultSetConfig<String, ExternalData> resultSetConfig,
             AbstractAsyncCallback<ResultSet<ExternalData>> callback)
     {
         // TODO Auto-generated method stub
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/columns/CommonExternalDataColDefKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/columns/CommonExternalDataColDefKind.java
index 2ee0436a0343289a6b1344679cec6af62c68f70e..974fa212e1d45c7624b12485b96fbe5a3a314a9a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/columns/CommonExternalDataColDefKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/columns/CommonExternalDataColDefKind.java
@@ -17,65 +17,65 @@
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.columns;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalData;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public enum CommonExternalDataColDefKind implements IColumnDefinitionKind<ExternalData>
 {
-    CODE(new AbstractColumnDefinitionKind<ExternalData>(ModelDataPropertyNames.CODE, Dict.CODE)
+    CODE(new AbstractColumnDefinitionKind<ExternalData>(Dict.CODE)
         {
+            @Override
             public String tryGetValue(ExternalData entity)
             {
                 return entity.getCode();
             }
         }),
 
-    REGISTRATION_DATE(new AbstractColumnDefinitionKind<ExternalData>(
-            ModelDataPropertyNames.REGISTRATION_DATE, Dict.REGISTRATION_DATE, 200, false)
+    REGISTRATION_DATE(new AbstractColumnDefinitionKind<ExternalData>(Dict.REGISTRATION_DATE, 200,
+            false)
         {
+            @Override
             public String tryGetValue(ExternalData entity)
             {
                 return renderRegistrationDate(entity);
             }
         }),
 
-    REGISTRATOR(new AbstractColumnDefinitionKind<ExternalData>(ModelDataPropertyNames.REGISTRATOR,
-            Dict.REGISTRATOR)
+    REGISTRATOR(new AbstractColumnDefinitionKind<ExternalData>(Dict.REGISTRATOR)
         {
+            @Override
             public String tryGetValue(ExternalData entity)
             {
                 return renderRegistrator(entity);
             }
         }),
 
-    LOCATION(new AbstractColumnDefinitionKind<ExternalData>(ModelDataPropertyNames.LOCATION,
-            Dict.LOCATION)
+    LOCATION(new AbstractColumnDefinitionKind<ExternalData>(Dict.LOCATION)
         {
+            @Override
             public String tryGetValue(ExternalData entity)
             {
                 return entity.getLocation();
             }
         }),
 
-    FILE_FORMAT_TYPE(new AbstractColumnDefinitionKind<ExternalData>(
-            ModelDataPropertyNames.FILE_FORMAT_TYPE, Dict.FILE_FORMAT_TYPE)
+    FILE_FORMAT_TYPE(new AbstractColumnDefinitionKind<ExternalData>(Dict.FILE_FORMAT_TYPE)
         {
+            @Override
             public String tryGetValue(ExternalData entity)
             {
                 return entity.getFileFormatType().getCode();
             }
         });
 
-    private final IColumnDefinitionKind<ExternalData> columnDefinitionKind;
+    private final AbstractColumnDefinitionKind<ExternalData> columnDefinitionKind;
 
-    private CommonExternalDataColDefKind(IColumnDefinitionKind<ExternalData> columnDefinitionKind)
+    private CommonExternalDataColDefKind(
+            AbstractColumnDefinitionKind<ExternalData> columnDefinitionKind)
     {
         this.columnDefinitionKind = columnDefinitionKind;
     }
@@ -92,7 +92,7 @@ public enum CommonExternalDataColDefKind implements IColumnDefinitionKind<Extern
 
     public String id()
     {
-        return columnDefinitionKind.id();
+        return name();
     }
 
     public boolean isHidden()
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 6dd95a463afc057108e8cbe12cdaafa9d6a8b8a8..b3dc2cc09a4b542ef33026913d44f9cee5cc65b2 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
@@ -60,14 +60,14 @@ public final class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment,
     }
 
     @Override
-    protected void listEntities(DefaultResultSetConfig<String> resultSetConfig,
+    protected void listEntities(DefaultResultSetConfig<String, Experiment> resultSetConfig,
             AbstractAsyncCallback<ResultSet<Experiment>> callback)
     {
         copyPagingConfig(resultSetConfig);
         viewContext.getService().listExperiments(criteria, callback);
     }
 
-    private void copyPagingConfig(DefaultResultSetConfig<String> resultSetConfig)
+    private void copyPagingConfig(DefaultResultSetConfig<String, Experiment> resultSetConfig)
     {
         criteria.setLimit(resultSetConfig.getLimit());
         criteria.setOffset(resultSetConfig.getOffset());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/columns/CommonExperimentColDefKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/columns/CommonExperimentColDefKind.java
index ff24a1a31fe52e4caca609ed12fac8396fc698d3..9d73720f63dbcfe3164af26259a29e55fdadc372 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/columns/CommonExperimentColDefKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/columns/CommonExperimentColDefKind.java
@@ -17,7 +17,6 @@
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.columns;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Experiment;
@@ -29,80 +28,83 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Experiment;
  */
 public enum CommonExperimentColDefKind implements IColumnDefinitionKind<Experiment>
 {
-    CODE(new AbstractColumnDefinitionKind<Experiment>(ModelDataPropertyNames.CODE, Dict.CODE)
+    CODE(new AbstractColumnDefinitionKind<Experiment>(Dict.CODE)
         {
+            @Override
             public String tryGetValue(Experiment entity)
             {
                 return entity.getCode();
             }
         }),
 
-    EXPERIMENT_TYPE(new AbstractColumnDefinitionKind<Experiment>(
-            ModelDataPropertyNames.EXPERIMENT_TYPE_CODE_FOR_EXPERIMENT, Dict.EXPERIMENT_TYPE)
+    EXPERIMENT_TYPE(new AbstractColumnDefinitionKind<Experiment>(Dict.EXPERIMENT_TYPE)
         {
+            @Override
             public String tryGetValue(Experiment entity)
             {
                 return entity.getExperimentType().getCode();
             }
         }),
 
-    EXPERIMENT_IDENTIFIER(new AbstractColumnDefinitionKind<Experiment>(
-            ModelDataPropertyNames.EXPERIMENT_IDENTIFIER, Dict.EXPERIMENT_IDENTIFIER, 150, true)
+    EXPERIMENT_IDENTIFIER(new AbstractColumnDefinitionKind<Experiment>(Dict.EXPERIMENT_IDENTIFIER,
+            150, true)
         {
+            @Override
             public String tryGetValue(Experiment entity)
             {
                 return entity.getIdentifier();
             }
         }),
 
-    GROUP(new AbstractColumnDefinitionKind<Experiment>(ModelDataPropertyNames.GROUP_FOR_EXPERIMENT,
-            Dict.GROUP)
+    GROUP(new AbstractColumnDefinitionKind<Experiment>(Dict.GROUP)
         {
+            @Override
             public String tryGetValue(Experiment entity)
             {
                 return entity.getProject().getGroup().getCode();
             }
         }),
 
-    PROJECT(new AbstractColumnDefinitionKind<Experiment>(ModelDataPropertyNames.PROJECT,
-            Dict.PROJECT)
+    PROJECT(new AbstractColumnDefinitionKind<Experiment>(Dict.PROJECT)
         {
+            @Override
             public String tryGetValue(Experiment entity)
             {
                 return entity.getProject().getCode();
             }
         }),
 
-    REGISTRATOR(new AbstractColumnDefinitionKind<Experiment>(ModelDataPropertyNames.REGISTRATOR,
-            Dict.REGISTRATOR)
+    REGISTRATOR(new AbstractColumnDefinitionKind<Experiment>(Dict.REGISTRATOR)
         {
+            @Override
             public String tryGetValue(Experiment entity)
             {
                 return renderRegistrator(entity);
             }
         }),
 
-    REGISTRATION_DATE(new AbstractColumnDefinitionKind<Experiment>(
-            ModelDataPropertyNames.REGISTRATION_DATE, Dict.REGISTRATION_DATE, 200, false)
+    REGISTRATION_DATE(new AbstractColumnDefinitionKind<Experiment>(Dict.REGISTRATION_DATE, 200,
+            false)
         {
+            @Override
             public String tryGetValue(Experiment entity)
             {
                 return renderRegistrationDate(entity);
             }
         }),
 
-    IS_INVALID(new AbstractColumnDefinitionKind<Experiment>(ModelDataPropertyNames.IS_INVALID,
-            Dict.IS_INVALID, true)
+    IS_INVALID(new AbstractColumnDefinitionKind<Experiment>(Dict.IS_INVALID, true)
         {
+            @Override
             public String tryGetValue(Experiment entity)
             {
                 return renderInvalidationFlag(entity);
             }
         });
 
-    private final IColumnDefinitionKind<Experiment> columnDefinitionKind;
+    private final AbstractColumnDefinitionKind<Experiment> columnDefinitionKind;
 
-    private CommonExperimentColDefKind(IColumnDefinitionKind<Experiment> columnDefinitionKind)
+    private CommonExperimentColDefKind(AbstractColumnDefinitionKind<Experiment> columnDefinitionKind)
     {
         this.columnDefinitionKind = columnDefinitionKind;
     }
@@ -119,7 +121,7 @@ public enum CommonExperimentColDefKind implements IColumnDefinitionKind<Experime
 
     public String id()
     {
-        return columnDefinitionKind.id();
+        return name();
     }
 
     public boolean isHidden()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
index 84444e004a6686ba1630325e09c436e68bd43950..c583c5b5fe7caf88a5f5ca9278ebf548b6bdaecd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
@@ -50,7 +50,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.VoidAsyncC
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.PagingToolBarWithoutRefresh;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GxtTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.URLMethodWithParameters;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WindowUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
@@ -58,6 +57,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IColumnDefinition;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SortInfo;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SortInfo.SortDir;
 
 /**
  * @author Tomasz Pylak
@@ -67,7 +67,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex
 {
     abstract protected void showEntityViewer(M modelData);
 
-    abstract protected void listEntities(DefaultResultSetConfig<String> resultSetConfig,
+    abstract protected void listEntities(DefaultResultSetConfig<String, T> resultSetConfig,
             AbstractAsyncCallback<ResultSet<T>> callback);
 
     abstract protected List<M> createModels(List<T> entities);
@@ -96,7 +96,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex
     private String resultSetKey;
 
     // information about sorting options of the last refreshed data
-    private SortInfo sortInfo;
+    private SortInfo<T> sortInfo;
 
     private IDataRefreshCallback refreshCallback;
 
@@ -140,8 +140,8 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex
                 public final void load(final PagingLoadConfig loadConfig,
                         final AsyncCallback<PagingLoadResult<M>> callback)
                 {
-                    DefaultResultSetConfig<String> resultSetConfig =
-                            createPagingConfig(loadConfig, resultSetKey);
+                    DefaultResultSetConfig<String, T> resultSetConfig =
+                            createPagingConfig(loadConfig, columns.getColumnDefs(), resultSetKey);
                     ListEntitiesCallback listCallback =
                             new ListEntitiesCallback(viewContext, callback, resultSetConfig);
                     listEntities(resultSetConfig, listCallback);
@@ -149,17 +149,54 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex
             };
     }
 
-    private static DefaultResultSetConfig<String> createPagingConfig(PagingLoadConfig loadConfig,
+    private static <T> DefaultResultSetConfig<String, T> createPagingConfig(
+            PagingLoadConfig loadConfig, List<IColumnDefinition<T>> availableColumns,
             String resultSetKey)
     {
-        DefaultResultSetConfig<String> resultSetConfig = new DefaultResultSetConfig<String>();
+        DefaultResultSetConfig<String, T> resultSetConfig = new DefaultResultSetConfig<String, T>();
         resultSetConfig.setLimit(loadConfig.getLimit());
         resultSetConfig.setOffset(loadConfig.getOffset());
-        resultSetConfig.setSortInfo(GxtTranslator.translate(loadConfig.getSortInfo()));
+        SortInfo<T> sortInfo = translateSortInfo(loadConfig, availableColumns);
+        resultSetConfig.setSortInfo(sortInfo);
         resultSetConfig.setResultSetKey(resultSetKey);
         return resultSetConfig;
     }
 
+    private static <T> SortInfo<T> translateSortInfo(PagingLoadConfig loadConfig,
+            List<IColumnDefinition<T>> availableColumns)
+    {
+        com.extjs.gxt.ui.client.data.SortInfo origSortInfo = loadConfig.getSortInfo();
+        String origSortField = origSortInfo.getSortField();
+        IColumnDefinition<T> sortColumnDefinition = null;
+        if (origSortField != null)
+        {
+            Map<String, IColumnDefinition<T>> availableColumnsMap = asColumnIdMap(availableColumns);
+            sortColumnDefinition = availableColumnsMap.get(origSortField);
+            assert sortColumnDefinition != null : "sortColumnDefinition is null";
+        }
+        SortInfo<T> sortInfo = new SortInfo<T>();
+        sortInfo.setSortField(sortColumnDefinition);
+        sortInfo.setSortDir(translate(origSortInfo.getSortDir()));
+        return sortInfo;
+    }
+
+    private static SortDir translate(com.extjs.gxt.ui.client.Style.SortDir sortDir)
+    {
+        if (sortDir.equals(com.extjs.gxt.ui.client.Style.SortDir.ASC))
+        {
+            return SortDir.ASC;
+        } else if (sortDir.equals(com.extjs.gxt.ui.client.Style.SortDir.DESC))
+        {
+            return SortDir.DESC;
+        } else if (sortDir.equals(com.extjs.gxt.ui.client.Style.SortDir.NONE))
+        {
+            return SortDir.NONE;
+        } else
+        {
+            throw new IllegalStateException("unknown sort dir: " + sortDir);
+        }
+    }
+
     /** @return number of rows in the grid */
     public int getRowNumber()
     {
@@ -172,11 +209,11 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex
         private final AsyncCallback<PagingLoadResult<M>> delegate;
 
         // configuration with which the listing was called
-        private final DefaultResultSetConfig<String> resultSetConfig;
+        private final DefaultResultSetConfig<String, T> resultSetConfig;
 
         public ListEntitiesCallback(final IViewContext<?> viewContext,
                 final AsyncCallback<PagingLoadResult<M>> delegate,
-                final DefaultResultSetConfig<String> resultSetConfig)
+                final DefaultResultSetConfig<String, T> resultSetConfig)
         {
             super(viewContext);
             this.delegate = delegate;
@@ -278,7 +315,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex
         return getSelectedColumns(availableColumnsMap, columnModel);
     }
 
-    private void saveSortInfo(SortInfo newSortInfo)
+    private void saveSortInfo(SortInfo<T> newSortInfo)
     {
         this.sortInfo = newSortInfo;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractColumnDefinitionKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractColumnDefinitionKind.java
index 81b41dddc9549e0d1dda826107563dcf935a5bcf..146099fbd73447c6c4b3ec05acea4a8364b2b8d4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractColumnDefinitionKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractColumnDefinitionKind.java
@@ -29,11 +29,10 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Person;
  * 
  * @author Franz-Josef Elmer
  */
-public abstract class AbstractColumnDefinitionKind<T> implements IColumnDefinitionKind<T>
+public abstract class AbstractColumnDefinitionKind<T>
 {
-    // TODO 2008-12-08, Tomasz Pylak: refactor the code to remove this field. It has to have the
-    // same name as the Sample field because grid sorting was implemented in that ugly way.
-    private String sortField;
+    /** Renders the cell value of this column for the specified entity. */
+    abstract public String tryGetValue(T entity);
 
     private String headerMsgKey;
 
@@ -41,24 +40,22 @@ public abstract class AbstractColumnDefinitionKind<T> implements IColumnDefiniti
 
     private boolean isHidden;
 
-    public AbstractColumnDefinitionKind(final String sortField, final String headerMsgKey,
-            final int width, final boolean isHidden)
+    public AbstractColumnDefinitionKind(final String headerMsgKey, final int width,
+            final boolean isHidden)
     {
-        this.sortField = sortField;
         this.headerMsgKey = headerMsgKey;
         this.width = width;
         this.isHidden = isHidden;
     }
 
-    public AbstractColumnDefinitionKind(final String sortField, final String headerMsgKey,
-            final boolean isHidden)
+    public AbstractColumnDefinitionKind(final String headerMsgKey, final boolean isHidden)
     {
-        this(sortField, headerMsgKey, AbstractColumnDefinition.DEFAULT_COLUMN_WIDTH, isHidden);
+        this(headerMsgKey, AbstractColumnDefinition.DEFAULT_COLUMN_WIDTH, isHidden);
     }
 
-    public AbstractColumnDefinitionKind(final String sortField, final String headerMsgKey)
+    public AbstractColumnDefinitionKind(final String headerMsgKey)
     {
-        this(sortField, headerMsgKey, false);
+        this(headerMsgKey, false);
     }
 
     public int getWidth()
@@ -77,11 +74,6 @@ public abstract class AbstractColumnDefinitionKind<T> implements IColumnDefiniti
         return headerMsgKey;
     }
 
-    public String id()
-    {
-        return sortField; // NOTE: it should be possible to use name() when sorting will be fixed
-    }
-
     protected String renderRegistrationDate(final AbstractRegistrationHolder entity)
     {
         return SimpleDateRenderer.renderDate(entity.getRegistrationDate());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/IColumnDefinitionKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/IColumnDefinitionKind.java
index 430fc166696659bf82750109f7c538930a430bc6..b1cb89dfad1e0a809315c110089d4a69d5c656f1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/IColumnDefinitionKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/IColumnDefinitionKind.java
@@ -34,7 +34,6 @@ public interface IColumnDefinitionKind<T> extends IsSerializable
     /** Returns key in the translations dictionary. */
     public String getHeaderMsgKey();
     
-    /** Returns column ID. */
     public String id();
     
     /** Renders the cell value of this column for the specified entity. */
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 7a30439a63703a0e5e0c553c657db35da5c896ee..767b92b363bb49f2ca472e1eb22f83a96d77caa7 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
@@ -60,14 +60,14 @@ public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleM
     }
 
     @Override
-    protected void listEntities(DefaultResultSetConfig<String> resultSetConfig,
+    protected void listEntities(DefaultResultSetConfig<String, Sample> resultSetConfig,
             AbstractAsyncCallback<ResultSet<Sample>> callback)
     {
         copyPagingConfig(resultSetConfig);
         viewContext.getService().listSamples(criteria, callback);
     }
 
-    private void copyPagingConfig(DefaultResultSetConfig<String> resultSetConfig)
+    private void copyPagingConfig(DefaultResultSetConfig<String, Sample> resultSetConfig)
     {
         criteria.setLimit(resultSetConfig.getLimit());
         criteria.setOffset(resultSetConfig.getOffset());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/ColumnDefsAndConfigs.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/ColumnDefsAndConfigs.java
index 7728af7e2df1f3758312ba686f772f4ea7de6892..98a32bf8711d91813041db104a40b2b9e4ceee9a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/ColumnDefsAndConfigs.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/ColumnDefsAndConfigs.java
@@ -34,10 +34,10 @@ public class ColumnDefsAndConfigs<T>
     private final List<IColumnDefinition<T>> columnDefs;
 
     public static <T> ColumnDefsAndConfigs<T> create(
-            List<? extends IColumnDefinitionUI<T>> columnsSchema, boolean isSortable)
+            List<? extends IColumnDefinitionUI<T>> columnsSchema)
     {
         ColumnDefsAndConfigs<T> result = new ColumnDefsAndConfigs<T>();
-        result.addColumns(columnsSchema, isSortable);
+        result.addColumns(columnsSchema);
         return result;
     }
 
@@ -47,20 +47,20 @@ public class ColumnDefsAndConfigs<T>
         this.columnDefs = new ArrayList<IColumnDefinition<T>>();
     }
 
-    public void addColumns(List<? extends IColumnDefinitionUI<T>> columnsSchema, boolean isSortable)
+    public void addColumns(List<? extends IColumnDefinitionUI<T>> columnsSchema)
     {
         for (IColumnDefinitionUI<T> column : columnsSchema)
         {
-            columnConfigs.add(createColumn(column, isSortable));
+            columnConfigs.add(createColumn(column));
             columnDefs.add(column);
         }
     }
 
-    private static <T> ColumnConfig createColumn(IColumnDefinitionUI<T> column, boolean isSortable)
+    private static <T> ColumnConfig createColumn(IColumnDefinitionUI<T> column)
     {
         final ColumnConfig columnConfig = new ColumnConfig();
         columnConfig.setMenuDisabled(false);
-        columnConfig.setSortable(isSortable);
+        columnConfig.setSortable(true);
         columnConfig.setId(column.getIdentifier());
         columnConfig.setHeader(column.getHeader());
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/CommonSampleColDefKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/CommonSampleColDefKind.java
index ae0d1228694d5dd2b46afff12e288294b810850a..7b24f2cfd219c77f1fb11e062fdf29d8a9242a01 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/CommonSampleColDefKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/CommonSampleColDefKind.java
@@ -18,7 +18,6 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample
 
 import ch.systemsx.cisd.openbis.generic.client.shared.DatabaseInstance;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.renderer.SimpleYesNoRenderer;
@@ -29,9 +28,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Sample;
 
 public enum CommonSampleColDefKind implements IColumnDefinitionKind<Sample>
 {
-    DATABASE_INSTANCE(new AbstractColumnDefinitionKind<Sample>(
-            ModelDataPropertyNames.DATABASE_INSTANCE, Dict.DATABASE_INSTANCE, true)
+    DATABASE_INSTANCE(new AbstractColumnDefinitionKind<Sample>(Dict.DATABASE_INSTANCE, true)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 DatabaseInstance databaseInstance = entity.getDatabaseInstance();
@@ -43,8 +42,9 @@ public enum CommonSampleColDefKind implements IColumnDefinitionKind<Sample>
             }
         }),
 
-    GROUP(new AbstractColumnDefinitionKind<Sample>(ModelDataPropertyNames.GROUP, Dict.GROUP)
+    GROUP(new AbstractColumnDefinitionKind<Sample>(Dict.GROUP)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 final Group group = entity.getGroup();
@@ -52,62 +52,63 @@ public enum CommonSampleColDefKind implements IColumnDefinitionKind<Sample>
             }
         }),
 
-    CODE(new AbstractColumnDefinitionKind<Sample>(ModelDataPropertyNames.CODE, Dict.CODE)
+    CODE(new AbstractColumnDefinitionKind<Sample>(Dict.CODE)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 return entity.getCode();
             }
         }),
 
-    SAMPLE_IDENTIFIER(new AbstractColumnDefinitionKind<Sample>(
-            ModelDataPropertyNames.SAMPLE_IDENTIFIER, Dict.SAMPLE_IDENTIFIER, 150, true)
+    SAMPLE_IDENTIFIER(new AbstractColumnDefinitionKind<Sample>(Dict.SAMPLE_IDENTIFIER, 150, true)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 return entity.getIdentifier();
             }
         }),
 
-    IS_INSTANCE_SAMPLE(new AbstractColumnDefinitionKind<Sample>(
-            ModelDataPropertyNames.IS_INSTANCE_SAMPLE, Dict.IS_INSTANCE_SAMPLE, true)
+    IS_INSTANCE_SAMPLE(new AbstractColumnDefinitionKind<Sample>(Dict.IS_INSTANCE_SAMPLE, true)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 return SimpleYesNoRenderer.render(entity.getDatabaseInstance() != null);
             }
         }),
 
-    REGISTRATOR(new AbstractColumnDefinitionKind<Sample>(ModelDataPropertyNames.REGISTRATOR,
-            Dict.REGISTRATOR, true)
+    REGISTRATOR(new AbstractColumnDefinitionKind<Sample>(Dict.REGISTRATOR, true)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 return renderRegistrator(entity);
             }
         }),
 
-    REGISTRATION_DATE(new AbstractColumnDefinitionKind<Sample>(
-            ModelDataPropertyNames.REGISTRATION_DATE, Dict.REGISTRATION_DATE, 200, true)
+    REGISTRATION_DATE(new AbstractColumnDefinitionKind<Sample>(Dict.REGISTRATION_DATE, 200, true)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 return renderRegistrationDate(entity);
             }
         }),
 
-    IS_INVALID(new AbstractColumnDefinitionKind<Sample>(ModelDataPropertyNames.IS_INVALID,
-            Dict.IS_INVALID, true)
+    IS_INVALID(new AbstractColumnDefinitionKind<Sample>(Dict.IS_INVALID, true)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 return renderInvalidationFlag(entity);
             }
         }),
 
-    PROJECT_FOR_SAMPLE(new AbstractColumnDefinitionKind<Sample>(
-            ModelDataPropertyNames.PROJECT_FOR_SAMPLE, Dict.PROJECT)
+    PROJECT_FOR_SAMPLE(new AbstractColumnDefinitionKind<Sample>(Dict.PROJECT)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 final Experiment exp = tryToGetExperiment(entity);
@@ -115,9 +116,9 @@ public enum CommonSampleColDefKind implements IColumnDefinitionKind<Sample>
             }
         }),
 
-    EXPERIMENT_FOR_SAMPLE(new AbstractColumnDefinitionKind<Sample>(
-            ModelDataPropertyNames.EXPERIMENT_FOR_SAMPLE, Dict.EXPERIMENT)
+    EXPERIMENT_FOR_SAMPLE(new AbstractColumnDefinitionKind<Sample>(Dict.EXPERIMENT)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 final Experiment exp = tryToGetExperiment(entity);
@@ -126,9 +127,9 @@ public enum CommonSampleColDefKind implements IColumnDefinitionKind<Sample>
         }),
 
     EXPERIMENT_IDENTIFIER_FOR_SAMPLE(new AbstractColumnDefinitionKind<Sample>(
-            ModelDataPropertyNames.EXPERIMENT_IDENTIFIER_FOR_SAMPLE, Dict.EXPERIMENT_IDENTIFIER,
-            200, true)
+            Dict.EXPERIMENT_IDENTIFIER, 200, true)
         {
+            @Override
             public String tryGetValue(Sample entity)
             {
                 final Experiment exp = tryToGetExperiment(entity);
@@ -136,9 +137,9 @@ public enum CommonSampleColDefKind implements IColumnDefinitionKind<Sample>
             }
         });
 
-    private final IColumnDefinitionKind<Sample> columnDefinitionKind;
+    private final AbstractColumnDefinitionKind<Sample> columnDefinitionKind;
 
-    private CommonSampleColDefKind(IColumnDefinitionKind<Sample> columnDefinitionKind)
+    private CommonSampleColDefKind(AbstractColumnDefinitionKind<Sample> columnDefinitionKind)
     {
         this.columnDefinitionKind = columnDefinitionKind;
     }
@@ -155,7 +156,7 @@ public enum CommonSampleColDefKind implements IColumnDefinitionKind<Sample>
 
     public String id()
     {
-        return columnDefinitionKind.id();
+        return name();
     }
 
     public boolean isHidden()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/SampleModel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/SampleModel.java
index 8481252b43a31c8ddae582b1ff468adc69ec300c..d2ef4ad0c1d8b2b0db8919fd64b22586d6698b50 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/SampleModel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/columns/SampleModel.java
@@ -54,16 +54,16 @@ public final class SampleModel extends AbstractEntityModel<Sample>
         assert messageProvider != null : "message provider needed to create table headers";
 
         ColumnDefsAndConfigs<Sample> columns = new ColumnDefsAndConfigs<Sample>();
-        columns.addColumns(createCommonColumnsSchema(messageProvider), true);
+        columns.addColumns(createCommonColumnsSchema(messageProvider));
         if (selectedTypeOrNull != null)
         {
             List<IColumnDefinitionUI<Sample>> parentColumnsSchema =
                     createParentColumnsSchema(messageProvider, selectedTypeOrNull);
-            columns.addColumns(parentColumnsSchema, false);
+            columns.addColumns(parentColumnsSchema);
 
             List<IColumnDefinitionUI<Sample>> propertyColumnsSchema =
                     createPropertyColumnsSchema(selectedTypeOrNull);
-            columns.addColumns(propertyColumnsSchema, false);
+            columns.addColumns(propertyColumnsSchema);
         }
         return columns;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/GxtTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/GxtTranslator.java
deleted file mode 100644
index 0f33c112415c0e1a341a2cd8d7bf84bb561681be..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/GxtTranslator.java
+++ /dev/null
@@ -1,42 +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.util;
-
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SortInfo;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SortInfo.SortDir;
-
-/**
- * A utility class which converts <i>GXT</i> specific classes into our <i>DTOs</i>.
- * 
- * @author Christian Ribeaud
- */
-public final class GxtTranslator
-{
-
-    private GxtTranslator()
-    {
-        // Can not be instantiated.
-    }
-
-    public final static SortInfo translate(final com.extjs.gxt.ui.client.data.SortInfo sortInfo)
-    {
-        final SortInfo result = new SortInfo();
-        result.setSortField(sortInfo.getSortField());
-        result.setSortDir(SortDir.valueOf(sortInfo.getSortDir().name()));
-        return result;
-    }
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DefaultResultSetConfig.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DefaultResultSetConfig.java
index ced18bd4d9c06eb7eafc893f92c994699fcac531..a7749c9cbc999f898a6c6f908ba845ce1d7724d5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DefaultResultSetConfig.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DefaultResultSetConfig.java
@@ -23,13 +23,13 @@ import com.google.gwt.user.client.rpc.IsSerializable;
  * 
  * @author Christian Ribeaud
  */
-public class DefaultResultSetConfig<K> implements IResultSetConfig<K>, IsSerializable
+public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsSerializable
 {
     private int limit = NO_LIMIT;
 
     private int offset = 0;
 
-    private SortInfo sortInfo = new SortInfo();
+    private SortInfo<T> sortInfo = new SortInfo<T>();
 
     /**
      * The result set key.
@@ -49,7 +49,7 @@ public class DefaultResultSetConfig<K> implements IResultSetConfig<K>, IsSeriali
         this.offset = offset;
     }
 
-    public final void setSortInfo(final SortInfo sortInfo)
+    public final void setSortInfo(final SortInfo<T> sortInfo)
     {
         this.sortInfo = sortInfo;
     }
@@ -73,7 +73,7 @@ public class DefaultResultSetConfig<K> implements IResultSetConfig<K>, IsSeriali
         return offset;
     }
 
-    public final SortInfo getSortInfo()
+    public final SortInfo<T> getSortInfo()
     {
         return sortInfo;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IResultSetConfig.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IResultSetConfig.java
index fc28fa5aaf99574de7f37b74fab866487eeee65a..25d68941dfec78b2f634cbb8714108685dd63038 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IResultSetConfig.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/IResultSetConfig.java
@@ -26,7 +26,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSet;
  * 
  * @author Christian Ribeaud
  */
-public interface IResultSetConfig<K> extends IResultSetKeyHolder<K>
+public interface IResultSetConfig<K, T> extends IResultSetKeyHolder<K>
 {
     public static final int NO_LIMIT = -1;
 
@@ -48,5 +48,5 @@ public interface IResultSetConfig<K> extends IResultSetKeyHolder<K>
     /**
      * Returns the sort info.
      */
-    public SortInfo getSortInfo();
+    public SortInfo<T> getSortInfo();
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListExperimentsCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListExperimentsCriteria.java
index b7b7ab70fa0d7cc59322b75bc2ab025bfb8c3237..a44374d9e36be5fc86dfc02b930782c96b637989 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListExperimentsCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListExperimentsCriteria.java
@@ -25,8 +25,8 @@ import ch.systemsx.cisd.openbis.generic.client.shared.ExperimentType;
  * 
  * @author Izabela Adamczyk
  */
-public final class ListExperimentsCriteria extends DefaultResultSetConfig<String> implements
-        IsSerializable
+public final class ListExperimentsCriteria extends DefaultResultSetConfig<String, Experiment>
+        implements IsSerializable
 {
     private ExperimentType experimentType;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListSampleCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListSampleCriteria.java
index 583e1936a21a12f830a4f1ef0235f16a986926ed..ad178d3b7123d396839045321c0e4f4bbb17fe4e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListSampleCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ListSampleCriteria.java
@@ -30,7 +30,7 @@ import ch.systemsx.cisd.openbis.generic.client.shared.SampleType;
  * @author Izabela Adamczyk
  * @author Tomasz Pylak
  */
-public final class ListSampleCriteria extends DefaultResultSetConfig<String> implements
+public final class ListSampleCriteria extends DefaultResultSetConfig<String, Sample> implements
         IsSerializable
 {
     // --------- filter 1 fields
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SortInfo.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SortInfo.java
index 59734246c457c25401d55ebc22f6558c7fa3fce4..88c4167e041984f6cdf67f70920fadc766ac8f3f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SortInfo.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SortInfo.java
@@ -23,18 +23,18 @@ import com.google.gwt.user.client.rpc.IsSerializable;
  * 
  * @author Christian Ribeaud
  */
-public final class SortInfo implements IsSerializable
+public final class SortInfo<T> implements IsSerializable
 {
-    private String sortField;
+    private IColumnDefinition<T> sortField;
 
     private SortDir sortDir = SortDir.NONE;
 
-    public final String getSortField()
+    public final IColumnDefinition<T> getSortField()
     {
         return sortField;
     }
 
-    public final void setSortField(final String sortField)
+    public final void setSortField(final IColumnDefinition<T> sortField)
     {
         this.sortField = sortField;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/TableExportCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/TableExportCriteria.java
index 2c9e55268c12aa52340142c49e6c3437c711efb8..b2bbc4f45efd4a2eec709f9679468143139b8fd4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/TableExportCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/TableExportCriteria.java
@@ -32,7 +32,7 @@ public class TableExportCriteria<T/* exported entity */> implements IResultSetKe
     // a key at which data are stored in the server cache
     private String resultSetKey;
 
-    private SortInfo sortInfo = new SortInfo();
+    private SortInfo<T> sortInfo = new SortInfo<T>();
 
     // which columns should be exported
     private List<IColumnDefinition<T>> columnDefs;
@@ -42,7 +42,7 @@ public class TableExportCriteria<T/* exported entity */> implements IResultSetKe
     {
     }
 
-    public TableExportCriteria(String resultSetKey, SortInfo sortInfo,
+    public TableExportCriteria(String resultSetKey, SortInfo<T> sortInfo,
             List<IColumnDefinition<T>> columnDefs)
     {
         this.resultSetKey = resultSetKey;
@@ -55,7 +55,7 @@ public class TableExportCriteria<T/* exported entity */> implements IResultSetKe
         return resultSetKey;
     }
 
-    public SortInfo getSortInfo()
+    public SortInfo<T> getSortInfo()
     {
         return sortInfo;
     }
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 c2de30e455670e9477823e97697cdf1ef3b76af5..391c6dd136c5b081c83552ff1bd9371029920f5e 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
@@ -143,10 +143,10 @@ public final class CommonClientService extends AbstractClientService implements
         return entities.getList();
     }
 
-    private static <T> IResultSetConfig<String> createExportListCriteria(
+    private static <T> IResultSetConfig<String, T> createExportListCriteria(
             final TableExportCriteria<T> exportCriteria)
     {
-        final DefaultResultSetConfig<String> criteria = new DefaultResultSetConfig<String>();
+        final DefaultResultSetConfig<String, T> criteria = new DefaultResultSetConfig<String, T>();
         criteria.setLimit(IResultSetConfig.NO_LIMIT);
         criteria.setOffset(IResultSetConfig.FIRST_ELEM_OFFSET);
         criteria.setSortInfo(exportCriteria.getSortInfo());
@@ -480,7 +480,7 @@ public final class CommonClientService extends AbstractClientService implements
 
     public final ResultSet<MatchingEntity> listMatchingEntities(
             final SearchableEntity searchableEntityOrNull, final String queryText,
-            final IResultSetConfig<String> resultSetConfig)
+            final IResultSetConfig<String, MatchingEntity> resultSetConfig)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         try
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java
index 7c28ed3da4a721e6fa851e967750149a1ddbdedf..f8ed9d399be860643864d7a58da98e581bf158de 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java
@@ -30,6 +30,7 @@ import org.apache.log4j.Logger;
 import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IColumnDefinition;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SortInfo;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SortInfo.SortDir;
@@ -52,12 +53,9 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
     @Private
     final Map<K, List<?>> results = new HashMap<K, List<?>>();
 
-    private final ComparatorRegistry comparatorRegistry;
-
     public CachedResultSetManager(final IResultSetKeyGenerator<K> resultSetKeyProvider)
     {
         this.resultSetKeyProvider = resultSetKeyProvider;
-        comparatorRegistry = new ComparatorRegistry();
     }
 
     @SuppressWarnings("unchecked")
@@ -66,8 +64,7 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         return (List<T>) list;
     }
 
-    @SuppressWarnings("unchecked")
-    private final <T> void sortData(final List<T> data, final SortInfo sortInfo)
+    private final <T> void sortData(final List<T> data, final SortInfo<T> sortInfo)
     {
         assert data != null : "Unspecified data.";
         assert sortInfo != null : "Unspecified sort information.";
@@ -76,15 +73,41 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
             return;
         }
         final SortDir sortDir = sortInfo.getSortDir();
-        final String sortField = sortInfo.getSortField();
+        final IColumnDefinition<T> sortField = sortInfo.getSortField();
         if (sortDir == SortDir.NONE || sortField == null)
         {
             return;
         }
-        final Comparator<T> fieldComparator =
-                comparatorRegistry.getComparator((Class<T>) data.get(0).getClass(), sortField);
-        Collections.sort(data, sortDir == SortDir.ASC ? fieldComparator : new ReverseComparator(
-                fieldComparator));
+        Comparator<T> comparator = createComparator(sortDir, sortField);
+        Collections.sort(data, comparator);
+    }
+
+    private static <T> Comparator<T> createComparator(final SortDir sortDir,
+            final IColumnDefinition<T> sortField)
+    {
+        Comparator<T> comparator = new Comparator<T>()
+            {
+
+                public int compare(T o1, T o2)
+                {
+                    String v1 = sortField.getValue(o1);
+                    String v2 = sortField.getValue(o2);
+                    return v1.compareTo(v2);
+                }
+            };
+        return applySortDir(sortDir, comparator);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static <T> Comparator<T> applySortDir(final SortDir sortDir, Comparator<T> comparator)
+    {
+        if (sortDir == SortDir.DESC)
+        {
+            return new ReverseComparator(comparator);
+        } else
+        {
+            return comparator;
+        }
     }
 
     @Private
@@ -124,7 +147,7 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
     //
 
     public final synchronized <T> IResultSet<K, T> getResultSet(
-            final IResultSetConfig<K> resultConfig, final IOriginalDataProvider<T> dataProvider)
+            final IResultSetConfig<K, T> resultConfig, final IOriginalDataProvider<T> dataProvider)
     {
         assert resultConfig != null : "Unspecified result configuration";
         assert dataProvider != null : "Unspecified data retriever";
@@ -146,7 +169,7 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         final int size = data.size();
         final int offset = getOffset(size, resultConfig.getOffset());
         final int limit = getLimit(size, resultConfig.getLimit(), offset);
-        final SortInfo sortInfo = resultConfig.getSortInfo();
+        final SortInfo<T> sortInfo = resultConfig.getSortInfo();
         sortData(data, sortInfo);
         final List<T> list = subList(data, offset, limit);
         return new DefaultResultSet<K, T>(dataKey, list, size);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ComparatorRegistry.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ComparatorRegistry.java
deleted file mode 100644
index b5e039623fbeb65b1bb249d6e8c5f829661d6846..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/ComparatorRegistry.java
+++ /dev/null
@@ -1,68 +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.server.resultset;
-
-import java.io.Serializable;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-
-import ch.systemsx.cisd.common.utilities.FieldComparator;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Sample;
-
-/**
- * A registry of {@link Comparator} implementation used by {@link IResultSetManager} implementation
- * to sort the data.
- * 
- * @author Christian Ribeaud
- */
-final class ComparatorRegistry implements Serializable
-{
-    private static final long serialVersionUID = 1L;
-
-    private final Map<Class<?>, IFieldComparator<?>> comparators =
-            new HashMap<Class<?>, IFieldComparator<?>>();
-
-    ComparatorRegistry()
-    {
-        comparators.put(Sample.class, new SampleComparator());
-    }
-
-    private final <T> Comparator<T> getDefaultComparator(final String fieldName)
-    {
-        return new FieldComparator<T>(fieldName, '_');
-    }
-
-    @SuppressWarnings("unchecked")
-    private final <T> Comparator<T> cast(final IFieldComparator<?> comparator)
-    {
-        return (Comparator<T>) comparator;
-    }
-
-    final <T> Comparator<T> getComparator(final Class<T> clazz, final String fieldName)
-    {
-        assert clazz != null : "Unspecified class.";
-        assert fieldName != null : "Unspecified field name.";
-        final IFieldComparator<?> comparator = comparators.get(clazz);
-        if (comparator == null)
-        {
-            return getDefaultComparator(fieldName);
-        }
-        comparator.setFieldName(fieldName);
-        return cast(comparator);
-    }
-}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IResultSetManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IResultSetManager.java
index 1ebfd07a15b72df41d7a60b6079abbd8157937ea..bbab868cdb9747385a08c6b02eb1687fb7eaf9db 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IResultSetManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/IResultSetManager.java
@@ -28,14 +28,13 @@ public interface IResultSetManager<K>
 {
 
     /**
-     * Produces a {@link IResultSet} from given <var>resultConfig</var> and given
-     * <var>dataProvider</var>.
+     * Produces a {@link IResultSet} from given <var>resultConfig</var> and given <var>dataProvider</var>.
      * <p>
      * In case of cached data, the {@link IOriginalDataProvider} implementation is only used in the
      * first call, when the full data are not already there.
      * </p>
      */
-    public <T> IResultSet<K, T> getResultSet(final IResultSetConfig<K> resultConfig,
+    public <T> IResultSet<K, T> getResultSet(final IResultSetConfig<K, T> resultConfig,
             final IOriginalDataProvider<T> dataProvider) throws UserFailureException;
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java
deleted file mode 100644
index 95d655472de2cc3c6ab85d6df082785887c3bf8f..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/SampleComparator.java
+++ /dev/null
@@ -1,73 +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.server.resultset;
-
-import org.apache.commons.collections.comparators.BooleanComparator;
-
-import ch.systemsx.cisd.common.utilities.FieldComparator;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Sample;
-
-/**
- * A {@link IFieldComparator} suitable for {@link Sample}.
- * 
- * @author Christian Ribeaud
- */
-final class SampleComparator implements IFieldComparator<Sample>
-{
-    private FieldComparator<Sample> fieldComparator;
-
-    private String fieldName;
-
-    private final int compareBoolean(final boolean b1, final boolean b2)
-    {
-        return BooleanComparator.getTrueFirstComparator().compare(b1, b2);
-    }
-
-    //
-    // IFieldComparator
-    //
-
-    public final void setFieldName(final String fieldName)
-    {
-        assert fieldName != null : "Unspecified field name.";
-        this.fieldName = fieldName;
-        fieldComparator = new FieldComparator<Sample>(fieldName, '_');
-    }
-
-    public final int compare(final Sample o1, final Sample o2)
-    {
-        assert fieldName != null : "Field name not specified.";
-        if (fieldName.equals(ModelDataPropertyNames.IS_GROUP_SAMPLE))
-        {
-            final boolean b1 = o1.getGroup() != null;
-            final boolean b2 = o2.getGroup() != null;
-            return compareBoolean(b1, b2);
-        } else if (fieldName.equals(ModelDataPropertyNames.IS_INSTANCE_SAMPLE))
-        {
-            final boolean b1 = o1.getDatabaseInstance() != null;
-            final boolean b2 = o2.getDatabaseInstance() != null;
-            return compareBoolean(b1, b2);
-        } else if (fieldName.equals(ModelDataPropertyNames.IS_INVALID))
-        {
-            final boolean b1 = o1.getInvalidation() != null;
-            final boolean b2 = o2.getInvalidation() != null;
-            return compareBoolean(b1, b2);
-        }
-        return fieldComparator.compare(o1, o2);
-    }
-}
\ No newline at end of file
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 17e967271eccb2068d331c9daccb65464f92aaee..32a87ef2ffea767603d439cf0b9675669ab3dc70 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
@@ -33,6 +33,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.YesNoRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.ColumnConfigFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.CommonSampleColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.SampleModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListSampleCriteria;
@@ -60,25 +61,33 @@ public class ExperimentSamplesSection extends AbstractExperimentTableSection<Sam
     protected ColumnModel createColumnModel()
     {
         final List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
-        final ColumnConfig codeColumn = ColumnConfigFactory.createCodeColumnConfig(viewContext);
+        final ColumnConfig codeColumn =
+                ColumnConfigFactory.createCodeColumnConfig(viewContext, CommonSampleColDefKind.CODE
+                        .id());
         configs.add(codeColumn);
 
         configs.add(ColumnConfigFactory.createDefaultColumnConfig(viewContext
                 .getMessage(Dict.SAMPLE_TYPE), ModelDataPropertyNames.SAMPLE_TYPE));
-        configs.add(ColumnConfigFactory.createDefaultColumnConfig(viewContext
-                .getMessage(Dict.GROUP), ModelDataPropertyNames.GROUP));
+        configs.add(createColumnConfig(Dict.GROUP, CommonSampleColDefKind.GROUP));
         final ColumnConfig isInvalidColumn =
-                ColumnConfigFactory.createDefaultColumnConfig(viewContext
-                        .getMessage(Dict.IS_INVALID), ModelDataPropertyNames.IS_INVALID);
+                createColumnConfig(Dict.IS_INVALID, CommonSampleColDefKind.IS_INVALID);
         isInvalidColumn.setRenderer(new YesNoRenderer());
         configs.add(isInvalidColumn);
 
-        configs.add(ColumnConfigFactory.createRegistrationDateColumnConfig(viewContext));
-        configs.add(ColumnConfigFactory.createRegistratorColumnConfig(viewContext));
+        configs.add(ColumnConfigFactory.createRegistrationDateColumnConfig(viewContext,
+                CommonSampleColDefKind.REGISTRATION_DATE.id()));
+        configs.add(ColumnConfigFactory.createRegistratorColumnConfig(viewContext,
+                CommonSampleColDefKind.REGISTRATOR.id()));
 
         return new ColumnModel(configs);
     }
 
+    private ColumnConfig createColumnConfig(String messageKey, CommonSampleColDefKind columnKind)
+    {
+        return ColumnConfigFactory.createDefaultColumnConfig(viewContext.getMessage(messageKey),
+                columnKind.id());
+    }
+
     @Override
     protected RpcProxy<BaseListLoadConfig, BaseListLoadResult<SampleModel>> createRpcProxy()
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
index 4ec85cdcfa64f9ccb5efbfa1ccef156a66ac8843..af3239d15550546a882721772c7ffe4adf7126dc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
@@ -59,6 +59,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Abstrac
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.ColumnConfigFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.PropertyValueRenderers;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property.PropertyGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.CommonSampleColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.columns.SampleModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Invalidation;
@@ -212,9 +213,12 @@ public final class GenericSampleViewer extends AbstractViewer<IGenericClientServ
     private final ColumnModel createPartOfSamplesColumnModel()
     {
         final List<ColumnConfig> configs = new ArrayList<ColumnConfig>();
-        configs.add(ColumnConfigFactory.createCodeColumnConfig(viewContext));
-        configs.add(ColumnConfigFactory.createRegistrationDateColumnConfig(viewContext));
-        configs.add(ColumnConfigFactory.createRegistratorColumnConfig(viewContext));
+        configs.add(ColumnConfigFactory.createCodeColumnConfig(viewContext,
+                CommonSampleColDefKind.CODE.id()));
+        configs.add(ColumnConfigFactory.createRegistrationDateColumnConfig(viewContext,
+                CommonSampleColDefKind.REGISTRATION_DATE.id()));
+        configs.add(ColumnConfigFactory.createRegistratorColumnConfig(viewContext,
+                CommonSampleColDefKind.REGISTRATOR.id()));
         return new ColumnModel(configs);
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java
index 03780ef6441c91483e4d48af268a261f67fcd41e..cd8865b724aa2fd9b6a91db7320610139deb87f7 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SearchTest.java
@@ -16,8 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import static ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames.IDENTIFIER;
-
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.MatchingEntityModel.MatchingEntityColumnKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Login;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.CheckTableCommand;
@@ -35,19 +34,24 @@ public class SearchTest extends AbstractGWTTestCase
         final CheckTableCommand checkTableCommand =
                 new CheckTableCommand(MatchingEntitiesPanel.GRID_ID,
                         MatchingEntitiesPanel.ListEntitiesCallback.class).expectedSize(2);
-        checkTableCommand.expectedRow(new Row().withCell(IDENTIFIER, "CISD:/MP"));
-        checkTableCommand.expectedRow(new Row().withCell(IDENTIFIER, "CISD:/CISD/EMPTY-MP"));
+        checkTableCommand.expectedRow(createRow("CISD:/MP"));
+        checkTableCommand.expectedRow(createRow("CISD:/CISD/EMPTY-MP"));
         return checkTableCommand;
     }
 
+    private static Row createRow(String identifier)
+    {
+        return new Row().withCell(MatchingEntityColumnKind.IDENTIFIER.id(), identifier);
+    }
+
     private final static CheckTableCommand createCheckTableCommandForExperiment()
     {
         final CheckTableCommand checkTableCommand =
                 new CheckTableCommand(MatchingEntitiesPanel.GRID_ID,
                         MatchingEntitiesPanel.ListEntitiesCallback.class).expectedSize(5);
-        checkTableCommand.expectedRow(new Row().withCell(IDENTIFIER, "CISD:/CISD/NEMO/EXP10"));
-        checkTableCommand.expectedRow(new Row().withCell(IDENTIFIER, "CISD:/CISD/NEMO/EXP11"));
-        checkTableCommand.expectedRow(new Row().withCell(IDENTIFIER, "CISD:/CISD/NEMO/EXP1"));
+        checkTableCommand.expectedRow(createRow("CISD:/CISD/NEMO/EXP10"));
+        checkTableCommand.expectedRow(createRow("CISD:/CISD/NEMO/EXP11"));
+        checkTableCommand.expectedRow(createRow("CISD:/CISD/NEMO/EXP1"));
         return checkTableCommand;
     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentRow.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentRow.java
index a592915f882d8a3bed18ba1c533c7f9e865ab510..58193207b837050eab548b92567466568aa2be24 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentRow.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentRow.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.columns.CommonExperimentColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.renderer.SimpleYesNoRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.util.RendererTestUtil;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.Row;
@@ -34,14 +34,14 @@ public class ExperimentRow extends Row
     {
         super();
         this.code = code;
-        withCell(ModelDataPropertyNames.CODE, code);
+        withCell(CommonExperimentColDefKind.CODE.id(), code);
     }
 
     public ExperimentRow invalid()
     {
         withInvalidation(true);
         // overwrite previous code
-        withCell(ModelDataPropertyNames.CODE, RendererTestUtil.invalidCode(code));
+        withCell(CommonExperimentColDefKind.CODE.id(), RendererTestUtil.invalidCode(code));
         return this;
     }
 
@@ -53,7 +53,7 @@ public class ExperimentRow extends Row
 
     private void withInvalidation(boolean isInvalid)
     {
-        withCell(ModelDataPropertyNames.IS_INVALID, SimpleYesNoRenderer.render(isInvalid));
+        withCell(CommonExperimentColDefKind.IS_INVALID.id(), SimpleYesNoRenderer.render(isInvalid));
     }
 
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ShowExperiment.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ShowExperiment.java
index adb9764a9c55bd51f03d05da4b3a826aed6a5392..fdaf864496426ea415d5d37ed19a4a5a019ca613 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ShowExperiment.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ShowExperiment.java
@@ -23,7 +23,7 @@ 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.ExperimentModel;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.columns.CommonExperimentColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.GWTTestUtil;
 
@@ -57,7 +57,7 @@ public class ShowExperiment extends AbstractDefaultTestCommand
         for (int i = 0; i < store.getCount(); i++)
         {
             final ExperimentModel row = store.getAt(i);
-            if (code.equals(row.get(ModelDataPropertyNames.CODE)))
+            if (code.equals(row.get(CommonExperimentColDefKind.CODE.id())))
             {
                 final GridEvent gridEvent = new GridEvent(table);
                 gridEvent.rowIndex = i;
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java
index 7e5fdfc5d7f8840d89372403e52043c21fe37b0a..61ad2df8f485ad0ba65c8ab9099cfec0c7bd3aed 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManagerTest.java
@@ -47,9 +47,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.CacheManager
 @Friend(toClasses = CachedResultSetManager.class)
 public final class CachedResultSetManagerTest
 {
-    private IResultSetConfig<String> resultSetConfig;
+    private IResultSetConfig<String, String> resultSetConfig;
 
-    private IOriginalDataProvider<?> originalDataProvider;
+    private IOriginalDataProvider<String> originalDataProvider;
 
     private IResultSetManager<String> resultSetManager;
 
@@ -57,9 +57,9 @@ public final class CachedResultSetManagerTest
 
     private final void allowResultSetCreation(final Expectations expectations)
     {
-        final SortInfo sortInfo = new SortInfo();
+        final SortInfo<String> sortInfo = new SortInfo<String>();
         sortInfo.setSortDir(SortDir.NONE);
-        sortInfo.setSortField("code");
+        sortInfo.setSortField(null);
 
         expectations.one(resultSetConfig).getOffset();
         expectations.will(Expectations.returnValue(1));
@@ -97,8 +97,7 @@ public final class CachedResultSetManagerTest
     private final static IResultSetManager<String> createResultSetManager()
     {
         final CachedResultSetManager<String> resultSetManager =
-                new CachedResultSetManager<String>(
-                        new TokenBasedResultSetKeyGenerator());
+                new CachedResultSetManager<String>(new TokenBasedResultSetKeyGenerator());
         resultSetManager.results.put("1", createSampleList());
         return resultSetManager;
     }
@@ -165,7 +164,7 @@ public final class CachedResultSetManagerTest
                     allowResultSetCreation(this);
                 }
             });
-        final IResultSet<String, ?> resultSet =
+        final IResultSet<String, String> resultSet =
                 resultSetManager.getResultSet(resultSetConfig, originalDataProvider);
         assertEquals(0, resultSet.getList().size());
         assertEquals(0, resultSet.getTotalLength());