diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServer.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServer.java
index f829c45d0f81cfcff9606e5b8fac5dd906867b76..808ed210bed510124947ffbda22f55f32220f6f4 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServer.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServer.java
@@ -16,8 +16,8 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.server;
 
-import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_SERVICE_NAME;
-import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
+import static ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants.DATA_STORE_SERVER_SERVICE_NAME;
+import static ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
 
 import java.io.IOException;
 import java.util.Enumeration;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java
index 9502648050ba7a061150824c307bf8741853e0fe..b96126f2799e342c18cf186fd5b1a1465a8ed258 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServlet.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.server;
 
-import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
+import static ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
 
 import java.awt.image.BufferedImage;
 import java.io.File;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/GenericDssLinkReportingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/GenericDssLinkReportingPlugin.java
index 08f3fb5ca29f9cae94491252aabb5cf699c014b8..3b9b59ab8e8d72fd24fdc83e054e437e0838a9c1 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/GenericDssLinkReportingPlugin.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/GenericDssLinkReportingPlugin.java
@@ -21,7 +21,7 @@ import java.util.ArrayList;
 import java.util.Properties;
 
 import ch.systemsx.cisd.common.utilities.PropertyUtils;
-import ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants;
+import ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/DataStoreApiUrlUtilities.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/DataStoreApiUrlUtilities.java
index 6c47734f1e0dd684ff51b0edd2e2582c36c86d0b..c2ffa32197454f2a289fa7166aaa65a4c4d8f92b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/DataStoreApiUrlUtilities.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/DataStoreApiUrlUtilities.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.shared.api.v1;
 
-import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
+import static ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
 
 /**
  * @author Chandrasekhar Ramakrishnan
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponentTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponentTest.java
index d43a5648d8e1e7a8fafd0a77fd38de76e7806ad4..e82cb149dd3c4ec0a58946f1c52a9a868f9dc284 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponentTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponentTest.java
@@ -64,8 +64,8 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.FileInfoDssBuilder;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.FileInfoDssDTO;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
-import ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
+import ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
 
 /**
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java
index 16801739d67ab4fdb9dc16ada288d7055766fa0a..2cf99fdbf416e1be460847389c785cd26569b337 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java
@@ -18,7 +18,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server;
 
 import static ch.systemsx.cisd.common.test.AssertionUtil.assertContains;
 import static ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID;
-import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
+import static ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
 import static org.testng.AssertJUnit.assertEquals;
 
 import java.awt.image.BufferedImage;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGridColumnDefinitionUI.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGridColumnDefinitionUI.java
index 26a0d7e5b8a985af992442bddd521a85eb1d3c5b..247f57ae40a4b9d2181d98777091de44772b561b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGridColumnDefinitionUI.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/TypedTableGridColumnDefinitionUI.java
@@ -17,13 +17,13 @@
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionUI;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.TypedTableGridColumnDefinition;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ILinkGenerator;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 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
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 e398b4ec10d38f6f81fa261aba3179f5f491595d..c44505059ee5a258e7b29b76f8efc1dbf41edf15 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
@@ -26,6 +26,7 @@ import java.util.Set;
 import com.extjs.gxt.ui.client.GXT;
 import com.extjs.gxt.ui.client.Style.Orientation;
 import com.extjs.gxt.ui.client.Style.SelectionMode;
+import com.extjs.gxt.ui.client.data.BasePagingLoadConfig;
 import com.extjs.gxt.ui.client.data.BasePagingLoadResult;
 import com.extjs.gxt.ui.client.data.BasePagingLoader;
 import com.extjs.gxt.ui.client.data.Loader;
@@ -718,6 +719,23 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         }
     }
 
+    private static com.extjs.gxt.ui.client.Style.SortDir translate(SortDir sortDir)
+    {
+        if (sortDir.equals(SortDir.ASC))
+        {
+            return com.extjs.gxt.ui.client.Style.SortDir.ASC;
+        } else if (sortDir.equals(SortDir.DESC))
+        {
+            return com.extjs.gxt.ui.client.Style.SortDir.DESC;
+        } else if (sortDir.equals(SortDir.NONE))
+        {
+            return com.extjs.gxt.ui.client.Style.SortDir.NONE;
+        } else
+        {
+            throw new IllegalStateException("unknown sort dir: " + sortDir);
+        }
+    }
+    
     /** @return number of rows in the grid */
     public final int getRowNumber()
     {
@@ -729,7 +747,7 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
         private final AsyncCallback<PagingLoadResult<M>> delegate;
 
         // configuration with which the listing was called
-        private final DefaultResultSetConfig<String, T> resultSetConfig;
+        private DefaultResultSetConfig<String, T> resultSetConfig;
 
         private int logID;
 
@@ -777,6 +795,20 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends BaseEntityMod
             } else if (partial)
             {
                 reloadingPhase = true;
+                BasePagingLoadConfig loadConfig = new BasePagingLoadConfig();
+                loadConfig.setLimit(resultSetConfig.getLimit());
+                loadConfig.setOffset(resultSetConfig.getOffset());
+                SortInfo<T> sortInfo = resultSetConfig.getSortInfo();
+                if (sortInfo != null)
+                {
+                    IColumnDefinition<T> sortField = sortInfo.getSortField();
+                    if (sortField != null)
+                    {
+                        loadConfig.setSortField(sortField.getIdentifier());
+                        loadConfig.setSortDir(translate(sortInfo.getSortDir()));
+                    }
+                }
+                resultSetConfig = createPagingConfig(loadConfig, filterToolbar.getFilters(), resultSetConfig.tryGetGridDisplayId());
                 resultSetConfig.setCacheConfig(ResultSetFetchConfig
                         .createFetchFromCacheAndRecompute(key));
                 // this.reuse(); // FIXME PTR has to be done?
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ListColumnFilterWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ListColumnFilterWidget.java
index 740bfc8393d182505f2d10717cce0c9659c10942..ddfb4bd7381663d390ef58dc21e3717e7ed61609 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ListColumnFilterWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/ListColumnFilterWidget.java
@@ -58,7 +58,7 @@ public class ListColumnFilterWidget<T> extends ComboBox<ModelData> implements
 
     private static final String EMPTY_VALUE = "(empty)";
 
-    private final IColumnDefinition<T> filteredField;
+    private IColumnDefinition<T> filteredField;
 
     private final IDelegatedAction onFilterAction;
 
@@ -218,6 +218,11 @@ public class ListColumnFilterWidget<T> extends ComboBox<ModelData> implements
         return filteredField.getIdentifier();
     }
 
+    public void setFilteredField(IColumnDefinition<T> filteredField)
+    {
+        this.filteredField = filteredField;
+    }
+
     public Widget getWidget()
     {
         return this;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/TextColumnFilterWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/TextColumnFilterWidget.java
index d096a19ba7d7c6b506a1a669f8ff30f08a324491..e2458c87982285324cc8fc48482bbd1d824cce19 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/TextColumnFilterWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/TextColumnFilterWidget.java
@@ -36,7 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
 public class TextColumnFilterWidget<T/* entity */> extends StoreFilterField<ModelData> implements
         IColumnFilterWidget<T>
 {
-    private final IColumnDefinition<T> filteredField;
+    private IColumnDefinition<T> filteredField;
 
     private final IDelegatedAction onFilterAction;
 
@@ -93,6 +93,11 @@ public class TextColumnFilterWidget<T/* entity */> extends StoreFilterField<Mode
         return this;
     }
 
+    public void setFilteredField(IColumnDefinition<T> filteredField)
+    {
+        this.filteredField = filteredField;
+    }
+
     public IColumnFilterWidget<T> createOrRefresh(List<String> distinctValuesOrNull)
     {
         if (distinctValuesOrNull == null)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/FilterToolbar.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/FilterToolbar.java
index 20dc48cda1bbb83537b23e4f42510186712f457d..6f4d0f7fa22db0078fb3f9ffb2d42b448bf64d49 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/FilterToolbar.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/FilterToolbar.java
@@ -40,6 +40,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ParameterWithValue;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableGridColumnDefinition;
 
 /**
  * Toolbar with filters.
@@ -479,12 +480,21 @@ public class FilterToolbar<T> extends ToolBar implements IDatabaseModificationOb
         }
         for (int i = 0; i < filters1.size(); i++)
         {
-            String colId1 = filters1.get(i).getIdentifier();
-            String colId2 = filters2.get(i).getFilteredColumnId();
-            if (colId1.equals(colId2) == false)
+            IColumnDefinition<T> filter1 = filters1.get(i);
+            IColumnDefinition<T> filter2 = filters2.get(i).getFilter().getFilteredField();
+            if (filter1.getIdentifier().equals(filter2.getIdentifier()) == false)
             {
                 return true;
             }
+            if (filter1 instanceof TypedTableGridColumnDefinition && filter2 instanceof TypedTableGridColumnDefinition)
+            {
+                TypedTableGridColumnDefinition<?> coldef1 = (TypedTableGridColumnDefinition<?>) filter1;
+                TypedTableGridColumnDefinition<?> coldef2 = (TypedTableGridColumnDefinition<?>) filter2;
+                if (coldef1.getIndex() != coldef2.getIndex())
+                {
+                    return true;
+                }
+            }
         }
         return false;
     }
@@ -503,6 +513,9 @@ public class FilterToolbar<T> extends ToolBar implements IDatabaseModificationOb
                 // we do not have distinct values in the columns at this moment, so plain filter
                 // widget is always created
                 filterWidget = new TextColumnFilterWidget<T>(columnDefinition, onFilterAction);
+            } else
+            {
+                filterWidget.setFilteredField(columnDefinition);
             }
             filterWidgets.add(filterWidget);
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/IColumnFilterWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/IColumnFilterWidget.java
index c930cadcd2c8dc24b803b969fa6f68123241e72e..2e5142cdab7b578f84d903cc6b16109c8fbdf765 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/IColumnFilterWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/expressions/filter/IColumnFilterWidget.java
@@ -21,6 +21,7 @@ import java.util.List;
 import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridColumnFilterInfo;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
 
 /**
  * Widget which controls filtering of one grid column.
@@ -33,6 +34,8 @@ public interface IColumnFilterWidget<T>
 
     /** @return filter with the pattern */
     GridColumnFilterInfo<T> getFilter();
+    
+    void setFilteredField(IColumnDefinition<T> filteredField);
 
     /** id of the filtered column */
     String getFilteredColumnId();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java
index 42575dfd98aab012ca39ac4f0b5baf59df423f2e..a36aad5d603e6bcce5a7fabc59ce9641dba439dc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.util;
 
 import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericViewModel;
+import ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants;
 import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 
@@ -32,8 +33,6 @@ public class DataSetUtils
 
     private static final String AUTO_RESOLVE = "autoResolve";
 
-    private static final String SESSION_ID = "sessionID";
-
     private static final String MODE = "mode";
 
     public static String createDataViewUrl(ExternalData dataSet, GenericViewModel model,
@@ -42,7 +41,8 @@ public class DataSetUtils
         URLMethodWithParameters methodWithParameters =
                 new URLMethodWithParameters(dataSet.getDataStore().getDownloadUrl() + "/"
                         + dataSet.getCode());
-        methodWithParameters.addParameter(SESSION_ID, model.getSessionContext().getSessionID());
+        String sessionID = model.getSessionContext().getSessionID();
+        methodWithParameters.addParameter(GenericSharedConstants.SESSION_ID_PARAMETER, sessionID);
         if (modeOrNull != null)
         {
             methodWithParameters.addParameter(MODE, modeOrNull);
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 9a9a1a8f1a19da78d304b82f92ecafb4ede1d127..736042d2d549b2990cfe711c87da555630957f57 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
@@ -40,11 +40,14 @@ import org.apache.log4j.Logger;
 import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.base.namedthread.NamingThreadPoolExecutor;
+import ch.systemsx.cisd.common.collections.IKeyExtractor;
+import ch.systemsx.cisd.common.collections.TableMap;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.shared.basic.AlternativesStringFilter;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ColumnDistinctValues;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.CustomFilterInfo;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridColumnFilterInfo;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridCustomColumnInfo;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GridFilters;
@@ -57,12 +60,14 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.calculator.ITableDataP
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.XMLPropertyTransformer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
+import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.PrimitiveValue;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomColumn;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SortInfo;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SortInfo.SortDir;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableGridColumnDefinition;
 
 /**
  * A {@link IResultSetManager} implementation which caches the full data retrieved using
@@ -721,7 +726,116 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         // with tableData (provided by dataProvider). The bug is fixed (by checking index in
         // TypedTableGridColumnDefinition.tryGetComparableValue()), but now a new bug pops up: The
         // combo box of a column filter element can have the wrong values.
-        return calculateSortAndFilterResult(sessionToken, tableData, resultConfig, dataKey, partial);
+        return calculateSortAndFilterResult(sessionToken, tableData,
+                createMatchingConfig(resultConfig, headers), dataKey, partial);
+    }
+    
+    private <T> IResultSetConfig<K, T> createMatchingConfig(IResultSetConfig<K, T> resultSetConfig,
+            List<TableModelColumnHeader> headers)
+    {
+        if (headers.isEmpty())
+        {
+            // Not TypedTableGrid
+            return resultSetConfig;
+        }
+        if (hasNoStaleAvailableColumn(resultSetConfig, headers))
+        {
+            return resultSetConfig;
+        }
+        Set<IColumnDefinition<T>> newAvailableColumns = new HashSet<IColumnDefinition<T>>();
+        Set<String> idsOfPresentedColumns = resultSetConfig.getIDsOfPresentedColumns();
+        Set<String> newIdsOfPresentedColumns = new HashSet<String>();
+        SortInfo<T> sortInfo = resultSetConfig.getSortInfo();
+        TableMap<String, GridColumnFilterInfo<T>> columnFilterInfos =
+                getColumFilters(resultSetConfig);
+        List<GridColumnFilterInfo<T>> newColumnFilterInfos =
+                new ArrayList<GridColumnFilterInfo<T>>();
+        for (TableModelColumnHeader header : headers)
+        {
+            @SuppressWarnings("unchecked")
+            IColumnDefinition<T> definition =
+                    (IColumnDefinition<T>) new TypedTableGridColumnDefinition<ISerializable>(
+                            header, null, "", null);
+            newAvailableColumns.add(definition);
+            String id = header.getId();
+            if (header.isHidden() == false || idsOfPresentedColumns.contains(id))
+            {
+                newIdsOfPresentedColumns.add(id);
+            }
+            if (sortInfo != null)
+            {
+                IColumnDefinition<T> sortField = sortInfo.getSortField();
+                if (sortField != null && sortField.getIdentifier().equals(id))
+                {
+                    sortInfo.setSortField(definition);
+                }
+            }
+            GridColumnFilterInfo<T> filterInfo = columnFilterInfos.tryGet(id);
+            if (filterInfo != null)
+            {
+                String pattern = filterInfo.tryGetFilterPattern();
+                newColumnFilterInfos.add(new GridColumnFilterInfo<T>(definition, pattern));
+            }
+        }
+        
+        DefaultResultSetConfig<K, T> newConfig = new DefaultResultSetConfig<K, T>();
+        newConfig.setAvailableColumns(newAvailableColumns);
+        newConfig.setCacheConfig(resultSetConfig.getCacheConfig());
+        newConfig.setCustomColumnErrorMessageLong(resultSetConfig.isCustomColumnErrorMessageLong());
+        // custom filter will be ignored because it may be stale too
+        GridFilters<T> newFilters =
+                newColumnFilterInfos.isEmpty() ? GridFilters.<T> createEmptyFilter() : GridFilters
+                        .createColumnFilter(newColumnFilterInfos);
+        newConfig.setFilters(newFilters);
+        newConfig.setGridDisplayId(resultSetConfig.tryGetGridDisplayId());
+        newConfig.setIDsOfPresentedColumns(newIdsOfPresentedColumns);
+        newConfig.setLimit(resultSetConfig.getLimit());
+        newConfig.setOffset(resultSetConfig.getOffset());
+        newConfig.setSortInfo(sortInfo);
+        return newConfig;
+    }
+
+    private <T> TableMap<String, GridColumnFilterInfo<T>> getColumFilters(
+            IResultSetConfig<K, T> resultSetConfig)
+    {
+        GridFilters<T> filters = resultSetConfig.getFilters();
+        List<GridColumnFilterInfo<T>> filterInfosOrNull = filters.tryGetFilterInfos();
+        if (filterInfosOrNull == null)
+        {
+            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();
+                }
+                    });
+        return columnFilterInfos;
+    }
+    
+    private <T> boolean hasNoStaleAvailableColumn(IResultSetConfig<K, T> resultSetConfig,
+            List<TableModelColumnHeader> headers)
+    {
+        Set<String> headerIds = new HashSet<String>();
+        for (TableModelColumnHeader header : headers)
+        {
+            headerIds.add(header.getId());
+        }
+        Set<IColumnDefinition<T>> availableColumns = resultSetConfig.getAvailableColumns();
+        if (availableColumns != null)
+        {
+            for (IColumnDefinition<T> definition : availableColumns)
+            {
+                if (headerIds.contains(definition.getIdentifier()) == false)
+                {
+                    return false;
+                }
+            }
+        }
+        return true;
     }
 
     private <T> Future<TableData<T>> createFutureWhichIsPresent(final K dataKey,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/DataStoreServiceFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/DataStoreServiceFactory.java
index 51a014a366858927f8a0e25c804db782cb4ccf58..7dbf372abb387b1e91a8cbac8c6d532220da4a3d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/DataStoreServiceFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/DataStoreServiceFactory.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business;
 
-import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_SERVICE_NAME;
+import static ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants.DATA_STORE_SERVER_SERVICE_NAME;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/GenericSharedConstants.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/GenericSharedConstants.java
similarity index 90%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/GenericSharedConstants.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/GenericSharedConstants.java
index 1218d74ae2707786eb8e2785d7fe05d3ed168826..d3eba6e3abe28f85451f607ee7e6d6401a1142c6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/GenericSharedConstants.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/GenericSharedConstants.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.shared;
+package ch.systemsx.cisd.openbis.generic.shared.basic;
 
 /**
  * Some public shared constants.
@@ -37,5 +37,7 @@ public final class GenericSharedConstants
     /** Part of the URL of the DSS service. */
     public static final String DATA_STORE_SERVER_SERVICE_NAME =
             DATA_STORE_SERVER_WEB_APPLICATION_NAME + "/dss";
+    
+    public static final String SESSION_ID_PARAMETER = "sessionID";
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/framework/renderers/SimpleImageHtmlRenderer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/SimpleImageHtmlRenderer.java
similarity index 78%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/framework/renderers/SimpleImageHtmlRenderer.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/SimpleImageHtmlRenderer.java
index 9d4d1a9330fe6767ca539013d74c6a5680303924..6b5ce2206947498c076eb67800bbbc956a6015d6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/framework/renderers/SimpleImageHtmlRenderer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/SimpleImageHtmlRenderer.java
@@ -14,9 +14,8 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.renderers;
+package ch.systemsx.cisd.openbis.generic.shared.basic;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters;
 
 /**
  * @author Tomasz Pylak
@@ -28,8 +27,10 @@ public class SimpleImageHtmlRenderer
             String downloadURL, String sessionID)
     {
         URLMethodWithParameters methodWithParameters =
-                new URLMethodWithParameters(downloadURL + "/datastore_server/" + imagePath);
-        methodWithParameters.addParameter("sessionID", sessionID);
+                new URLMethodWithParameters(downloadURL + "/"
+                        + GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME + "/"
+                        + imagePath);
+        methodWithParameters.addParameter(GenericSharedConstants.SESSION_ID_PARAMETER, sessionID);
         String linkURL = methodWithParameters.toString();
 
         methodWithParameters.addParameter("mode", "thumbnail" + width + "x" + height);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/TypedTableGridColumnDefinition.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TypedTableGridColumnDefinition.java
similarity index 77%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/TypedTableGridColumnDefinition.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TypedTableGridColumnDefinition.java
index bbc740facd89af7bf54d2c720f2dc56eff6a38f6..365c66f00a4ae3d71f61842d1d3de821d2c87a09 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/TypedTableGridColumnDefinition.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TypedTableGridColumnDefinition.java
@@ -1,19 +1,12 @@
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific;
+package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
 import java.util.List;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.renderers.SimpleImageHtmlRenderer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
 import ch.systemsx.cisd.openbis.generic.shared.basic.ISerializable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.SimpleDateRenderer;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DateTableCell;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DssLinkTableCell;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GeneratedImageTableCell;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ImageTableCell;
-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.SimpleImageHtmlRenderer;
 
 /**
  * @author Franz-Josef Elmer
@@ -53,6 +46,11 @@ public class TypedTableGridColumnDefinition<T extends ISerializable> implements
     {
         return header.getId();
     }
+    
+    public int getIndex()
+    {
+        return header.getIndex();
+    }
 
     public String tryToGetProperty(String key)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataStoreTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataStoreTranslator.java
index ec288227a1808cf30c87ca5436763b976d8ceb2b..fa5821f579bd61f08ff6efc64296fefa0a0b74e6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataStoreTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataStoreTranslator.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.translator;
 
-import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
+import static ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
index 334bb9b3ab9de638e5f245768d974a3b8ce923d7..88f2f4300c2013ec90d15f6ce7f776b39906a87e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.server;
 
-import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
+import static ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/ExternalDataTranslatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/ExternalDataTranslatorTest.java
index 491e3f777c6f229da929d3eedaae0ea2452387d7..e8ff1242173711c49222daaade732e283772dfdc 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/ExternalDataTranslatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/ExternalDataTranslatorTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.translator;
 
-import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
+import static ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants.DATA_STORE_SERVER_WEB_APPLICATION_NAME;
 
 import java.util.Date;
 import java.util.HashSet;
diff --git a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java
index 7e7e233acb495ef5b02c2eb77208891bf6a84e62..7b5a29d9cfcefdf619413692bf1f0b16315d6876 100644
--- a/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java
+++ b/rtd_yeastx/source/java/ch/systemsx/cisd/yeastx/eicml/EICMLChromatogramImagesReporter.java
@@ -27,7 +27,7 @@ import net.lemnik.eodsql.DataIterator;
 
 import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.openbis.dss.yeastx.server.EICMLChromatogramGeneratorServlet;
-import ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants;
+import ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GeneratedImageTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java
index ea1d831ec7873524c511b17f5d2a14b58e00aeed..25288f98a67b29cccf5c869e1b1067ce3da4cfbb 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java
@@ -33,7 +33,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.test.RecordingMatcher;
 import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase;
-import ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants;
+import ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty;