diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java
index 7094a2b86df5136a5cea6ce3757802e19e7da231..69642835d4e73aaee3674c6612b623c8542329b0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GridCustomColumnBO.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
+import java.util.Set;
+
 import org.springframework.dao.DataAccessException;
 import org.springframework.dao.DataRetrievalFailureException;
 
@@ -26,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IFilterOrColumnUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewColumnOrFilter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.GridCustomColumnPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
+import ch.systemsx.cisd.openbis.generic.shared.util.ExpressionUtil;
 
 /**
  * Operations on grid custom columns.
@@ -51,7 +54,7 @@ public class GridCustomColumnBO extends AbstractBusinessObject implements
         column.setLabel(newColumn.getName());
 
         column.setDescription(newColumn.getDescription());
-        column.setExpression(newColumn.getExpression());
+        column.setExpression(checkExpressionFreeOfParameters(newColumn.getExpression()));
         column.setGridId(newColumn.getGridId());
         column.setPublic(newColumn.isPublic());
         column.setRegistrator(findRegistrator());
@@ -107,11 +110,22 @@ public class GridCustomColumnBO extends AbstractBusinessObject implements
 
         column.setLabel(updates.getName());
         column.setDescription(updates.getDescription());
-        column.setExpression(updates.getExpression());
+        column.setExpression(checkExpressionFreeOfParameters(updates.getExpression()));
         column.setPublic(updates.isPublic());
 
         validateAndSave();
     }
+    
+    private String checkExpressionFreeOfParameters(String expression)
+    {
+        Set<String> parameters = ExpressionUtil.extractParameters(expression);
+        if (parameters.isEmpty())
+        {
+            return expression;
+        }
+        throw new UserFailureException("Unexpected parameters '" + parameters + "' in expression: "
+                + expression);
+    }
 
     private void validateAndSave()
     {
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 0e53eb605dfc51094d72b58dcc11fe36f06358b4..edd61653be9c8ee62d500c1f6e39e833bc807317 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
@@ -19,11 +19,7 @@ package ch.systemsx.cisd.openbis.generic.shared.translator;
 import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
 
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.apache.commons.lang.StringEscapeUtils;
 
@@ -33,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AbstractGridExpressionPE;
 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.util.ExpressionUtil;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
@@ -82,8 +79,6 @@ public final class GridCustomExpressionTranslator
      */
     public static final class GridCustomFilterTranslator
     {
-        private static final String PARAMETER_PATTERN = "\\$\\{.*?\\}";
-
         public final static List<GridCustomFilter> translate(final List<GridCustomFilterPE> filters)
         {
             final List<GridCustomFilter> result = new ArrayList<GridCustomFilter>();
@@ -102,25 +97,12 @@ public final class GridCustomExpressionTranslator
             }
             final GridCustomFilter result = new GridCustomFilter();
             result.setName(escapeHtml(original.getName()));
-            result.setParameters(extractParameters(original.getExpression()));
+            result.setParameters(ExpressionUtil.extractParameters(original.getExpression()));
 
             translateGridExpression(original, result);
             return result;
         }
 
-        static Set<String> extractParameters(String expression)
-        {
-            Pattern parameterPattern = Pattern.compile(PARAMETER_PATTERN);
-            Set<String> list = new HashSet<String>();
-            Matcher matcher = parameterPattern.matcher(expression);
-            while (matcher.find())
-            {
-                String group = matcher.group();
-                list.add(group.substring(2, group.length() - 1));
-            }
-            return list;
-        }
-
     }
 
     private static void translateGridExpression(final AbstractGridExpressionPE<?> gridExpression,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtil.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..1e80b7b70c5b2b6e49dce996284a8971587032b4
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtil.java
@@ -0,0 +1,54 @@
+/*
+ * 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.util;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * Useful static methods for expressions.
+ *
+ * @author Franz-Josef Elmer
+ */
+public class ExpressionUtil
+{
+    public static final String PARAMETER_PATTERN = "\\$\\{.*?\\}";
+    private static final Pattern PATTERN = Pattern.compile(ExpressionUtil.PARAMETER_PATTERN);
+
+    /**
+     * Extracts all parameters in the specified expression
+     */
+    public static Set<String> extractParameters(String expression)
+    {
+        Set<String> list = new LinkedHashSet<String>();
+        Matcher matcher = PATTERN.matcher(expression);
+        while (matcher.find())
+        {
+            String group = matcher.group();
+            list.add(group.substring(2, group.length() - 1));
+        }
+        return list;
+    }
+    
+    private ExpressionUtil()
+    {
+    }
+
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomFilterTranslatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtilTest.java
similarity index 74%
rename from openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomFilterTranslatorTest.java
rename to openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtilTest.java
index fd2af6e8605763e023d95da2f4e9f22cd4ae8eea..d5d0868931def8529a049a9ad337c31869bf09be 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/GridCustomFilterTranslatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/ExpressionUtilTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.shared.translator;
+package ch.systemsx.cisd.openbis.generic.shared.util;
 
 import org.testng.AssertJUnit;
 import org.testng.annotations.Test;
@@ -26,34 +26,34 @@ import ch.systemsx.cisd.openbis.generic.shared.translator.GridCustomExpressionTr
  * 
  * @author Izabela Adamczyk
  */
-public class GridCustomFilterTranslatorTest extends AssertJUnit
+public class ExpressionUtilTest extends AssertJUnit
 {
     @Test
     public void testExtractNoParameters() throws Exception
     {
         String expression = "";
-        assertEquals(0, GridCustomFilterTranslator.extractParameters(expression).size());
+        assertEquals("[]", ExpressionUtil.extractParameters(expression).toString());
     }
 
     @Test
     public void testExtractOneParameter() throws Exception
     {
         String expression = "${abc}";
-        assertEquals(1, GridCustomFilterTranslator.extractParameters(expression).size());
+        assertEquals("[abc]", ExpressionUtil.extractParameters(expression).toString());
     }
 
     @Test
     public void testExtractOneDuplicatedParameter() throws Exception
     {
         String expression = "${abc} ${abc}";
-        assertEquals(1, GridCustomFilterTranslator.extractParameters(expression).size());
+        assertEquals("[abc]", ExpressionUtil.extractParameters(expression).toString());
     }
 
     @Test
     public void testExtractManyParameters() throws Exception
     {
         String expression = "${abc} ${abc} ${def} ${ghi}";
-        assertEquals(3, GridCustomFilterTranslator.extractParameters(expression).size());
+        assertEquals("[abc, def, ghi]", ExpressionUtil.extractParameters(expression).toString());
     }
 
 }