diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java
index 5c5d41990b933324d0c671c0402a3c442e1fd7c9..0219b08469b3e6f5fbcac365bfc61d0adbf35803 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/DisplaySettingsManager.java
@@ -131,7 +131,7 @@ public class DisplaySettingsManager
      * persistent.
      */
     public <C> void registerGridSettingsChangesListener(final String displayTypeID,
-            final IDisplaySettingsGetter<C> grid)
+            final IDisplaySettingsGetter grid)
     {
         Listener<ColumnModelEvent> listener = new Listener<ColumnModelEvent>()
             {
@@ -218,7 +218,7 @@ public class DisplaySettingsManager
      * display type ID. Stored settings (if any) override the current settings.
      */
     public GridDisplaySettings tryApplySettings(String displayTypeID, ColumnModel columnModel,
-            List<String> filteredColumnIds, SortInfo<?> sortInfo)
+            List<String> filteredColumnIds, SortInfo sortInfo)
     {
         List<ColumnSetting> columnSettings = getColumnSettings(displayTypeID);
         if (columnSettings == null)
@@ -295,7 +295,7 @@ public class DisplaySettingsManager
      *            defaults
      */
     private static GridDisplaySettings tryApplySettings(List<ColumnSetting> columnSettings,
-            ColumnModel columnModel, List<String> filteredColumnIds, SortInfo<?> sortInfo)
+            ColumnModel columnModel, List<String> filteredColumnIds, SortInfo sortInfo)
     {
         boolean refreshNeeded = false;
         List<ColumnConfig> newColumnConfigList = new ArrayList<ColumnConfig>();
@@ -304,7 +304,7 @@ public class DisplaySettingsManager
 
         String sortField =
                 sortInfo == null ? null : sortInfo.getSortField() == null ? null : sortInfo
-                        .getSortField().getIdentifier();
+                        .getSortField();
         SortDir sortDirection = sortInfo == null ? null : sortInfo.getSortDir();
 
         for (int i = 0; i < columnSettings.size(); i++)
@@ -312,6 +312,12 @@ public class DisplaySettingsManager
             ColumnSetting columnSetting = columnSettings.get(i);
             // update column using the settings stored for it
             String columnID = columnSetting.getColumnID();
+            SortDir settingSortDirection = columnSetting.getSortDir();
+            if (settingSortDirection != null)
+            {
+                sortField = columnID;
+                sortDirection = settingSortDirection;
+            }
             ColumnConfig columnConfig = columnModel.getColumnById(columnID);
             if (columnConfig != null)
             {
@@ -338,14 +344,11 @@ public class DisplaySettingsManager
                     newFilteredColumnIds.add(columnID);
                 }
 
-                SortDir columnSortDir = columnSetting.getSortDir();
-                if (columnSortDir != null)
+                if (settingSortDirection != null)
                 {
-                    if (sortInfo == null || columnSortDir != sortInfo.getSortDir()
-                            || columnID.equals(sortInfo.getSortField().getIdentifier()) == false)
+                    if (sortInfo == null || settingSortDirection != sortInfo.getSortDir()
+                            || columnID.equals(sortInfo.getSortField()) == false)
                     {
-                        sortField = columnID;
-                        sortDirection = columnSetting.getSortDir();
                         refreshNeeded = true;
                     }
                 }
@@ -368,13 +371,16 @@ public class DisplaySettingsManager
         {
             return new GridDisplaySettings(newColumnConfigList, newFilteredColumnIds, sortField,
                     sortDirection);
+        } else if (sortDirection != null)
+        {
+            return new GridDisplaySettings(null, null, sortField, sortDirection);
         } else
         {
             return null;
         }
     }
 
-    public <C> void storeSettings(final String displayTypeID, final IDisplaySettingsGetter<C> grid,
+    public void storeSettings(final String displayTypeID, final IDisplaySettingsGetter grid,
             boolean delayed)
     {
         int delayMs = delayed ? QUITE_TIME_BEFORE_SETTINGS_SAVED_MS : 1; // zero not allowed
@@ -390,7 +396,7 @@ public class DisplaySettingsManager
     }
 
     private <C> void storeSettings(String displayTypeID, ColumnModel columnModel,
-            List<String> filteredColumnIds, Object modifier, SortInfo<C> sortInfo, int delayMs)
+            List<String> filteredColumnIds, Object modifier, SortInfo sortInfo, int delayMs)
     {
         List<ColumnSetting> columnSettings =
                 createColumnsSettings(columnModel, filteredColumnIds, sortInfo);
@@ -409,8 +415,8 @@ public class DisplaySettingsManager
         updater.executeDelayed(1); // 0 not allowed
     }
 
-    private static <C> List<ColumnSetting> createColumnsSettings(ColumnModel columnModel,
-            List<String> filteredColumnIdsList, SortInfo<C> sortInfo)
+    private static List<ColumnSetting> createColumnsSettings(ColumnModel columnModel,
+            List<String> filteredColumnIdsList, SortInfo sortInfo)
     {
         Set<String> filteredColumnIds = new HashSet<String>(filteredColumnIdsList);
         List<ColumnSetting> columnSettings = new ArrayList<ColumnSetting>();
@@ -424,7 +430,7 @@ public class DisplaySettingsManager
             boolean hasFilter = filteredColumnIds.contains(columnConfig.getId());
             columnSetting.setHasFilter(hasFilter);
             if (sortInfo != null && sortInfo.getSortField() != null
-                    && columnSetting.getColumnID().equals(sortInfo.getSortField().getIdentifier()))
+                    && columnSetting.getColumnID().equals(sortInfo.getSortField()))
             {
                 columnSetting.setSortDir(sortInfo.getSortDir());
             }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/IDisplaySettingsGetter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/IDisplaySettingsGetter.java
index 2265736819498671a7f846885f417b963c3d9831..c76f8fcda82c795cdf59aa4e2327abe0aa64b985 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/IDisplaySettingsGetter.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/IDisplaySettingsGetter.java
@@ -27,7 +27,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SortInfo;
  * 
  * @author Franz-Josef Elmer
  */
-public interface IDisplaySettingsGetter<T>
+public interface IDisplaySettingsGetter
 {
     ColumnModel getColumnModel();
 
@@ -35,5 +35,5 @@ public interface IDisplaySettingsGetter<T>
 
     Object getModifier();
 
-    SortInfo<T> getSortState();
+    SortInfo getSortState();
 }
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 160f1ee70d207b8e29317b83380773b11d8f5d58..f0f6b7bb1e9539ae17f3065b4845eb9f4d36eca9 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
@@ -690,7 +690,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         resultSetConfig.setLimit(limit);
         resultSetConfig.setOffset(offset);
         resultSetConfig.setAvailableColumns(columnDefinitions);
-        SortInfo<T> translatedSortInfo = translateSortInfo(sortInfo, columnDefinitions);
+        SortInfo translatedSortInfo = translateSortInfo(sortInfo);
         Set<String> columnIDs = getIDsOfColumnsToBeShown();
         resultSetConfig.setIDsOfPresentedColumns(columnIDs);
         resultSetConfig.setSortInfo(translatedSortInfo);
@@ -725,30 +725,17 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         return columnIDs;
     }
 
-    private static <T> SortInfo<T> translateSortInfo(
-            com.extjs.gxt.ui.client.data.SortInfo sortInfo,
-            Set<IColumnDefinition<T>> availableColumns)
+    private static <T> SortInfo translateSortInfo(com.extjs.gxt.ui.client.data.SortInfo sortInfo)
     {
-        return translateSortInfo(sortInfo.getSortField(), sortInfo.getSortDir(), availableColumns);
+        return translateSortInfo(sortInfo.getSortField(), sortInfo.getSortDir());
     }
 
-    private static <T> SortInfo<T> translateSortInfo(String sortFieldId,
-            com.extjs.gxt.ui.client.Style.SortDir sortDir,
-            Set<IColumnDefinition<T>> availableColumns)
+    private static <T> SortInfo translateSortInfo(String sortFieldId,
+            com.extjs.gxt.ui.client.Style.SortDir sortDir)
     {
-        IColumnDefinition<T> sortColumnDefinition = null;
-        if (sortFieldId != null)
-        {
-            Map<String, IColumnDefinition<T>> availableColumnsMap = asColumnIdMap(availableColumns);
-            sortColumnDefinition = availableColumnsMap.get(sortFieldId);
-        }
-
-        SortInfo<T> sortInfo = new SortInfo<T>();
-        if (sortColumnDefinition != null)
-        {
-            sortInfo.setSortField(sortColumnDefinition);
-            sortInfo.setSortDir(translate(sortDir));
-        }
+        SortInfo sortInfo = new SortInfo();
+        sortInfo.setSortField(sortFieldId);
+        sortInfo.setSortDir(translate(sortDir));
 
         return sortInfo;
     }
@@ -885,6 +872,9 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
             saveCacheKey(key);
             GridRowModels<T> rowModels = result.getList();
             boolean partial = result.isPartial();
+            List<GridCustomColumnInfo> customColumnMetadata = rowModels.getCustomColumnsMetadata();
+            customColumnsMetadataProvider.setCustomColumnsMetadata(customColumnMetadata);
+
             if (reloadingPhase)
             {
                 reloadingPhase = false;
@@ -894,13 +884,13 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
                 BasePagingLoadConfig loadConfig = new BasePagingLoadConfig();
                 loadConfig.setLimit(resultSetConfig.getLimit());
                 loadConfig.setOffset(resultSetConfig.getOffset());
-                SortInfo<T> sortInfo = resultSetConfig.getSortInfo();
+                SortInfo sortInfo = resultSetConfig.getSortInfo();
                 if (sortInfo != null)
                 {
-                    IColumnDefinition<T> sortField = sortInfo.getSortField();
+                    String sortField = sortInfo.getSortField();
                     if (sortField != null)
                     {
-                        loadConfig.setSortField(sortField.getIdentifier());
+                        loadConfig.setSortField(sortField);
                         loadConfig.setSortDir(translate(sortInfo.getSortDir()));
                     }
                 }
@@ -912,8 +902,6 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
                 this.reuse();
                 listEntities(resultSetConfig, this);
             }
-            List<GridCustomColumnInfo> customColumnMetadata = rowModels.getCustomColumnsMetadata();
-            customColumnsMetadataProvider.setCustomColumnsMetadata(customColumnMetadata);
             // convert the result to the model data for the grid control
             final List<M> models = createModels(rowModels);
             final PagingLoadResult<M> loadResult =
@@ -1315,10 +1303,8 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         }
     }
 
-    protected final void recreateColumnModelAndRefreshColumnsWithFilters()
+    private ColumnDefsAndConfigs<T> createColumnDefsAndConfigs()
     {
-        int logId = log("recreateColumnModelAndRefreshColumnsWithFilters");
-
         ColumnDefsAndConfigs<T> defsAndConfigs = createColumnsDefinition();
         // add custom columns
         List<GridCustomColumnInfo> customColumnsMetadata =
@@ -1341,6 +1327,15 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
             }
         }
 
+        return defsAndConfigs;
+    }
+
+    protected final void recreateColumnModelAndRefreshColumnsWithFilters()
+    {
+        int logId = log("recreateColumnModelAndRefreshColumnsWithFilters");
+
+        ColumnDefsAndConfigs<T> defsAndConfigs = createColumnDefsAndConfigs();
+
         this.columnDefinitions = defsAndConfigs.getColumnDefs();
         ColumnModel columnModel = createColumnModel(defsAndConfigs.getColumnConfigs());
 
@@ -1365,19 +1360,16 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
     {
         ColumnModel newColumnModel = columnModel;
         GridDisplaySettings settings = tryApplyDisplaySettings(newColumnModel);
-        if (settings != null)
+        if (settings != null && settings.getColumnConfigs() != null)
         {
             newColumnModel = createColumnModel(settings.getColumnConfigs());
             rebuildFiltersFromIds(settings.getFilteredColumnIds());
-            if (settings.getSortDir() != null && settings.getSortField() != null)
-            {
-                setGridSortInfo(settings.getSortField(), settings.getSortDir());
-            }
         } else
         {
             filterToolbar.rebuildColumnFilters(getInitialFilters());
         }
-        changeColumnModel(newColumnModel);
+        changeColumnModel(newColumnModel, settings != null ? settings.getSortField() : null,
+                settings != null ? settings.getSortDir() : null);
     }
 
     private void hideLoadingMask()
@@ -1395,14 +1387,37 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
                 columnModel, extractColumnIds(initialFilters), getGridSortInfo());
     }
 
-    private void changeColumnModel(ColumnModel columnModel)
+    private void reconfigureGrid(ColumnModel columnModelOfVisible)
+    {
+        List<Listener<?>> sortlisteners =
+                new ArrayList<Listener<?>>(grid.getListeners(Events.SortChange));
+        for (Listener<?> listener : sortlisteners)
+        {
+            grid.removeListener(Events.SortChange, listener);
+        }
+
+        grid.reconfigure(grid.getStore(), columnModelOfVisible);
+
+        for (Listener<?> listener : sortlisteners)
+        {
+            grid.addListener(Events.SortChange, listener);
+        }
+    }
+
+    private void changeColumnModel(ColumnModel columnModel, String sortField, SortDir sortDir)
     {
         fullColumnModel = columnModel;
 
         int logId = log("grid reconfigure");
         ColumnModel columnModelOfVisible = trimToVisibleColumns(columnModel);
 
-        grid.reconfigure(grid.getStore(), columnModelOfVisible);
+        if (sortDir != null && sortField != null)
+        {
+            pagingLoader.setSortDir(translate(sortDir));
+            pagingLoader.setSortField(sortField);
+        }
+        reconfigureGrid(columnModelOfVisible);
+
         viewContext.logStop(logId);
         registerGridSettingsChangesListener();
         // add listeners of full column model to trimmed model
@@ -1471,9 +1486,9 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         pagingLoader.load(0, PAGE_SIZE);
     }
 
-    private IDisplaySettingsGetter<T> createDisplaySettingsUpdater()
+    private IDisplaySettingsGetter createDisplaySettingsUpdater()
     {
-        return new IDisplaySettingsGetter<T>()
+        return new IDisplaySettingsGetter()
             {
                 public ColumnModel getColumnModel()
                 {
@@ -1490,7 +1505,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
                     return AbstractBrowserGrid.this;
                 }
 
-                public SortInfo<T> getSortState()
+                public SortInfo getSortState()
                 {
                     return AbstractBrowserGrid.this.getGridSortInfo();
                 }
@@ -1635,7 +1650,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
     // Default visibility so that friend classes can use -- should otherwise be considered private
     void saveColumnDisplaySettings()
     {
-        IDisplaySettingsGetter<T> settingsUpdater = createDisplaySettingsUpdater();
+        IDisplaySettingsGetter settingsUpdater = createDisplaySettingsUpdater();
         viewContext.getDisplaySettingsManager().storeSettings(getGridDisplayTypeID(),
                 settingsUpdater, false);
     }
@@ -1662,7 +1677,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         final List<IColumnDefinition<T>> columnDefs =
                 allColumns ? new ArrayList<IColumnDefinition<T>>(columnDefinitions)
                         : getVisibleColumns(columnDefinitions);
-        SortInfo<T> sortInfo = getGridSortInfo();
+        SortInfo sortInfo = getGridSortInfo();
         final TableExportCriteria<T> exportCriteria =
                 new TableExportCriteria<T>(resultSetKeyOrNull, sortInfo,
                         filterToolbar.getFilters(), columnDefs, columnDefinitions,
@@ -1671,23 +1686,10 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
     }
 
     // returns info about sorting in current grid
-    SortInfo<T> getGridSortInfo()
+    SortInfo getGridSortInfo()
     {
         ListStore<M> store = grid.getStore();
-        return translateSortInfo(store.getSortField(), store.getSortDir(), columnDefinitions);
-    }
-
-    private void setGridSortInfo(String sortField, SortDir sortDir)
-    {
-        com.extjs.gxt.ui.client.data.SortInfo old = grid.getStore().getSortState();
-        grid.getStore().setDefaultSort(sortField, translate(sortDir));
-
-        if (old.getSortDir() != translate(sortDir)
-                || (sortField == null && old.getSortField() != null)
-                || (sortField != null && sortField.equals(old.getSortField()) == false))
-        {
-            grid.getStore().sort(sortField, translate(sortDir));
-        }
+        return translateSortInfo(store.getSortField(), store.getSortDir());
     }
 
     /** @return the number of all objects cached in the browser */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java
index 02fa5d0f91068a41f1225afcc6c5e0b994635110..3129306578523f4b5ba934411a131b56de23d6b3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ColumnSettingsConfigurer.java
@@ -93,7 +93,7 @@ class ColumnSettingsConfigurer<T, M extends BaseEntityModel<T>>
                             DisplaySettingsManager displaySettingsManager =
                                     viewContext.getDisplaySettingsManager();
                             displaySettingsManager.storeSettings(gridDisplayTypeID,
-                                    new IDisplaySettingsGetter<T>()
+                                    new IDisplaySettingsGetter()
                                         {
                                             public Object getModifier()
                                             {
@@ -110,7 +110,7 @@ class ColumnSettingsConfigurer<T, M extends BaseEntityModel<T>>
                                                 return newColumnModel;
                                             }
 
-                                            public SortInfo<T> getSortState()
+                                            public SortInfo getSortState()
                                             {
                                                 return browserGrid.getGridSortInfo();
                                             }
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 a83719f05bd8253c5b176fa654e68bd6ac36748e..56cd7fb1cf36f3e43c534d4e68b8f477ffd44d72 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
@@ -36,12 +36,12 @@ public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsS
 
     private int offset = 0;
 
-    private SortInfo<T> sortInfo = new SortInfo<T>();
+    private SortInfo sortInfo = new SortInfo();
 
     private ResultSetFetchConfig<K> cacheConfig = ResultSetFetchConfig.createComputeAndCache();
 
     private Set<IColumnDefinition<T>> availableColumns;
-    
+
     private Set<String> idsOfPresentedColumns;
 
     private GridFilters<T> filters = GridFilters.createEmptyFilter();
@@ -71,7 +71,7 @@ public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsS
         this.offset = offset;
     }
 
-    public final void setSortInfo(final SortInfo<T> sortInfo)
+    public final void setSortInfo(final SortInfo sortInfo)
     {
         this.sortInfo = sortInfo;
     }
@@ -95,7 +95,7 @@ public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsS
     {
         return idsOfPresentedColumns;
     }
-    
+
     public void setPresentedColumns(List<IColumnDefinition<T>> presentedColumns)
     {
         Set<String> ids = new HashSet<String>();
@@ -110,7 +110,7 @@ public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsS
     {
         this.idsOfPresentedColumns = idsOfPresentedColumns;
     }
-    
+
     public final void copyPagingConfig(DefaultResultSetConfig<K, T> resultSetConfig)
     {
         setLimit(resultSetConfig.getLimit());
@@ -143,7 +143,7 @@ public class DefaultResultSetConfig<K, T> implements IResultSetConfig<K, T>, IsS
         return availableColumns;
     }
 
-    public final SortInfo<T> getSortInfo()
+    public final SortInfo 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 5aa2dafbcd9deeebc8c75925a15d0827c62fe0cd..94cdf8a473f29d9591846257cea36c19aca9abf2 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
@@ -54,7 +54,7 @@ public interface IResultSetConfig<K, T>
      * include custom columns only if this information was already fetched.
      */
     public Set<IColumnDefinition<T>> getAvailableColumns();
-    
+
     /**
      * Returns the IDs of those columns which will be shown at the client.
      */
@@ -63,7 +63,7 @@ public interface IResultSetConfig<K, T>
     /**
      * Returns the sort info.
      */
-    public SortInfo<T> getSortInfo();
+    public SortInfo getSortInfo();
 
     /** The filters which should be applied for the result. */
     public GridFilters<T> getFilters();
@@ -73,7 +73,7 @@ public interface IResultSetConfig<K, T>
      *         to compute them.
      */
     public String tryGetGridDisplayId();
-    
+
     /**
      * Should the error message from the server be long or short?
      */
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 94c2baea853eb6b23c31f1c3ada2c5924c9243fa..7811768e7a6c1781f5c213f8124d3c670a758c69 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
@@ -35,7 +35,7 @@ public class TableExportCriteria<T/* exported entity */> implements IsSerializab
     // a key at which data are stored in the server cache
     private String resultSetKey;
 
-    private SortInfo<T> sortInfo = new SortInfo<T>();
+    private SortInfo sortInfo = new SortInfo();
 
     /** @see IResultSetConfig#getFilters() */
     private GridFilters<T> filters;
@@ -57,7 +57,7 @@ public class TableExportCriteria<T/* exported entity */> implements IsSerializab
     {
     }
 
-    public TableExportCriteria(String resultSetKey, SortInfo<T> sortInfo, GridFilters<T> filters,
+    public TableExportCriteria(String resultSetKey, SortInfo sortInfo, GridFilters<T> filters,
             List<IColumnDefinition<T>> columnDefs, Set<IColumnDefinition<T>> availableColumns,
             String gridDisplayId)
     {
@@ -77,7 +77,7 @@ public class TableExportCriteria<T/* exported entity */> implements IsSerializab
         return resultSetKey;
     }
 
-    public SortInfo<T> getSortInfo()
+    public SortInfo getSortInfo()
     {
         return sortInfo;
     }
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 9af619f9699a4adeef9cfa4c5ada45b5d502ebd7..eff4ecd8b8c749ca553f7e5450cb4e3801a47b19 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
@@ -324,10 +324,10 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
             {
                 ids.addAll(idsOfPresentedColumns);
             }
-            IColumnDefinition<T> sortField = resultConfig.getSortInfo().getSortField();
+            String sortField = resultConfig.getSortInfo().getSortField();
             if (sortField != null)
             {
-                ids.add(sortField.getIdentifier());
+                ids.add(sortField);
             }
             GridFilters<T> filters = resultConfig.getFilters();
             List<GridColumnFilterInfo<T>> filterInfos = filters.tryGetFilterInfos();
@@ -601,7 +601,8 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         return true;
     }
 
-    private static <T> void sortData(final GridRowModels<T> data, final SortInfo<T> sortInfo)
+    private static <T> void sortData(final GridRowModels<T> data, final SortInfo sortInfo,
+            final Set<IColumnDefinition<T>> availableColumns)
     {
         assert data != null : "Unspecified data.";
         assert sortInfo != null : "Unspecified sort information.";
@@ -610,14 +611,26 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
             return;
         }
         final SortDir sortDir = sortInfo.getSortDir();
-        final IColumnDefinition<T> sortField = sortInfo.getSortField();
+        final String sortField = sortInfo.getSortField();
         if (sortDir == SortDir.NONE || sortField == null)
         {
             return;
+        } else
+        {
+            IColumnDefinition<T> sortFieldDefinition = null;
+            for (IColumnDefinition<T> column : availableColumns)
+            {
+                if (sortField.equals(column.getIdentifier()))
+                {
+                    sortFieldDefinition = column;
+                    Comparator<GridRowModel<T>> comparator =
+                            ColumnSortUtils.createComparator(sortDir, sortFieldDefinition);
+                    Collections.sort(data, comparator);
+                    break;
+                }
+            }
+
         }
-        Comparator<GridRowModel<T>> comparator =
-                ColumnSortUtils.createComparator(sortDir, sortField);
-        Collections.sort(data, comparator);
     }
 
     private static int getLimit(final int size, final int limit, final int offset)
@@ -735,7 +748,7 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         return calculateSortAndFilterResult(sessionToken, tableData,
                 createMatchingConfig(resultConfig, headers), dataKey, partial);
     }
-    
+
     private <T> IResultSetConfig<K, T> createMatchingConfig(IResultSetConfig<K, T> resultSetConfig,
             List<TableModelColumnHeader> headers)
     {
@@ -751,7 +764,7 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         Set<IColumnDefinition<T>> newAvailableColumns = new HashSet<IColumnDefinition<T>>();
         Set<String> idsOfPresentedColumns = resultSetConfig.getIDsOfPresentedColumns();
         Set<String> newIdsOfPresentedColumns = new HashSet<String>();
-        SortInfo<T> sortInfo = resultSetConfig.getSortInfo();
+        SortInfo sortInfo = resultSetConfig.getSortInfo();
         TableMap<String, GridColumnFilterInfo<T>> columnFilterInfos =
                 getColumFilters(resultSetConfig);
         List<GridColumnFilterInfo<T>> newColumnFilterInfos =
@@ -770,10 +783,10 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
             }
             if (sortInfo != null)
             {
-                IColumnDefinition<T> sortField = sortInfo.getSortField();
-                if (sortField != null && sortField.getIdentifier().equals(id))
+                String sortField = sortInfo.getSortField();
+                if (sortField != null && sortField.equals(id))
                 {
-                    sortInfo.setSortField(definition);
+                    sortInfo.setSortField(id);
                 }
             }
             GridColumnFilterInfo<T> filterInfo = columnFilterInfos.tryGet(id);
@@ -783,7 +796,7 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
                 newColumnFilterInfos.add(new GridColumnFilterInfo<T>(definition, pattern));
             }
         }
-        
+
         DefaultResultSetConfig<K, T> newConfig = new DefaultResultSetConfig<K, T>();
         newConfig.setAvailableColumns(newAvailableColumns);
         newConfig.setCacheConfig(resultSetConfig.getCacheConfig());
@@ -811,17 +824,17 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
             filterInfosOrNull = Collections.emptyList();
         }
         TableMap<String, GridColumnFilterInfo<T>> columnFilterInfos =
-            new TableMap<String, GridColumnFilterInfo<T>>(filterInfosOrNull,
-                    new IKeyExtractor<String, GridColumnFilterInfo<T>>()
-                    {
-                public String getKey(GridColumnFilterInfo<T> e)
-                {
-                    return e.getFilteredField().getIdentifier();
-                }
-                    });
+                new TableMap<String, GridColumnFilterInfo<T>>(filterInfosOrNull,
+                        new IKeyExtractor<String, GridColumnFilterInfo<T>>()
+                            {
+                                public String getKey(GridColumnFilterInfo<T> e)
+                                {
+                                    return e.getFilteredField().getIdentifier();
+                                }
+                            });
         return columnFilterInfos;
     }
-    
+
     private <T> boolean hasNoStaleAvailableColumn(IResultSetConfig<K, T> resultSetConfig,
             List<TableModelColumnHeader> headers)
     {
@@ -833,6 +846,10 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         Set<IColumnDefinition<T>> availableColumns = resultSetConfig.getAvailableColumns();
         if (availableColumns != null)
         {
+            if (availableColumns.size() != headers.size())
+            {
+                return false;
+            }
             for (IColumnDefinition<T> definition : availableColumns)
             {
                 if (headerIds.contains(definition.getIdentifier()) == false)
@@ -941,8 +958,8 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         final int size = filteredData.size();
         final int offset = getOffset(size, resultConfig.getOffset());
         final int limit = getLimit(size, resultConfig.getLimit(), offset);
-        final SortInfo<T> sortInfo = resultConfig.getSortInfo();
-        sortData(filteredData, sortInfo);
+        final SortInfo sortInfo = resultConfig.getSortInfo();
+        sortData(filteredData, sortInfo, resultConfig.getAvailableColumns());
         final GridRowModels<T> list = subList(filteredData, offset, limit);
         return new DefaultResultSet<K, T>(dataKey, list, size, partial);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SortInfo.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SortInfo.java
index 305bdfaa92a1cd743af7403be4ebad5f12a2dc8a..f96fdceefc3a9b696533e8df6424ef77ca728ec7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SortInfo.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/SortInfo.java
@@ -18,7 +18,6 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
 
 /**
@@ -26,20 +25,20 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
  * 
  * @author Christian Ribeaud
  */
-public final class SortInfo<T> implements ISerializable
+public final class SortInfo implements ISerializable
 {
     private static final long serialVersionUID = 1L;
 
-    private IColumnDefinition<T> sortField;
+    private String sortField;
 
     private SortDir sortDir = SortDir.NONE;
 
-    public final IColumnDefinition<T> getSortField()
+    public final String getSortField()
     {
         return sortField;
     }
 
-    public final void setSortField(final IColumnDefinition<T> sortField)
+    public final void setSortField(final String sortField)
     {
         this.sortField = sortField;
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/clientnonjs/DisplaySettingsManagerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/clientnonjs/DisplaySettingsManagerTest.java
index bef048fd1b34a875e6747caf438b31456b018ecd..ff2bc2592cbadc4351bfe9c669675ce94f88669a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/clientnonjs/DisplaySettingsManagerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/clientnonjs/DisplaySettingsManagerTest.java
@@ -20,7 +20,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import org.apache.poi.hssf.record.formula.functions.T;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.testng.AssertJUnit;
@@ -84,7 +83,7 @@ public class DisplaySettingsManagerTest extends AssertJUnit
 
     private IDelayedUpdater updater;
 
-    private IDisplaySettingsGetter<T> grid;
+    private IDisplaySettingsGetter grid;
 
     private DisplaySettingsManager manager;
 
@@ -94,7 +93,6 @@ public class DisplaySettingsManagerTest extends AssertJUnit
 
     private WebClientConfiguration webClientConfiguration;
 
-    @SuppressWarnings("unchecked")
     @BeforeMethod
     public void setUp()
     {
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 74bbb35a033f08e2ae50397c4291f8e89fc2c9e7..838abc9bb63fe8a6411fd77309422ab6906046e4 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
@@ -225,11 +225,10 @@ public final class CachedResultSetManagerTest extends AssertJUnit
             return this;
         }
 
-        private SortInfo<DataHolder> createSortInfo(String columnDefinitionID,
-                SortDir sortingDirection)
+        private SortInfo createSortInfo(String columnDefinitionID, SortDir sortingDirection)
         {
-            SortInfo<DataHolder> sortInfo = new SortInfo<DataHolder>();
-            sortInfo.setSortField(getDefinition(columnDefinitionID));
+            SortInfo sortInfo = new SortInfo();
+            sortInfo.setSortField(getDefinition(columnDefinitionID).getIdentifier());
             sortInfo.setSortDir(sortingDirection);
             return sortInfo;
         }
@@ -282,16 +281,20 @@ public final class CachedResultSetManagerTest extends AssertJUnit
             return recordedColumnCodes.toString();
         }
     }
-    
-    private static final class MockOriginalDataProvider implements IOriginalDataProvider<DataHolder>
+
+    private static final class MockOriginalDataProvider implements
+            IOriginalDataProvider<DataHolder>
     {
         private final List<DataHolder> data;
+
         private final int maxSizeThresholdForSlowDelivery;
+
         private final long timeToDeliver;
-        
+
         private List<Integer> recordedMaxSizes = new ArrayList<Integer>();
 
-        MockOriginalDataProvider(List<DataHolder> data, int maxSizeThresholdForSlowDelivery, long timeToDeliver)
+        MockOriginalDataProvider(List<DataHolder> data, int maxSizeThresholdForSlowDelivery,
+                long timeToDeliver)
         {
             this.data = data;
             this.maxSizeThresholdForSlowDelivery = maxSizeThresholdForSlowDelivery;
@@ -318,7 +321,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
         {
             return Arrays.asList();
         }
-        
+
     }
 
     private IOriginalDataProvider<DataHolder> originalDataProvider;
@@ -385,16 +388,16 @@ public final class CachedResultSetManagerTest extends AssertJUnit
 
         context.assertIsSatisfied();
     }
-    
+
     @Test
     public void testOffsetAndLimit()
     {
         prepareDataAndCustomColumnDefinitions(20, 10);
         ResultSetConfigBuilder builder =
-            new ResultSetConfigBuilder(COL_DEFS).displayID(GRID_DISPLAY_ID);
-        
+                new ResultSetConfigBuilder(COL_DEFS).displayID(GRID_DISPLAY_ID);
+
         getAndCheckRows(10, 0, builder.offset(-1).limit(10));
-        
+
         builder.fetchFromCache(KEY);
         getAndCheckRows(10, 9, builder.offset(9).limit(10));
         getAndCheckRows(10, 10, builder.offset(10).limit(10));
@@ -402,7 +405,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
         getAndCheckRows(1, 19, builder.offset(19).limit(10));
         getAndCheckRows(1, 19, builder.offset(20).limit(10));
         getAndCheckRows(1, 19, builder.offset(21).limit(10));
-        
+
         context.assertIsSatisfied();
     }
 
@@ -880,7 +883,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
 
         context.assertIsSatisfied();
     }
-    
+
     @Test
     public void testWaitingForFuture()
     {
@@ -895,35 +898,34 @@ public final class CachedResultSetManagerTest extends AssertJUnit
                     will(returnValue(KEY));
                 }
             });
-        
+
         // First call gets only first page
         IResultSet<Long, DataHolder> resultSet =
-            resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider);
+                resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider);
         assertEquals(true, resultSet.isPartial());
         assertEquals(1, resultSet.getList().size());
         assertEquals(1, resultSet.getTotalLength());
         assertEquals("a", getData(resultSet, 0));
-        
+
         // Second call has to wait
         builder.fetchFromCache(KEY);
-        resultSet =
-            resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider);
+        resultSet = resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider);
         assertEquals(false, resultSet.isPartial());
         assertEquals(1, resultSet.getList().size());
         assertEquals(4, resultSet.getTotalLength());
         assertEquals("a", getData(resultSet, 0));
-        
+
         // Third call get sorted value
         builder.sortDesc("col1");
-        resultSet =
-            resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider);
+        resultSet = resultSetManager.getResultSet(SESSION_TOKEN, builder.get(), dataProvider);
         assertEquals(false, resultSet.isPartial());
         assertEquals(1, resultSet.getList().size());
         assertEquals(4, resultSet.getTotalLength());
         assertEquals("d", getData(resultSet, 0));
-        
-        assertEquals(Arrays.asList(1, Integer.MAX_VALUE).toString(), dataProvider.recordedMaxSizes.toString());
-        
+
+        assertEquals(Arrays.asList(1, Integer.MAX_VALUE).toString(),
+                dataProvider.recordedMaxSizes.toString());
+
         context.assertIsSatisfied();
     }
 
@@ -1027,7 +1029,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
     {
         prepareDataAndCustomColumnDefinitions(size, Integer.MAX_VALUE, columns);
     }
-    
+
     private void prepareDataAndCustomColumnDefinitions(final int size, final int maxSize,
             final GridCustomColumn... columns)
     {
@@ -1044,10 +1046,10 @@ public final class CachedResultSetManagerTest extends AssertJUnit
                         rows[i] = new DataHolder(i + "-a" + i % 2);
                     }
                     will(returnValue(Arrays.asList(rows)));
-                    
+
                     one(originalDataProvider).getHeaders();
                     will(returnValue(Arrays.asList()));
-                    
+
                     if (size >= maxSize)
                     {
                         one(originalDataProvider).getOriginalData(Integer.MAX_VALUE);
@@ -1131,7 +1133,7 @@ public final class CachedResultSetManagerTest extends AssertJUnit
                 {
                     return null; // unused
                 }
-                
+
                 public DataTypeCode tryToGetDataType()
                 {
                     return null;
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java
index 4fbbefc0b2974020974da470a82b5914663527e8..8813a2bbab20070eb88117b07ea38a96f34c0288 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/FilterSystemTest.java
@@ -21,7 +21,9 @@ import static org.testng.AssertJUnit.assertEquals;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.testng.annotations.Test;
 
@@ -34,7 +36,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewColumnOrFilter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ParameterWithValue;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableGridColumnDefinition;
 
 /**
  * @author Franz-Josef Elmer
@@ -119,8 +123,9 @@ public class FilterSystemTest extends SystemTestCase
     {
         DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>> config =
                 new DefaultResultSetConfig<String, TableModelRowWithObject<GridCustomFilter>>();
-        config.setAvailableColumns(Collections
-                .<IColumnDefinition<TableModelRowWithObject<GridCustomFilter>>> emptySet());
+        config.setAvailableColumns(createAvailableColumnsDefinition());
+        config.setIDsOfPresentedColumns(new HashSet<String>(Arrays.asList("NAME", "DESCRIPTION",
+                "EXPRESSION", "IS_PUBLIC", "REGISTRATOR", "REGISTRATION_DATE")));
         CustomFilterInfo<TableModelRowWithObject<GridCustomFilter>> customFilterInfo =
                 new CustomFilterInfo<TableModelRowWithObject<GridCustomFilter>>();
         customFilterInfo.setExpression("${threshold} < 42");
@@ -132,6 +137,26 @@ public class FilterSystemTest extends SystemTestCase
         return config;
     }
 
+    private Set<IColumnDefinition<TableModelRowWithObject<GridCustomFilter>>> createAvailableColumnsDefinition()
+    {
+        Set<IColumnDefinition<TableModelRowWithObject<GridCustomFilter>>> result =
+                new HashSet<IColumnDefinition<TableModelRowWithObject<GridCustomFilter>>>();
+
+        String[] headerIds =
+                    { "NAME", "DESCRIPTION", "EXPRESSION", "IS_PUBLIC", "REGISTRATOR",
+                            "REGISTRATION_DATE" };
+
+        for (int i = 0; i < headerIds.length; i++)
+        {
+            TableModelColumnHeader header =
+                    new TableModelColumnHeader(headerIds[i], headerIds[i], i);
+            IColumnDefinition<TableModelRowWithObject<GridCustomFilter>> definition =
+                    new TypedTableGridColumnDefinition<GridCustomFilter>(header, null, "", null);
+            result.add(definition);
+        }
+        return result;
+    }
+
     private NewColumnOrFilter createFilter()
     {
         NewColumnOrFilter filter = new NewColumnOrFilter();