diff --git a/common/source/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilter.java b/common/source/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilter.java
index 9969f7980c8cf7b11f6d8599fe13d499dd3fd83b..d091648ae610ccda9cb5ed9b11b0afeb9807cd6b 100644
--- a/common/source/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilter.java
+++ b/common/source/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilter.java
@@ -242,11 +242,11 @@ public class AlternativesStringFilter
                     case LT:
                         return value.compareTo(this.filter) < 0;
                     case LE:
-                        return value.compareTo(this.filter) <= 0;
+                        return value.compareTo(this.filter) < 0 || value.startsWith(filter);
                     case GT:
                         return value.compareTo(this.filter) > 0;
                     case GE:
-                        return value.compareTo(this.filter) >= 0;
+                        return value.compareTo(this.filter) > 0 || value.startsWith(filter);
                     default:
                         return false;
                 }
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilterTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilterTest.java
index 9867a82c3c9ce08b60ac1770d91205f3780d8ebc..db421e361dd01ad88d2c38e7d962716448acfefa 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilterTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/shared/basic/AlternativesStringFilterTest.java
@@ -36,6 +36,96 @@ public class AlternativesStringFilterTest
         return filter;
     }
 
+    private static final AlternativesStringFilter prepareDateFilter(String value)
+    {
+        final AlternativesStringFilter filter = new AlternativesStringFilter();
+        filter.setDateFilterValue(value);
+        return filter;
+    }
+    
+    @Test
+    public void testDateMatching()
+    {
+        AlternativesStringFilter filter = prepareDateFilter("=2011-07-21");
+        assertTrue(filter.passes("2011-07-21 10:22:33"));
+        assertTrue(filter.passes("2011-07-21"));
+        assertFalse(filter.passes("2011-07-20"));
+        assertFalse(filter.passes("2010-07-21"));
+    }
+    
+    @Test
+    public void testDateMatchingBefore()
+    {
+        AlternativesStringFilter filter = prepareDateFilter("<2011-07-21");
+        assertTrue(filter.passes("2011-07-20 10:22:33"));
+        assertTrue(filter.passes("2011-07"));
+        assertFalse(filter.passes("2011-07-21"));
+        assertFalse(filter.passes("2011-07-22"));
+    }
+    
+    @Test
+    public void testDateMatchingBeforeAndEqual()
+    {
+        AlternativesStringFilter filter = prepareDateFilter("<=2011-07-21");
+        assertTrue(filter.passes("2011-07-20"));
+        assertTrue(filter.passes("2011-07-21 10:22:33"));
+        assertTrue(filter.passes("2011-07-21"));
+        assertFalse(filter.passes("2011-07-22"));
+        assertFalse(filter.passes("2011-07-23"));
+    }
+    
+    @Test
+    public void testDateMatchingAfter()
+    {
+        AlternativesStringFilter filter = prepareDateFilter(">2011-07-21");
+        assertTrue(filter.passes("2011-07-22 10:22:33"));
+        assertTrue(filter.passes("2011-07-22"));
+        assertFalse(filter.passes("2011-07-21"));
+        assertFalse(filter.passes("2011-07-20"));
+    }
+    
+    @Test
+    public void testDateMatchingAfterAndEqual()
+    {
+        AlternativesStringFilter filter = prepareDateFilter(">=2011-07-21");
+        assertTrue(filter.passes("2011-07-22"));
+        assertTrue(filter.passes("2011-07-21 10:22:33"));
+        assertTrue(filter.passes("2011-07-21"));
+        assertFalse(filter.passes("2011-07-20"));
+        assertFalse(filter.passes("2011-07-19"));
+    }
+    
+    @Test
+    public void testDateMatchingRange()
+    {
+        AlternativesStringFilter filter = prepareDateFilter(">2011 & <2011-07");
+        assertTrue(filter.passes("2011-06-03 10:22:33"));
+        assertTrue(filter.passes("2011-06-03"));
+        assertFalse(filter.passes("2011-07-01"));
+        assertFalse(filter.passes("2011-07-01 00:00:01"));
+        assertFalse(filter.passes("2010-12-31"));
+        assertFalse(filter.passes("2010-12-31 23:59:59"));
+    }
+    
+    @Test
+    public void testEmptyDateMatch()
+    {
+        AlternativesStringFilter filter = prepareDateFilter("");
+        assertTrue(filter.passes("2011-06-03 10:22:33"));
+        assertTrue(filter.passes("2011-06-03"));
+        assertTrue(filter.passes("2011-07-01 12:13:14"));
+    }
+    
+    @Test
+    public void testSimpleDateMatch()
+    {
+        AlternativesStringFilter filter = prepareDateFilter("2011");
+        assertTrue(filter.passes("2011-06-03 10:22:33"));
+        assertTrue(filter.passes("2011-06-03"));
+        assertFalse(filter.passes("2010-12-31 23:59:59"));
+        assertFalse(filter.passes("2012-11-06 13:14:15"));
+    }
+    
     @Test
     public void testEmptyMatch()
     {