diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/DateFieldSearchCriterionTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/DateFieldSearchCriterionTranslator.java
index 348833d242c0d53c5694cd942b04955cf7245ff5..34cf348cecd0a004ea5d7a1295e7e7f18f5a6e8a 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/DateFieldSearchCriterionTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/search/DateFieldSearchCriterionTranslator.java
@@ -63,7 +63,7 @@ public class DateFieldSearchCriterionTranslator extends AbstractFieldSearchCrite
         DetailedSearchField detailedSearchField = getDetailedSearchField(context, dateCriterion);
         CompareType compareType = getCompareType(dateCriterion.getFieldValue());
         String value = getValue(dateCriterion.getFieldValue());
-        String timeZone = getTimeZone(dateCriterion.getTimeZone());
+        String timeZone = getTimeZone(dateCriterion.getFieldValue(), dateCriterion.getTimeZone());
 
         return new SearchCriterionTranslationResult(new DetailedSearchCriterion(detailedSearchField, compareType, value, timeZone));
     }
@@ -101,17 +101,23 @@ public class DateFieldSearchCriterionTranslator extends AbstractFieldSearchCrite
         }
     }
 
-    private String getTimeZone(ITimeZone timeZone)
+    private String getTimeZone(IDate value, ITimeZone timeZone)
     {
-        if (timeZone instanceof ServerTimeZone)
-        {
-            return DetailedSearchCriterion.SERVER_TIMEZONE;
-        } else if (timeZone instanceof TimeZone)
+        if (value instanceof AbstractDateValue)
         {
-            return String.valueOf(((TimeZone) timeZone).getHourOffset());
+            if (timeZone instanceof ServerTimeZone)
+            {
+                return DetailedSearchCriterion.SERVER_TIMEZONE;
+            } else if (timeZone instanceof TimeZone)
+            {
+                return String.valueOf(((TimeZone) timeZone).getHourOffset());
+            } else
+            {
+                throw new IllegalArgumentException("Unknown date field time zone: " + timeZone);
+            }
         } else
         {
-            throw new IllegalArgumentException("Unknown date field time zone: " + timeZone);
+            return String.valueOf(0);
         }
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculator.java
index b91ad9d53799c958637f06be6e050a8b0d74946c..664d71fcf5e6ad14eed0049cdf966002b4def4cf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculator.java
@@ -49,12 +49,12 @@ public class DateRangeCalculator
     public DateRangeCalculator(String date, String timeZone, CompareType compareType)
     {
         lower = parseDate(date);
+        makeDateGMT(lower, timeZone);
 
         if (CompareType.EQUALS.equals(compareType))
         {
             if (isDateWithTime(date))
             {
-                makeDateGMT(lower, timeZone);
                 lower = new Date(lower.getTime() - (lower.getTime() % DateUtils.MILLIS_PER_DAY));
             }
             upper = new Date(lower.getTime() + DateUtils.MILLIS_PER_DAY);
@@ -65,16 +65,11 @@ public class DateRangeCalculator
                 upper = new Date(lower.getTime() + DateUtils.MILLIS_PER_DAY);
             } else
             {
-                makeDateGMT(lower, timeZone);
                 upper = new Date(lower.getTime());
             }
             lower = new Date(0);
         } else if (CompareType.MORE_THAN_OR_EQUAL.equals(compareType))
         {
-            if (isDateWithTime(date))
-            {
-                makeDateGMT(lower, timeZone);
-            }
             upper = new Date(Long.MAX_VALUE);
         }
     }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchExperimentTest.java
index a9e7bec7a625b66243668bf7fb125dbaafe1f00d..aba068a403b5d43f2c531f2ae7110b8d2ecf17a7 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchExperimentTest.java
@@ -18,7 +18,9 @@ package ch.ethz.sis.openbis.systemtest.api.v3;
 
 import static org.testng.Assert.assertEquals;
 
+import java.text.SimpleDateFormat;
 import java.util.List;
+import java.util.TimeZone;
 
 import org.testng.annotations.Test;
 
@@ -248,7 +250,7 @@ public class SearchExperimentTest extends AbstractExperimentTest
     }
 
     @Test
-    public void testSearchWithDatePropertyThatEquals()
+    public void testSearchWithDatePropertyThatEqualsWithString()
     {
         ExperimentSearchCriterion criterion = new ExperimentSearchCriterion();
         criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatEquals("2009-02-08");
@@ -259,40 +261,109 @@ public class SearchExperimentTest extends AbstractExperimentTest
         testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2");
 
         criterion = new ExperimentSearchCriterion();
-        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatEquals("2009-02-10");
+        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(2).thatEquals("2009-02-10");
+        testSearch(TEST_USER, criterion, "/TEST-SPACE/NOE/EXP-TEST-2");
+    }
+
+    @Test
+    public void testSearchWithDatePropertyThatEqualsWithDate() throws Exception
+    {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        format.setTimeZone(TimeZone.getTimeZone("GMT"));
+
+        ExperimentSearchCriterion criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").thatEquals(format.parse("2009-02-08 23:59"));
+        testSearch(TEST_USER, criterion, 0);
+
+        criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").thatEquals(format.parse("2009-02-09 00:00"));
+        testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2");
+
+        criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").thatEquals(format.parse("2009-02-09 23:59"));
+        testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2");
+
+        criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").thatEquals(format.parse("2009-02-10 00:00"));
         testSearch(TEST_USER, criterion, 0);
     }
 
     @Test
-    public void testSearchWithDatePropertyThatIsEarlierThanOrEqualTo()
+    public void testSearchWithDatePropertyThatIsEarlierThanOrEqualToWithString()
     {
         ExperimentSearchCriterion criterion = new ExperimentSearchCriterion();
-        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-09 08:59:59");
+        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-08");
+        testSearch(TEST_USER, criterion, 0);
+
+        criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(1).thatIsEarlierThanOrEqualTo("2009-02-09 09:00");
         testSearch(TEST_USER, criterion, 0);
 
         criterion = new ExperimentSearchCriterion();
-        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-09 09:00:00");
+        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-09 09:00");
         testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2");
 
         criterion = new ExperimentSearchCriterion();
         criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsEarlierThanOrEqualTo("2009-02-09");
         testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2");
+
+        criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(2).thatIsEarlierThanOrEqualTo("2009-02-09");
+        testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2");
     }
 
     @Test
-    public void testSearchWithDatePropertyThatIsLasterThanOrEqualTo()
+    public void testSearchWithDatePropertyThatEarlierThanOrEqualToWithDate() throws Exception
     {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        format.setTimeZone(TimeZone.getTimeZone("GMT"));
+
         ExperimentSearchCriterion criterion = new ExperimentSearchCriterion();
-        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-09 23:00:01");
+        criterion.withDateProperty("PURCHASE_DATE").thatIsEarlierThanOrEqualTo(format.parse("2009-02-09 08:59"));
         testSearch(TEST_USER, criterion, 0);
 
         criterion = new ExperimentSearchCriterion();
-        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-09 23:00:00");
-        testSearch(TEST_USER, criterion, "/TEST-SPACE/NOE/EXP-TEST-2");
+        criterion.withDateProperty("PURCHASE_DATE").thatIsEarlierThanOrEqualTo(format.parse("2009-02-09 09:00"));
+        testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2");
+
+        criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").thatIsEarlierThanOrEqualTo(format.parse("2009-02-09 23:00"));
+        testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2");
+    }
+
+    @Test
+    public void testSearchWithDatePropertyThatIsLaterThanOrEqualToWithString()
+    {
+        ExperimentSearchCriterion criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-10");
+        testSearch(TEST_USER, criterion, 0);
 
         criterion = new ExperimentSearchCriterion();
         criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-09");
         testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2");
+
+        criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").withTimeZone(0).thatIsLaterThanOrEqualTo("2009-02-08");
+        testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2");
+    }
+
+    @Test
+    public void testSearchWithDatePropertyThatIsLaterThanOrEqualToWithDate() throws Exception
+    {
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        format.setTimeZone(TimeZone.getTimeZone("GMT+1:00"));
+
+        ExperimentSearchCriterion criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").thatIsLaterThanOrEqualTo(format.parse("2009-02-10 00:01"));
+        testSearch(TEST_USER, criterion, 0);
+
+        criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").thatIsLaterThanOrEqualTo(format.parse("2009-02-10 00:00"));
+        testSearch(TEST_USER, criterion, "/TEST-SPACE/NOE/EXP-TEST-2");
+
+        criterion = new ExperimentSearchCriterion();
+        criterion.withDateProperty("PURCHASE_DATE").thatIsLaterThanOrEqualTo(format.parse("2009-02-09 10:00"));
+        testSearch(TEST_USER, criterion, "/CISD/NEMO/EXP-TEST-2", "/TEST-SPACE/NOE/EXP-TEST-2");
     }
 
     @Test
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculatorTest.java
index d6507050595a67f5939dcc09c1036d1dd78e2ff6..962ef36b400ec5824ac8289b37b691cb21731091 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/detailed/DateRangeCalculatorTest.java
@@ -54,21 +54,21 @@ public class DateRangeCalculatorTest
     public void testEqualToDateWithoutTimeWithPositiveTimeZoneOffset()
     {
         DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "+1", CompareType.EQUALS);
-        assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000");
+        assertDates(calculator, "2014-11-13 23:00:00.000", "2014-11-14 23:00:00.000");
     }
 
     @Test
     public void testEqualToDateWithoutTimeWithNegativeTimeZoneOffset()
     {
         DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "-1", CompareType.EQUALS);
-        assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000");
+        assertDates(calculator, "2014-11-14 01:00:00.000", "2014-11-15 01:00:00.000");
     }
 
     @Test
     public void testEqualToDateWithoutTimeWithServerTimeZoneOffset()
     {
         DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "server", CompareType.EQUALS);
-        assertDates(calculator, "2014-11-14 00:00:00.000", "2014-11-15 00:00:00.000");
+        assertDates(calculator, "2014-11-13 23:00:00.000", "2014-11-14 23:00:00.000");
     }
 
     @Test
@@ -122,21 +122,21 @@ public class DateRangeCalculatorTest
     public void testLessThanOrEqualToDateWithoutTimeWithPositiveTimeZoneOffset()
     {
         DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "1", CompareType.LESS_THAN_OR_EQUAL);
-        assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-15 00:00:00.000");
+        assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-14 23:00:00.000");
     }
 
     @Test
     public void testLessThanOrEqualToDateWithoutTimeWithNegativeTimeZoneOffset()
     {
         DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "-1", CompareType.LESS_THAN_OR_EQUAL);
-        assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-15 00:00:00.000");
+        assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-15 01:00:00.000");
     }
 
     @Test
     public void testLessThanOrEqualToDateWithoutTimeWithServerTimeZoneOffset()
     {
         DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "server", CompareType.LESS_THAN_OR_EQUAL);
-        assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-15 00:00:00.000");
+        assertDates(calculator, "1970-01-01 00:00:00.000", "2014-11-14 23:00:00.000");
     }
 
     @Test
@@ -184,21 +184,21 @@ public class DateRangeCalculatorTest
     public void testMoreThanOrEqualToDateWithoutTimeWithPositiveTimeZoneOffset()
     {
         DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "1", CompareType.MORE_THAN_OR_EQUAL);
-        assertDates(calculator, "2014-11-14 00:00:00.000", "292278994-08-17 07:12:55.807");
+        assertDates(calculator, "2014-11-13 23:00:00.000", "292278994-08-17 07:12:55.807");
     }
 
     @Test
     public void testMoreThanOrEqualToDateWithoutTimeWithNegativeTimeZoneOffset()
     {
         DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "-1", CompareType.MORE_THAN_OR_EQUAL);
-        assertDates(calculator, "2014-11-14 00:00:00.000", "292278994-08-17 07:12:55.807");
+        assertDates(calculator, "2014-11-14 01:00:00.000", "292278994-08-17 07:12:55.807");
     }
 
     @Test
     public void testMoreThanOrEqualToDateWithoutTimeWithServerTimeZoneOffset()
     {
         DateRangeCalculator calculator = new DateRangeCalculator("2014-11-14", "server", CompareType.MORE_THAN_OR_EQUAL);
-        assertDates(calculator, "2014-11-14 00:00:00.000", "292278994-08-17 07:12:55.807");
+        assertDates(calculator, "2014-11-13 23:00:00.000", "292278994-08-17 07:12:55.807");
     }
 
     @Test