diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java
index edf0eebd6333aaee4eb0d1cb15aeb7aa2d8b916c..66dcd02922d15fd98cbe92325625e4a7d311bc1e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/calculator/GridExpressionUtils.java
@@ -128,12 +128,8 @@ public class GridExpressionUtils
                 String columnId = customColumn.getCode();
                 RowCalculator<T> calculator = calculators.get(columnId);
                 PrimitiveValue value = evalCustomColumn(rowData, customColumn, calculator);
-                // don't modify type if it is a null string
-                if (value.toString() != null)
-                {
-                    customColumn.setDataType(DataTypeUtils.getCompatibleDataType(customColumn
-                            .getDataType(), value.getDataType()));
-                }
+                customColumn.setDataType(DataTypeUtils.getCompatibleDataType(customColumn
+                        .getDataType(), value.getDataType()));
                 customColumnValues.put(columnId, value);
             }
             result.add(new GridRowModel<T>(rowData, customColumnValues));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java
index e15abd5d91011caa92aa45a8f4d6cf5d4f3cf4dc..663edb922f7c501ff8211cf06cff552708c6a1c3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtils.java
@@ -31,17 +31,18 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell;
 
 /**
  * Utility functions around data types.
- *
+ * 
  * @author Franz-Josef Elmer
  */
 public class DataTypeUtils
 {
     private static final Map<DataTypeCode, Converter> map = new HashMap<DataTypeCode, Converter>();
-    
+
     private enum Converter implements IsSerializable
     {
-        
-        INTEGER(DataTypeCode.INTEGER){
+
+        INTEGER(DataTypeCode.INTEGER)
+        {
             @Override
             public ISerializableComparable doConvertion(String value)
             {
@@ -56,7 +57,8 @@ public class DataTypeUtils
                 return new IntegerTableCell(number);
             }
         },
-        DOUBLE(DataTypeCode.REAL){
+        DOUBLE(DataTypeCode.REAL)
+        {
             @Override
             public ISerializableComparable doConvertion(String value)
             {
@@ -71,7 +73,8 @@ public class DataTypeUtils
                 return new DoubleTableCell(number);
             }
         },
-        DATE(DataTypeCode.TIMESTAMP){
+        DATE(DataTypeCode.TIMESTAMP)
+        {
             @Override
             public ISerializableComparable doConvertion(String value)
             {
@@ -88,9 +91,9 @@ public class DataTypeUtils
             }
         },
         ;
-        
+
         private static final StringTableCell EMPTY_CELL = new StringTableCell("");
-        
+
         private Converter(DataTypeCode... codes)
         {
             for (DataTypeCode dataTypeCode : codes)
@@ -98,41 +101,46 @@ public class DataTypeUtils
                 map.put(dataTypeCode, this);
             }
         }
-        
+
         public static Converter resolve(DataTypeCode dataTypeCode)
         {
             return map.get(dataTypeCode);
         }
-        
+
         public ISerializableComparable convert(String value)
         {
             if (StringUtils.isBlank(value))
             {
-                return EMPTY_CELL ;
+                return EMPTY_CELL;
             }
             return doConvertion(value);
         }
+
         public abstract ISerializableComparable doConvertion(String value);
     }
-    
+
     /**
-     * Converts the specified string value into a data value in accordance with specified
-     * data type.
+     * Converts the specified string value into a data value in accordance with specified data type.
      */
     public static ISerializableComparable convertTo(DataTypeCode dataTypeCode, String value)
     {
         return Converter.resolve(dataTypeCode).convert(value);
     }
-    
+
     /**
      * Returns a data type which is compatible with the previous data type and the new data type.
      */
-    public static DataTypeCode getCompatibleDataType(DataTypeCode previousDataTypeOrNull, DataTypeCode dataType)
+    public static DataTypeCode getCompatibleDataType(DataTypeCode previousDataTypeOrNull,
+            DataTypeCode dataType)
     {
         if (previousDataTypeOrNull == null)
         {
             return dataType;
-        } 
+        }
+        if (dataType == null)
+        {
+            return previousDataTypeOrNull;
+        }
         if (previousDataTypeOrNull == DataTypeCode.REAL)
         {
             if (dataType == DataTypeCode.REAL || dataType == DataTypeCode.INTEGER)
@@ -152,15 +160,14 @@ public class DataTypeUtils
                 return DataTypeCode.INTEGER;
             }
             return DataTypeCode.VARCHAR;
-        } 
-        if (previousDataTypeOrNull == DataTypeCode.TIMESTAMP
-                && dataType == DataTypeCode.TIMESTAMP)
+        }
+        if (previousDataTypeOrNull == DataTypeCode.TIMESTAMP && dataType == DataTypeCode.TIMESTAMP)
         {
             return DataTypeCode.TIMESTAMP;
         }
         return DataTypeCode.VARCHAR;
     }
-    
+
     private DataTypeUtils()
     {
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtilsTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtilsTest.java
index 09dfc2ae66be22b95ef437d7d5cd36fb23c2d675..e9aba90dcd15783f43b0eef6035ca8597d7c75ba 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtilsTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/util/DataTypeUtilsTest.java
@@ -26,8 +26,6 @@ import org.testng.AssertJUnit;
 import org.testng.annotations.Test;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class DataTypeUtilsTest extends AssertJUnit
@@ -35,29 +33,35 @@ public class DataTypeUtilsTest extends AssertJUnit
     @Test
     public void testGetCompatibleDataType()
     {
+        assertEquals(null, DataTypeUtils.getCompatibleDataType(null, null));
         assertEquals(REAL, DataTypeUtils.getCompatibleDataType(null, REAL));
+        assertEquals(REAL, DataTypeUtils.getCompatibleDataType(REAL, null));
         assertEquals(REAL, DataTypeUtils.getCompatibleDataType(REAL, INTEGER));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(REAL, BOOLEAN));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(REAL, TIMESTAMP));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(REAL, VARCHAR));
         assertEquals(INTEGER, DataTypeUtils.getCompatibleDataType(null, INTEGER));
+        assertEquals(INTEGER, DataTypeUtils.getCompatibleDataType(INTEGER, null));
         assertEquals(INTEGER, DataTypeUtils.getCompatibleDataType(INTEGER, INTEGER));
         assertEquals(REAL, DataTypeUtils.getCompatibleDataType(INTEGER, REAL));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(INTEGER, BOOLEAN));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(INTEGER, TIMESTAMP));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(INTEGER, VARCHAR));
         assertEquals(BOOLEAN, DataTypeUtils.getCompatibleDataType(null, BOOLEAN));
+        assertEquals(BOOLEAN, DataTypeUtils.getCompatibleDataType(BOOLEAN, null));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(BOOLEAN, REAL));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(BOOLEAN, INTEGER));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(BOOLEAN, TIMESTAMP));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(BOOLEAN, VARCHAR));
         assertEquals(TIMESTAMP, DataTypeUtils.getCompatibleDataType(null, TIMESTAMP));
+        assertEquals(TIMESTAMP, DataTypeUtils.getCompatibleDataType(TIMESTAMP, null));
         assertEquals(TIMESTAMP, DataTypeUtils.getCompatibleDataType(TIMESTAMP, TIMESTAMP));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(TIMESTAMP, REAL));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(TIMESTAMP, INTEGER));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(TIMESTAMP, BOOLEAN));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(TIMESTAMP, VARCHAR));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(null, VARCHAR));
+        assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(VARCHAR, null));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(VARCHAR, REAL));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(VARCHAR, INTEGER));
         assertEquals(VARCHAR, DataTypeUtils.getCompatibleDataType(VARCHAR, BOOLEAN));