diff --git a/.classpath b/.classpath
index 6cffcb9..aa8e16a 100644
--- a/.classpath
+++ b/.classpath
@@ -6,9 +6,10 @@
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/test.framework"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/test.samples"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/core"/>
 	<classpathentry kind="lib" path="/local.repository/junit/jars/junit-3.8.1.jar"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/store.ldap"/>
 	<classpathentry kind="lib" path="/local.repository/javax.jdo/jars/jdo2-api-2.2.jar"/>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/core"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/enhancer"/>
+	<classpathentry kind="output" path="target/classes"/>
 </classpath>
diff --git a/.project b/.project
index f1e6c0b..b95a40e 100644
--- a/.project
+++ b/.project
@@ -1,17 +1,18 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>test.jdo.ldap</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>test.jdo.ldap</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.datanucleus.ide.eclipse.projectnature</nature>
+	</natures>
+</projectDescription>
diff --git a/src/test/org/jpox/tests/JDOQLBasicTest.java b/src/test/org/jpox/tests/JDOQLBasicTest.java
index 97c0e1d..3de8102 100644
--- a/src/test/org/jpox/tests/JDOQLBasicTest.java
+++ b/src/test/org/jpox/tests/JDOQLBasicTest.java
@@ -15,8 +15,9 @@ limitations under the License.
 
 Contributors :
  ...
-***********************************************************************/
+ ***********************************************************************/
 package org.jpox.tests;
+
 import java.util.Collection;
 import java.util.Iterator;
 
@@ -26,10 +27,10 @@ import javax.jdo.Query;
 import org.datanucleus.tests.JDOPersistenceTestCase;
 import org.jpox.samples.directory.Person;
 
-
 public class JDOQLBasicTest extends JDOPersistenceTestCase
 {
     Object[] id = new Object[3];
+
     public JDOQLBasicTest(String name)
     {
         super(name);
@@ -47,6 +48,8 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
             p.setGlobalNum("4");
             p.setFirstName("Bugs");
             p.setLastName("Bunny");
+            p.setEmailAddress("bugs.bunny@example.com");
+            p.setAge(34);
             pm.makePersistent(p);
             id[0] = pm.getObjectId(p);
             p = new Person();
@@ -54,6 +57,8 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
             p.setGlobalNum("5");
             p.setFirstName("Ana");
             p.setLastName("Hick");
+            p.setEmailAddress("ana.hick@example.com");
+            p.setAge(35);
             pm.makePersistent(p);
             id[1] = pm.getObjectId(p);
             p = new Person();
@@ -61,13 +66,15 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
             p.setGlobalNum("3");
             p.setFirstName("Lami");
             p.setLastName("Puxa");
+            p.setEmailAddress("lami.puxa@example.com");
+            p.setAge(36);
             pm.makePersistent(p);
             id[2] = pm.getObjectId(p);
             pm.currentTransaction().commit();
         }
         finally
         {
-            if( pm.currentTransaction().isActive() )
+            if (pm.currentTransaction().isActive())
             {
                 pm.currentTransaction().rollback();
             }
@@ -89,7 +96,7 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
         }
         finally
         {
-            if( pm.currentTransaction().isActive() )
+            if (pm.currentTransaction().isActive())
             {
                 pm.currentTransaction().rollback();
             }
@@ -115,18 +122,18 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
             it.next();
             assertFalse(it.hasNext());
             pm.currentTransaction().commit();
-            
+
         }
         finally
         {
-            if( pm.currentTransaction().isActive() )
+            if (pm.currentTransaction().isActive())
             {
                 pm.currentTransaction().rollback();
             }
             pm.close();
         }
     }
-    
+
     /**
      * Runs basic query
      */
@@ -139,18 +146,18 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
             Collection c = (Collection) pm.newQuery(Person.class).execute();
             assertEquals(3, c.size());
             pm.currentTransaction().commit();
-            
+
         }
         finally
         {
-            if( pm.currentTransaction().isActive() )
+            if (pm.currentTransaction().isActive())
             {
                 pm.currentTransaction().rollback();
             }
             pm.close();
         }
     }
-    
+
     /**
      * ordering
      */
@@ -165,13 +172,13 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
             Collection c = (Collection) q.execute();
             assertEquals(3, c.size());
             Iterator it = c.iterator();
-            assertEquals("Ana", ((Person)it.next()).getFirstName());
-            assertEquals("Bugs", ((Person)it.next()).getFirstName());
+            assertEquals("Ana", ((Person) it.next()).getFirstName());
+            assertEquals("Bugs", ((Person) it.next()).getFirstName());
             pm.currentTransaction().commit();
         }
         finally
         {
-            if( pm.currentTransaction().isActive() )
+            if (pm.currentTransaction().isActive())
             {
                 pm.currentTransaction().rollback();
             }
@@ -196,7 +203,7 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
         }
         finally
         {
-            if( pm.currentTransaction().isActive() )
+            if (pm.currentTransaction().isActive())
             {
                 pm.currentTransaction().rollback();
             }
@@ -205,9 +212,9 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
     }
 
     /**
-     * result test
+     * test an simple filter
      */
-    public void testFilter()
+    public void testEqualsFilter()
     {
         PersistenceManager pm = pmf.getPersistenceManager();
         try
@@ -218,12 +225,221 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
             Collection c = (Collection) q.execute();
             assertEquals(1, c.size());
             Iterator it = c.iterator();
-            assertEquals("Ana", ((Person)it.next()).getFirstName());
+            assertEquals("Ana", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+
+            pm.currentTransaction().begin();
+            q = pm.newQuery(Person.class);
+            q.setFilter("firstName == 'ana'");
+            c = (Collection) q.execute();
+            assertEquals(0, c.size());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * test and AND filter
+     */
+    public void testAndFilter()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("firstName == 'Ana' && lastName == 'Hick'");
+            Collection c = (Collection) q.execute();
+            assertEquals(1, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Ana", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+
+            pm.currentTransaction().begin();
+            Query q2 = pm.newQuery(Person.class);
+            q2.setFilter("firstName == 'Ana' && lastName == 'Hick' && age == 35");
+            Collection c2 = (Collection) q2.execute();
+            assertEquals(1, c2.size());
+            Iterator it2 = c2.iterator();
+            assertEquals("Ana", ((Person) it2.next()).getFirstName());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * test an OR filter
+     */
+    public void testOrFilter()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("firstName == 'Ana' || firstName == 'Lami'");
+            Collection c = (Collection) q.execute();
+            assertEquals(2, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Ana", ((Person) it.next()).getFirstName());
+            assertEquals("Lami", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * test an NOT filter
+     */
+    public void testNotEqualsFilter()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("firstName != 'Bugs'");
+            Collection c = (Collection) q.execute();
+            assertEquals(2, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Ana", ((Person) it.next()).getFirstName());
+            assertEquals("Lami", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * test an Less filter
+     */
+    public void testLessFilter()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("age < 35");
+            Collection c = (Collection) q.execute();
+            assertEquals(1, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Bugs", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * test an Less Or Equal filter
+     */
+    public void testLessOrEqualFilter()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("age <= 35");
+            Collection c = (Collection) q.execute();
+            assertEquals(2, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Bugs", ((Person) it.next()).getFirstName());
+            assertEquals("Ana", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * test an Greater filter
+     */
+    public void testGreaterFilter()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("age > 35");
+            Collection c = (Collection) q.execute();
+            assertEquals(1, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Lami", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * test an Lesser Or Equal filter
+     */
+    public void testGreaterOrEqualFilter()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("age >= 35");
+            Collection c = (Collection) q.execute();
+            assertEquals(2, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Ana", ((Person) it.next()).getFirstName());
+            assertEquals("Lami", ((Person) it.next()).getFirstName());
             pm.currentTransaction().commit();
         }
         finally
         {
-            if( pm.currentTransaction().isActive() )
+            if (pm.currentTransaction().isActive())
             {
                 pm.currentTransaction().rollback();
             }
@@ -232,6 +448,159 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
     }
 
     /**
+     * test an startsWith
+     */
+    public void testStartsWith()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("firstName.startsWith('B')");
+            Collection c = (Collection) q.execute();
+            assertEquals(1, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Bugs", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * test an endsWith
+     */
+    public void testEndsWith()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("firstName.endsWith('a')");
+            Collection c = (Collection) q.execute();
+            assertEquals(1, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Ana", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * Test for null values, both
+     */
+    public void testNullFilter()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            // remove email of 'Bugs Bunny'
+            pm.currentTransaction().begin();
+            Person p = (Person) pm.getObjectById(id[0]);
+            p.setEmailAddress(null);
+            pm.currentTransaction().commit();
+
+            // check not null
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("emailAddress != null");
+            Collection c = (Collection) q.execute();
+            assertEquals(2, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Ana", ((Person) it.next()).getFirstName());
+            assertEquals("Lami", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+
+            // check null
+            pm.currentTransaction().begin();
+            q = pm.newQuery(Person.class);
+            q.setFilter("emailAddress == null");
+            c = (Collection) q.execute();
+            assertEquals(1, c.size());
+            Iterator it2 = c.iterator();
+            assertEquals("Bugs", ((Person) it2.next()).getFirstName());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * Test the in-memory filter extension. LDAP filters don't support arithmetic operations so this must be evaluated
+     * in-memory.
+     */
+    public void testInMemoryFilter()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("1 + 1 == 2");
+            q.addExtension("datanucleus.query.evaluateInMemory", "true");
+            Collection c = (Collection) q.execute();
+            assertEquals(3, c.size());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+
+    /**
+     * test an OR filter
+     */
+    public void testOrInjection()
+    {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try
+        {
+            pm.currentTransaction().begin();
+            Query q = pm.newQuery(Person.class);
+            q.setFilter("firstName == 'Ana' || firstName == 'Lami)(objectClass=*'");
+            Collection c = (Collection) q.execute();
+            assertEquals(1, c.size());
+            Iterator it = c.iterator();
+            assertEquals("Ana", ((Person) it.next()).getFirstName());
+            pm.currentTransaction().commit();
+        }
+        finally
+        {
+            if (pm.currentTransaction().isActive())
+            {
+                pm.currentTransaction().rollback();
+            }
+            pm.close();
+        }
+    }
+    
+    /**
      * result grouping
      */
     public void testGrouping()
@@ -247,13 +616,13 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
             Collection c = (Collection) q.execute();
             Iterator it = c.iterator();
             Object[] obj = (Object[]) it.next();
-            assertEquals(1, ((Long)obj[0]).longValue());
+            assertEquals(1, ((Long) obj[0]).longValue());
             assertEquals("Ana", obj[1].toString());
             pm.currentTransaction().commit();
         }
         finally
         {
-            if( pm.currentTransaction().isActive() )
+            if (pm.currentTransaction().isActive())
             {
                 pm.currentTransaction().rollback();
             }
@@ -261,5 +630,4 @@ public class JDOQLBasicTest extends JDOPersistenceTestCase
         }
     }
 
-
 }

