diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExpressionWithParameters.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExpressionWithParameters.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ccff2cb72224a2d2eda21e9ad147446a3226941
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExpressionWithParameters.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2009 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.shared.basic.dto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * {@link AbstractExpression} extension that stores expression parameters.
+ * 
+ * @author Izabela Adamczyk
+ */
+abstract public class AbstractExpressionWithParameters extends AbstractExpression
+{
+    private static final long serialVersionUID = ServiceVersionHolder.VERSION;
+
+    // need to use list here because set doesn't provide fixed order
+    private List<String> parameters;
+
+    public AbstractExpressionWithParameters()
+    {
+    }
+
+    public List<String> getParameters()
+    {
+        return parameters;
+    }
+
+    private void setParameters(List<String> parameters)
+    {
+        this.parameters = parameters;
+    }
+
+    public void setupParameters(List<String> allParameters)
+    {
+        setParameters(createDistinctParametersList(allParameters));
+    }
+
+    private static List<String> createDistinctParametersList(List<String> allParameters)
+    {
+        List<String> result = new ArrayList<String>();
+        for (String parameter : allParameters)
+        {
+            if (result.contains(parameter) == false)
+            {
+                result.add(parameter);
+            }
+        }
+        return result;
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/GridCustomFilter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/GridCustomFilter.java
index 863c9e8164a7b57658c108d51a2455990de3257b..ee9dbd1df71641659aa22a4cd047511a0891b503 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/GridCustomFilter.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/GridCustomFilter.java
@@ -16,64 +16,17 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 
-import java.util.ArrayList;
-import java.util.List;
-
 /**
- * Stores information describing an expression with parameters (e.g. custom filter).
+ * Stores information describing a grid custom filter.
  * 
  * @author Izabela Adamczyk
  */
-public class GridCustomFilter extends AbstractExpression
+public class GridCustomFilter extends AbstractExpressionWithParameters
 {
     private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
-    private List<String> allParameters;
-
-    // need to use list here because set doesn't provide fixed order
-    private List<String> parameters;
-
     public GridCustomFilter()
     {
     }
 
-    public List<String> getParameters()
-    {
-        return parameters;
-    }
-
-    private void setParameters(List<String> parameters)
-    {
-        this.parameters = parameters;
-
-    }
-
-    public List<String> getAllParameters()
-    {
-        return allParameters;
-    }
-
-    private void setAllParameters(List<String> allParameters)
-    {
-        this.allParameters = allParameters;
-    }
-
-    public void setupParameters(List<String> allParameters)
-    {
-        setAllParameters(allParameters);
-        setParameters(createDistinctParametersList(allParameters));
-    }
-
-    private static List<String> createDistinctParametersList(List<String> allParameters)
-    {
-        List<String> result = new ArrayList<String>();
-        for (String parameter : allParameters)
-        {
-            if (result.contains(parameter) == false)
-            {
-                result.add(parameter);
-            }
-        }
-        return result;
-    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/QueryExpression.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/QueryExpression.java
new file mode 100644
index 0000000000000000000000000000000000000000..de07cd98c5bbe7c2a2560a1c5dffa4a71a877688
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/QueryExpression.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2009 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.shared.basic.dto;
+
+import java.util.List;
+
+/**
+ * Stores information describing a parametrized query.
+ * 
+ * @author Piotr Buczek
+ */
+public class QueryExpression extends AbstractExpressionWithParameters
+{
+    private static final long serialVersionUID = ServiceVersionHolder.VERSION;
+
+    private List<String> allParameters;
+
+    public QueryExpression()
+    {
+    }
+
+    public List<String> getAllParameters()
+    {
+        return allParameters;
+    }
+
+    private void setAllParameters(List<String> allParameters)
+    {
+        this.allParameters = allParameters;
+    }
+
+    @Override
+    public void setupParameters(List<String> allParameters)
+    {
+        super.setupParameters(allParameters);
+        setAllParameters(allParameters);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java
index b1f17b906f12f3a512e8ca71c5391ac90531ff82..d254f1bd1819da52873d6c5afa0541ef9307f72e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomExpressionTranslator.java
@@ -29,7 +29,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AbstractExpressionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.GridCustomColumnPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.GridCustomFilterPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.QueryPE;
 import ch.systemsx.cisd.openbis.generic.shared.util.ExpressionUtil;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
@@ -68,7 +67,7 @@ public final class GridCustomExpressionTranslator
             result.setCode(escapeHtml(original.getCode()));
             result.setName(escapeHtml(original.getLabel()));
 
-            translateGridExpression(original, result);
+            translateExpression(original, result);
             return result;
         }
     }
@@ -100,57 +99,24 @@ public final class GridCustomExpressionTranslator
             result.setName(escapeHtml(original.getName()));
             result.setupParameters(ExpressionUtil.extractParameters(original.getExpression()));
 
-            translateGridExpression(original, result);
+            translateExpression(original, result);
             return result;
         }
 
     }
 
-    /**
-     * A {@link GridCustomFilter} &lt;---&gt; {@link QueryPE} translator.
-     * 
-     * @author Izabela Adamczyk
-     */
-    public static final class QueryTranslator
-    {
-        public final static List<GridCustomFilter> translate(final List<QueryPE> queries)
-        {
-            final List<GridCustomFilter> result = new ArrayList<GridCustomFilter>();
-            for (final QueryPE query : queries)
-            {
-                result.add(QueryTranslator.translate(query));
-            }
-            return result;
-        }
-
-        public final static GridCustomFilter translate(final QueryPE original)
-        {
-            if (original == null)
-            {
-                return null;
-            }
-            final GridCustomFilter result = new GridCustomFilter();
-            result.setName(escapeHtml(original.getName()));
-            result.setupParameters(ExpressionUtil.extractParameters(original.getExpression()));
-
-            translateGridExpression(original, result);
-            return result;
-        }
-
-    }
-
-    private static void translateGridExpression(final AbstractExpressionPE<?> gridExpression,
+    public static void translateExpression(final AbstractExpressionPE<?> expression,
             final AbstractExpression result)
     {
-        result.setId(HibernateUtils.getId(gridExpression));
-        result.setModificationDate(gridExpression.getModificationDate());
-        result.setExpression(escapeHtml(gridExpression.getExpression()));
-        result.setDescription(StringEscapeUtils.escapeHtml(gridExpression.getDescription()));
-        result.setRegistrator(PersonTranslator.translate(gridExpression.getRegistrator()));
-        result.setRegistrationDate(gridExpression.getRegistrationDate());
-        result.setDatabaseInstance(DatabaseInstanceTranslator.translate(gridExpression
+        result.setId(HibernateUtils.getId(expression));
+        result.setModificationDate(expression.getModificationDate());
+        result.setExpression(escapeHtml(expression.getExpression()));
+        result.setDescription(StringEscapeUtils.escapeHtml(expression.getDescription()));
+        result.setRegistrator(PersonTranslator.translate(expression.getRegistrator()));
+        result.setRegistrationDate(expression.getRegistrationDate());
+        result.setDatabaseInstance(DatabaseInstanceTranslator.translate(expression
                 .getDatabaseInstance()));
-        result.setPublic(gridExpression.isPublic());
+        result.setPublic(expression.isPublic());
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientService.java
index 334d98055a4165967f9e049111284cdea2faa5f9..52be9b7423013fbeea8e676e2e432efd98d3f2fd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientService.java
@@ -25,9 +25,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteri
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableModelReference;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 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.IFilterOrColumnUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExpression;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryExpression;
 
 /**
  * @author Piotr Buczek
@@ -43,30 +43,30 @@ public interface IQueryClientService extends IClientService
             throws UserFailureException;
 
     /** Returns a list of all the canned custom queries created so far. */
-    public List<GridCustomFilter> listQueries() throws UserFailureException;
+    public List<QueryExpression> listQueries() throws UserFailureException;
 
     /**
      * Returns all queries for the specified configuration.
      */
-    public ResultSet<GridCustomFilter> listQueries(
-            IResultSetConfig<String, GridCustomFilter> resultSetConfig) throws UserFailureException;
+    public ResultSet<QueryExpression> listQueries(
+            IResultSetConfig<String, QueryExpression> resultSetConfig) throws UserFailureException;
 
     /**
      * Prepares export of queries.
      */
-    public String prepareExportQueries(TableExportCriteria<GridCustomFilter> criteria)
+    public String prepareExportQueries(TableExportCriteria<QueryExpression> criteria)
             throws UserFailureException;
 
     /**
      * Registers specified new query.
      */
     public void registerQuery(NewExpression query) throws UserFailureException;
-    
+
     /**
      * Deletes specified queries.
      */
     public void deleteQueries(List<TechId> filterIds) throws UserFailureException;
-    
+
     /**
      * Updates specified query.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientServiceAsync.java
index cc10d6f9790c4533100f5130f5849f4e968d565f..dd3503c807dfcd52578dece050124c308957215e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/IQueryClientServiceAsync.java
@@ -27,9 +27,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteri
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableModelReference;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 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.IFilterOrColumnUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExpression;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryExpression;
 
 /**
  * @author Piotr Buczek
@@ -45,23 +45,23 @@ public interface IQueryClientServiceAsync extends IClientServiceAsync
             AsyncCallback<TableModelReference> callback);
 
     /** @see IQueryClientService#listQueries(IResultSetConfig) */
-    public void listQueries(IResultSetConfig<String, GridCustomFilter> resultSetConfig,
-            AsyncCallback<ResultSet<GridCustomFilter>> callback);
+    public void listQueries(IResultSetConfig<String, QueryExpression> resultSetConfig,
+            AsyncCallback<ResultSet<QueryExpression>> callback);
 
     /** @see IQueryClientService#listQueries() */
-    public void listQueries(AsyncCallback<List<GridCustomFilter>> callback)
+    public void listQueries(AsyncCallback<List<QueryExpression>> callback)
             throws UserFailureException;
 
     /** @see IQueryClientService#prepareExportQueries(TableExportCriteria) */
-    public void prepareExportQueries(TableExportCriteria<GridCustomFilter> criteria,
+    public void prepareExportQueries(TableExportCriteria<QueryExpression> criteria,
             AsyncCallback<String> callback);
 
     /** @see IQueryClientService#registerQuery(NewExpression) */
     public void registerQuery(NewExpression query, AsyncCallback<Void> callback);
-    
+
     /** @see IQueryClientService#deleteQueries(List) */
     public void deleteQueries(List<TechId> filterIds, AsyncCallback<Void> callback);
-    
+
     /** @see IQueryClientService#updateQuery(IFilterOrColumnUpdates) */
     public void updateQuery(final IFilterOrColumnUpdates queryUpdate, AsyncCallback<Void> callback);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryBrowserGrid.java
index 2dc827c8ebe94169c2355a87dc00ad3adde64de9..501f8fc5cc1d86d8c908f89ca5ec1271e95e67f9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryBrowserGrid.java
@@ -38,7 +38,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteri
 import ch.systemsx.cisd.openbis.generic.shared.basic.IColumnDefinition;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.QueryExpression;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.IQueryClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Constants;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Dict;
@@ -46,17 +46,16 @@ import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Displ
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.ui.columns.QueryColDefKind;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
-public class QueryBrowserGrid extends AbstractSimpleBrowserGrid<GridCustomFilter>
+public class QueryBrowserGrid extends AbstractSimpleBrowserGrid<QueryExpression>
 {
     private static final String BROWSER_ID = Constants.QUERY_ID_PREFIX + "queries_browser";
+
     private static final String GRID_ID = BROWSER_ID + "_grid";
-    
+
     private static class DeletionConfirmationDialog extends
-            AbstractDataConfirmationDialog<List<GridCustomFilter>>
+            AbstractDataConfirmationDialog<List<QueryExpression>>
     {
         private static final int LABEL_WIDTH = 60;
 
@@ -67,7 +66,7 @@ public class QueryBrowserGrid extends AbstractSimpleBrowserGrid<GridCustomFilter
         private final AbstractAsyncCallback<Void> callback;
 
         public DeletionConfirmationDialog(IViewContext<IQueryClientServiceAsync> viewContext,
-                List<GridCustomFilter> data, AbstractAsyncCallback<Void> callback)
+                List<QueryExpression> data, AbstractAsyncCallback<Void> callback)
         {
             super(viewContext, data, viewContext.getMessage(Dict.DELETE_CONFIRMATION_TITLE));
             this.callback = callback;
@@ -85,7 +84,7 @@ public class QueryBrowserGrid extends AbstractSimpleBrowserGrid<GridCustomFilter
         protected String createMessage()
         {
             List<String> names = new ArrayList<String>();
-            for (GridCustomFilter query : data)
+            for (QueryExpression query : data)
             {
                 names.add(query.getName());
             }
@@ -106,12 +105,13 @@ public class QueryBrowserGrid extends AbstractSimpleBrowserGrid<GridCustomFilter
         QueryBrowserGrid browser = new QueryBrowserGrid(viewContext);
         return new DatabaseModificationAwareComponent(browser, browser);
     }
-    
+
     private final IViewContext<IQueryClientServiceAsync> viewContext;
-    
+
     QueryBrowserGrid(IViewContext<IQueryClientServiceAsync> viewContext)
     {
-        super(viewContext.getCommonViewContext(), BROWSER_ID, GRID_ID, DisplayTypeIDGenerator.QUERY_EDITOR);
+        super(viewContext.getCommonViewContext(), BROWSER_ID, GRID_ID,
+                DisplayTypeIDGenerator.QUERY_EDITOR);
         this.viewContext = viewContext;
         extendBottomToolbar();
     }
@@ -126,19 +126,21 @@ public class QueryBrowserGrid extends AbstractSimpleBrowserGrid<GridCustomFilter
                                 @Override
                                 public void componentSelected(ButtonEvent ce)
                                 {
-                                    new QueryEditor(viewContext, null, createRefreshGridAction()).show();
+                                    new QueryEditor(viewContext, null, createRefreshGridAction())
+                                            .show();
                                 }
 
                             });
         addButton(addButton);
         final Button editButton =
                 createSelectedItemButton(viewContext.getMessage(Dict.BUTTON_EDIT),
-                        new ISelectedEntityInvoker<BaseEntityModel<GridCustomFilter>>()
+                        new ISelectedEntityInvoker<BaseEntityModel<QueryExpression>>()
                             {
-                                public void invoke(BaseEntityModel<GridCustomFilter> selectedItem)
+                                public void invoke(BaseEntityModel<QueryExpression> selectedItem)
                                 {
-                                    GridCustomFilter query = selectedItem.getBaseObject();
-                                    new QueryEditor(viewContext, query, createRefreshGridAction()).show();
+                                    QueryExpression query = selectedItem.getBaseObject();
+                                    new QueryEditor(viewContext, query, createRefreshGridAction())
+                                            .show();
                                 }
 
                             });
@@ -148,7 +150,7 @@ public class QueryBrowserGrid extends AbstractSimpleBrowserGrid<GridCustomFilter
                         new AbstractCreateDialogListener()
                             {
                                 @Override
-                                protected Dialog createDialog(List<GridCustomFilter> selected,
+                                protected Dialog createDialog(List<QueryExpression> selected,
                                         IBrowserGridActionInvoker invoker)
                                 {
                                     return new DeletionConfirmationDialog(viewContext, selected,
@@ -161,27 +163,27 @@ public class QueryBrowserGrid extends AbstractSimpleBrowserGrid<GridCustomFilter
     }
 
     @Override
-    protected IColumnDefinitionKind<GridCustomFilter>[] getStaticColumnsDefinition()
+    protected IColumnDefinitionKind<QueryExpression>[] getStaticColumnsDefinition()
     {
         return QueryColDefKind.values();
     }
 
     @Override
-    protected List<IColumnDefinition<GridCustomFilter>> getInitialFilters()
+    protected List<IColumnDefinition<QueryExpression>> getInitialFilters()
     {
         return asColumnFilters(new QueryColDefKind[]
             { QueryColDefKind.NAME, QueryColDefKind.PUBLIC });
     }
 
     @Override
-    protected void listEntities(DefaultResultSetConfig<String, GridCustomFilter> resultSetConfig,
-            AbstractAsyncCallback<ResultSet<GridCustomFilter>> callback)
+    protected void listEntities(DefaultResultSetConfig<String, QueryExpression> resultSetConfig,
+            AbstractAsyncCallback<ResultSet<QueryExpression>> callback)
     {
         viewContext.getService().listQueries(resultSetConfig, callback);
     }
 
     @Override
-    protected void prepareExportEntities(TableExportCriteria<GridCustomFilter> exportCriteria,
+    protected void prepareExportEntities(TableExportCriteria<QueryExpression> exportCriteria,
             AbstractAsyncCallback<String> callback)
     {
         viewContext.getService().prepareExportQueries(exportCriteria, callback);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryEditor.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryEditor.java
index b927763b431e87bfea68e09b1dc0c3f1c8499084..126c3ff7abbceaa8eab8640394d142ab601c7b27 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryEditor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/module/QueryEditor.java
@@ -33,8 +33,8 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.M
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractRegistrationDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
 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.NewExpression;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryExpression;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.IQueryClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Constants;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Dict;
@@ -56,10 +56,10 @@ public class QueryEditor extends AbstractRegistrationDialog
 
     private final CheckBoxField isPublicField;
 
-    private final GridCustomFilter queryOrNull;
+    private final QueryExpression queryOrNull;
 
     public QueryEditor(IViewContext<IQueryClientServiceAsync> viewContext,
-            GridCustomFilter queryOrNull, IDelegatedAction refreshAction)
+            QueryExpression queryOrNull, IDelegatedAction refreshAction)
     {
         super(viewContext, viewContext.getMessage(queryOrNull == null ? Dict.QUERY_CREATE_TITLE
                 : Dict.QUERY_EDIT_TITLE), refreshAction);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/ui/columns/QueryColDefKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/ui/columns/QueryColDefKind.java
index fc7b4062e6177125e63c6ff561af0b349bf3fd82..6ffdf77e2600b8311b05d59a3fc4a8b761c8ca3a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/ui/columns/QueryColDefKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/client/application/ui/columns/QueryColDefKind.java
@@ -20,73 +20,73 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.AbstractColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.renderers.SimpleYesNoRenderer;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryExpression;
 
 /**
  * @author Franz-Josef Elmer
  */
-public enum QueryColDefKind implements IColumnDefinitionKind<GridCustomFilter>
+public enum QueryColDefKind implements IColumnDefinitionKind<QueryExpression>
 {
-    NAME(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.NAME)
+    NAME(new AbstractColumnDefinitionKind<QueryExpression>(Dict.NAME)
         {
             @Override
-            public String tryGetValue(GridCustomFilter entity)
+            public String tryGetValue(QueryExpression entity)
             {
                 return entity.getName();
             }
         }),
 
-    DESCRIPTION(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.DESCRIPTION)
+    DESCRIPTION(new AbstractColumnDefinitionKind<QueryExpression>(Dict.DESCRIPTION)
         {
             @Override
-            public String tryGetValue(GridCustomFilter entity)
+            public String tryGetValue(QueryExpression entity)
             {
                 return entity.getDescription();
             }
         }),
 
-    EXPRESSION(new AbstractColumnDefinitionKind<GridCustomFilter>(
+    EXPRESSION(new AbstractColumnDefinitionKind<QueryExpression>(
             ch.systemsx.cisd.openbis.plugin.query.client.web.client.application.Dict.SQL_QUERY,
             true)
         {
             @Override
-            public String tryGetValue(GridCustomFilter entity)
+            public String tryGetValue(QueryExpression entity)
             {
                 return entity.getExpression();
             }
         }),
 
-    PUBLIC(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.IS_PUBLIC, true)
+    PUBLIC(new AbstractColumnDefinitionKind<QueryExpression>(Dict.IS_PUBLIC, true)
         {
             @Override
-            public String tryGetValue(GridCustomFilter entity)
+            public String tryGetValue(QueryExpression entity)
             {
                 return SimpleYesNoRenderer.render(entity.isPublic());
             }
         }),
 
-    REGISTRATOR(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.REGISTRATOR, true)
+    REGISTRATOR(new AbstractColumnDefinitionKind<QueryExpression>(Dict.REGISTRATOR, true)
         {
             @Override
-            public String tryGetValue(GridCustomFilter entity)
+            public String tryGetValue(QueryExpression entity)
             {
                 return renderRegistrator(entity);
             }
         }),
 
-    REGISTRATION_DATE(new AbstractColumnDefinitionKind<GridCustomFilter>(Dict.REGISTRATION_DATE,
+    REGISTRATION_DATE(new AbstractColumnDefinitionKind<QueryExpression>(Dict.REGISTRATION_DATE,
             AbstractColumnDefinitionKind.DATE_COLUMN_WIDTH, true)
         {
             @Override
-            public String tryGetValue(GridCustomFilter entity)
+            public String tryGetValue(QueryExpression entity)
             {
                 return renderRegistrationDate(entity);
             }
         });
 
-    private final AbstractColumnDefinitionKind<GridCustomFilter> columnDefinitionKind;
+    private final AbstractColumnDefinitionKind<QueryExpression> columnDefinitionKind;
 
-    private QueryColDefKind(AbstractColumnDefinitionKind<GridCustomFilter> columnDefinitionKind)
+    private QueryColDefKind(AbstractColumnDefinitionKind<QueryExpression> columnDefinitionKind)
     {
         this.columnDefinitionKind = columnDefinitionKind;
     }
@@ -96,7 +96,7 @@ public enum QueryColDefKind implements IColumnDefinitionKind<GridCustomFilter>
         return name();
     }
 
-    public AbstractColumnDefinitionKind<GridCustomFilter> getDescriptor()
+    public AbstractColumnDefinitionKind<QueryExpression> getDescriptor()
     {
         return columnDefinitionKind;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java
index 518e7cd86f579ff12cf873e88c38ba8769ae9e39..4b757eefb83f8f305b39dd3c11db0b09a53136fb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/client/web/server/QueryClientService.java
@@ -34,9 +34,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDat
 import ch.systemsx.cisd.openbis.generic.client.web.server.translator.UserFailureExceptionTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 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.IFilterOrColumnUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExpression;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryExpression;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.plugin.query.client.web.client.IQueryClientService;
 import ch.systemsx.cisd.openbis.plugin.query.shared.IQueryServer;
@@ -100,7 +100,7 @@ public class QueryClientService extends AbstractClientService implements IQueryC
         }
     }
 
-    public List<GridCustomFilter> listQueries()
+    public List<QueryExpression> listQueries()
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         try
@@ -113,15 +113,15 @@ public class QueryClientService extends AbstractClientService implements IQueryC
         }
     }
 
-    public ResultSet<GridCustomFilter> listQueries(
-            final IResultSetConfig<String, GridCustomFilter> resultSetConfig)
+    public ResultSet<QueryExpression> listQueries(
+            final IResultSetConfig<String, QueryExpression> resultSetConfig)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         try
         {
-            return listEntities(resultSetConfig, new IOriginalDataProvider<GridCustomFilter>()
+            return listEntities(resultSetConfig, new IOriginalDataProvider<QueryExpression>()
                 {
-                    public List<GridCustomFilter> getOriginalData() throws UserFailureException
+                    public List<QueryExpression> getOriginalData() throws UserFailureException
                     {
                         return queryServer.listQueries(getSessionToken());
                     }
@@ -132,7 +132,7 @@ public class QueryClientService extends AbstractClientService implements IQueryC
         }
     }
 
-    public String prepareExportQueries(TableExportCriteria<GridCustomFilter> criteria)
+    public String prepareExportQueries(TableExportCriteria<QueryExpression> criteria)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         return prepareExportEntities(criteria);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java
index 1b1bfb226695433c43683913d5279e5c9220b163..0e46a090fa45792513f06dc3e8e5f4e43009ca0b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServer.java
@@ -37,15 +37,15 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IQueryDAO;
 import ch.systemsx.cisd.openbis.generic.server.plugin.IDataSetTypeSlaveServerPlugin;
 import ch.systemsx.cisd.openbis.generic.server.plugin.ISampleTypeSlaveServerPlugin;
 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.IFilterOrColumnUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExpression;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryExpression;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.QueryPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
-import ch.systemsx.cisd.openbis.generic.shared.translator.GridCustomExpressionTranslator.QueryTranslator;
 import ch.systemsx.cisd.openbis.plugin.query.shared.IQueryServer;
 import ch.systemsx.cisd.openbis.plugin.query.shared.ResourceNames;
+import ch.systemsx.cisd.openbis.plugin.query.shared.translator.QueryTranslator;
 
 /**
  * @author Franz-Josef Elmer
@@ -122,7 +122,7 @@ public class QueryServer extends AbstractServer<IQueryServer> implements IQueryS
         }
     }
 
-    public List<GridCustomFilter> listQueries(String sessionToken)
+    public List<QueryExpression> listQueries(String sessionToken)
     {
         checkSession(sessionToken);
 
@@ -176,7 +176,7 @@ public class QueryServer extends AbstractServer<IQueryServer> implements IQueryS
     public void updateQuery(String sessionToken, IFilterOrColumnUpdates updates)
     {
         checkSession(sessionToken);
-        
+
         try
         {
             IQueryDAO queryDAO = getDAOFactory().getQueryDAO();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServerLogger.java
index 2d7d19f55c91330e3363bc7ea360cd1ba3949fde..e32cf2c2e0d61262017ffb7523fb84dabe90a266 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/server/QueryServerLogger.java
@@ -21,9 +21,9 @@ import java.util.List;
 import ch.systemsx.cisd.authentication.ISessionManager;
 import ch.systemsx.cisd.openbis.generic.server.AbstractServerLogger;
 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.IFilterOrColumnUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExpression;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryExpression;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.plugin.query.shared.IQueryServer;
@@ -51,7 +51,7 @@ class QueryServerLogger extends AbstractServerLogger implements IQueryServer
         return null;
     }
 
-    public List<GridCustomFilter> listQueries(String sessionToken)
+    public List<QueryExpression> listQueries(String sessionToken)
     {
         logAccess(sessionToken, "list_queries");
         return null;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java
index 458f1e074ee1b4a749471b5c512ff52f30384ed3..6b977a5931e13df8eb667c23b5fa7868e1525451 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/IQueryServer.java
@@ -27,9 +27,9 @@ import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RoleSet;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.validator.ExpressionValidator;
 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.IFilterOrColumnUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExpression;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryExpression;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.plugin.query.shared.authorization.predicate.DeleteQueryPredicate;
 import ch.systemsx.cisd.openbis.plugin.query.shared.authorization.predicate.UpdateQueryPredicate;
@@ -51,18 +51,17 @@ public interface IQueryServer extends IServer
     @Transactional
     @RolesAllowed(RoleSet.OBSERVER)
     @ReturnValueFilter(validatorClass = ExpressionValidator.class)
-    public List<GridCustomFilter> listQueries(String sessionToken);
-    
+    public List<QueryExpression> listQueries(String sessionToken);
+
     @Transactional
     @RolesAllowed(RoleSet.POWER_USER)
     public void registerQuery(String sessionToken, NewExpression expression);
-    
+
     @Transactional
     @RolesAllowed(RoleSet.POWER_USER)
-    public void deleteQueries(
-            String sessionToken,
+    public void deleteQueries(String sessionToken,
             @AuthorizationGuard(guardClass = DeleteQueryPredicate.class) List<TechId> filterIds);
-    
+
     @Transactional
     @RolesAllowed(RoleSet.POWER_USER)
     public void updateQuery(
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/translator/QueryTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/translator/QueryTranslator.java
new file mode 100644
index 0000000000000000000000000000000000000000..b98a8db420f3635c44e9c799b557b996ccc27fec
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/query/shared/translator/QueryTranslator.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2010 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.plugin.query.shared.translator;
+
+import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.QueryExpression;
+import ch.systemsx.cisd.openbis.generic.shared.dto.QueryPE;
+import ch.systemsx.cisd.openbis.generic.shared.translator.GridCustomExpressionTranslator;
+import ch.systemsx.cisd.openbis.generic.shared.util.ExpressionUtil;
+
+/**
+ * A {@link QueryExpression} &lt;---&gt; {@link QueryPE} translator.
+ * 
+ * @author Piotr Buczek
+ */
+public final class QueryTranslator
+{
+
+    private QueryTranslator()
+    {
+        // Can not be instantiated.
+    }
+
+    public final static List<QueryExpression> translate(final List<QueryPE> queries)
+    {
+        final List<QueryExpression> result = new ArrayList<QueryExpression>();
+        for (final QueryPE query : queries)
+        {
+            result.add(QueryTranslator.translate(query));
+        }
+        return result;
+    }
+
+    public final static QueryExpression translate(final QueryPE original)
+    {
+        if (original == null)
+        {
+            return null;
+        }
+        final QueryExpression result = new QueryExpression();
+        result.setName(escapeHtml(original.getName()));
+        result.setupParameters(ExpressionUtil.extractParameters(original.getExpression()));
+
+        GridCustomExpressionTranslator.translateExpression(original, result);
+        return result;
+    }
+
+}