diff --git a/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/fetchplan/FetchPlanInterface.java b/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/fetchplan/FetchPlanInterface.java
index df90465..39db057 100644
--- a/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/fetchplan/FetchPlanInterface.java
+++ b/tck20/src/java/org/apache/jdo/tck/api/persistencemanager/fetchplan/FetchPlanInterface.java
@@ -1,376 +1,377 @@
-/*
- * Copyright 2005 The Apache Software Foundation.
- * 
- * 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 org.apache.jdo.tck.api.persistencemanager.fetchplan;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.jdo.FetchPlan;
-
-import org.apache.jdo.tck.JDO_Test;
-
-import org.apache.jdo.tck.pc.mylib.PCPoint;
-import org.apache.jdo.tck.pc.mylib.PCRect;
-
-import org.apache.jdo.tck.util.BatchTestRunner;
-
-/**
- *<B>Title:</B> Test TITLE
- *<BR>
- *<B>Keywords:</B> fetch plan
- *<BR>
- *<B>Assertion IDs:</B> 12.7.1-1
- *<BR>
- *<B>Assertion Description: </B>
-public interface FetchPlan {
-String DEFAULT = "default";
-String ALL = "all";
-int FETCH_SIZE_GREEDY = -1;
-int FETCH_SIZE_OPTIMAL = 0;
-int DETACH_LOAD_FIELDS = 1;
-int DETACH_UNLOAD_FIELDS = 2;
-A12.7.1-1 [/** Add the fetchgroup to the set of active fetch groups. Duplicate names will be removed.
-FetchPlan addGroup(String fetchGroupName);
-/** Remove the fetch group from the set active fetch groups. 
-FetchPlan removeGroup(String fetchGroupName);
-/** Remove all active groups, including the default fetch group. 
-FetchPlan clearGroups();
-/** Return an immutable Set of the names of all active fetch groups. 
-Set getGroups();
-/** Set a Collection of group names to replace the current groups. Duplicate names will be removed.
-FetchPlan setGroups(Collection fetchGroupNames);
-/** Set an array of group names to replace the current groups. Duplicate names will be removed.
-FetchPlan setGroups(String[] fetchGroupNames);
-/** Set a single group to replace the current groups. 
-FetchPlan setGroup(String fetchGroupName);] 
-/** Set the roots for DetachAllOnCommit 
-FetchPlan setDetachmentRoots(Collection roots);
-/** Get the roots for DetachAllOnCommit 
-Collection getDetachmentRoots();
-/** Set the roots for DetachAllOnCommit 
-FetchPlan setDetachmentRootClasses(Class[] rootClasses);
-/** Get the roots for DetachAllOnCommit 
-Class[] getDetachmentRootClasses();
-/** Set the maximum fetch depth. 
-FetchPlan setMaxFetchDepth(int fetchDepth);
-/** Get the maximum fetch depth. 
-int getMaxFetchDepth();
-A12.7.1-2 [/** Set the fetch size for large result set support. 
-FetchPlan setFetchSize(int fetchSize);
-/** Return the fetch size; 0 if not set; -1 for greedy fetching. 
-int getFetchSize();]
-A12.7.1-3 [/** Set detachment options 
-FetchPlan setDetachmentOptions(int options);
-/** Return the detachment options 
-int getDetachmentOptions();]
- */
-
-public class FetchPlanInterface extends JDO_Test {
-
-    /** */
-    private static final String ASSERTION_FAILED = 
-        "Assertion 12.7.1-1 (FetchPlanTest) failed: ";
-    
-    /**
-     * The <code>main</code> is called when the class
-     * is directly executed from the command line.
-     * @param args The arguments passed to the program.
-     */
-    public static void main(String[] args) {
-        BatchTestRunner.run(FetchPlanInterface.class);
-    }
-
-    /**
-     * @see JDO_Test#localSetUp()
-     */
-    protected void localSetUp() {
-        addTearDownClass(PCRect.class);
-        addTearDownClass(PCPoint.class);
-    }
-
-    /** */
-    protected boolean setEquals
-            (Collection expected, Collection actual) {
-        if (expected == actual) 
-            return true;
-        if (expected == null || actual == null) 
-            return false;
-        Set expectedSet = new HashSet(expected);
-        Set actualSet = new HashSet(actual);
-        return expectedSet.equals(actualSet);
-    }
-
-    /** */
-    protected void failCompare(String message, 
-            Object expected, Object actual) {
-        appendMessage(ASSERTION_FAILED + message);
-        appendMessage("expected: " + expected);
-        appendMessage("actual: " + actual);
-    }
-
-    /** */
-    protected void failCompare(String message, 
-            int expected, int actual) {
-        appendMessage(ASSERTION_FAILED + message);
-        appendMessage("expected: " + expected);
-        appendMessage("actual: " + actual);
-    }
-
-    /** */
-    public void testGroups() {
-        checkDefaultGroups();
-        checkClearGroups();
-        checkSetGroup();
-        checkAddGroup();
-        checkRemoveGroup();
-        checkClearGroups();
-        checkSetGroupsCollection();
-        checkSetGroupsArray();
-        failOnError();
-    }
-
-    /** */
-    public void testDetachmentRoots() {
-        checkGetDetachmentRoots();
-        checkSetDetachmentRoots();
-        checkSetDetachmentRootClasses();
-        failOnError();
-    }
-
-    /** */
-    public void testDetachmentOptions() {
-        int expectedOptions = 
-                FetchPlan.DETACH_LOAD_FIELDS + 
-                FetchPlan.DETACH_UNLOAD_FIELDS;
-        FetchPlan fp = getPM().getFetchPlan();
-        int initialOptions = fp.getDetachmentOptions();
-        if (FetchPlan.DETACH_LOAD_FIELDS != initialOptions) {
-            failCompare(
-                "testDetachmentOptions(): wrong getDetachmentOptions() " + 
-                    "after getPersistenceManager().",
-                    FetchPlan.DETACH_LOAD_FIELDS, initialOptions);
-        }
-        fp.setDetachmentOptions(expectedOptions);
-        int actualOptions = fp.getDetachmentOptions();
-        if (expectedOptions != actualOptions) {
-            failCompare(
-                "testDetachmentOptions(): wrong getDetachmentOptions() " + 
-                    "after setDetachmentOptions().",
-                    expectedOptions, actualOptions);
-        }
-        cleanupPM();
-        failOnError();
-    }
-
-    /** */
-    public void testMaxFetchDepth() {
-        int expectedMaxFetchDepth = 12;
-        FetchPlan fp = getPM().getFetchPlan();
-        fp.setMaxFetchDepth(expectedMaxFetchDepth);
-        int actualMaxFetchDepth = fp.getMaxFetchDepth();
-        if (expectedMaxFetchDepth != actualMaxFetchDepth) {
-            failCompare(
-                "testMaxFetchDepth(): wrong getMaxFetchDepth() " + 
-                    "after setMaxFetchDepth().",
-                    expectedMaxFetchDepth, actualMaxFetchDepth);
-        }
-        cleanupPM();
-        failOnError();
-    }
-
-    /** */
-    public void testFetchSize() {
-        int expectedFetchSize = 12;
-        FetchPlan fp = getPM().getFetchPlan();
-        fp.setFetchSize(expectedFetchSize);
-        int actualFetchSize = fp.getFetchSize();
-        if (expectedFetchSize != actualFetchSize) {
-            failCompare(
-                "testFetchSize(): wrong getFetchSize() " + 
-                    "after setFetchSize().",
-                    expectedFetchSize, actualFetchSize);
-        }
-        cleanupPM();
-        failOnError();
-    }
-
-    /** */
-    public void checkDefaultGroups() {
-        Set expectedGroups = new HashSet();
-        expectedGroups.add("default");
-        FetchPlan fp = getPM().getFetchPlan();
-        Collection groups = fp.getGroups();
-        if (!setEquals(expectedGroups, groups)) {
-            failCompare(
-                "checkDefaultGroups(): wrong getGroups() " + 
-                    "after getPersistenceManager().",
-                    expectedGroups, groups);
-        }
-        cleanupPM();
-    }
-
-    /** */
-    public void checkClearGroups() {
-        Set expectedGroups = new HashSet();
-        FetchPlan fp = getPM().getFetchPlan();
-        fp.clearGroups();
-        Collection groups = fp.getGroups();
-        if (!setEquals(expectedGroups, groups)) {
-            failCompare(
-                "checkClearGroups(): wrong getGroups() " + 
-                    "after clearGroups.",
-                    expectedGroups, groups);
-        }
-        cleanupPM();
-    }
-
-    /** */
-    public void checkSetGroup() {
-        Set expectedGroups = new HashSet();
-        expectedGroups.add("group1");
-        FetchPlan fp = getPM().getFetchPlan();
-        fp.setGroup("group1");
-        Collection groups = fp.getGroups();
-        if (!setEquals(expectedGroups, groups)) {
-            failCompare(
-                "checkSetGroup(): wrong getGroups() " + 
-                    "after setGroup.",
-                    expectedGroups, groups);
-        }
-        cleanupPM();
-    }
-
-    /** */
-    public void checkAddGroup() {
-        Set expectedGroups = new HashSet();
-        expectedGroups.add("default");
-        expectedGroups.add("group1");
-        FetchPlan fp = getPM().getFetchPlan();
-        fp.addGroup("group1");
-        Collection groups = fp.getGroups();
-        if (!setEquals(expectedGroups, groups)) {
-            failCompare(
-                "checkAddGroup(): wrong getGroups() " + 
-                    "after addGroup.",
-                    expectedGroups, groups);
-        }
-        cleanupPM();
-    }
-
-    /** */
-    public void checkRemoveGroup() {
-        Set expectedGroups = new HashSet();
-        FetchPlan fp = getPM().getFetchPlan();
-        Collection groups = fp.getGroups();
-        fp.removeGroup("default");
-        if (!setEquals(expectedGroups, groups)) {
-            failCompare(
-                "checkRemoveGroup(): wrong getGroups() " + 
-                    "after removeGroup.",
-                    expectedGroups, groups);
-        }
-        cleanupPM();
-    }
-
-    /** */
-    public void checkSetGroupsCollection() {
-        Set expectedGroups = new HashSet();
-        expectedGroups.add("default");
-        expectedGroups.add("group1");
-        expectedGroups.add("group2");
-        FetchPlan fp = getPM().getFetchPlan();
-        fp.setGroups(expectedGroups);
-        Collection groups = fp.getGroups();
-        if (!setEquals(expectedGroups, groups)) {
-            failCompare(
-                "checkSetGroupsCollection(): wrong getGroups() " + 
-                    "after SetGroups(Collection).",
-                    expectedGroups, groups);
-        }
-        cleanupPM();
-    }
-
-    /** */
-    public void checkSetGroupsArray() {
-        Set expectedGroups = new HashSet();
-        expectedGroups.add("default");
-        expectedGroups.add("group1");
-        expectedGroups.add("group2");
-        FetchPlan fp = getPM().getFetchPlan();
-        fp.setGroups(new String[] {"default", "group1", "group2"});
-        Collection groups = fp.getGroups();
-        if (!setEquals(expectedGroups, groups)) {
-            failCompare(
-                "checkSetGroupsArray(): wrong getGroups() " + 
-                    "after setGroups(String[]).",
-                    expectedGroups, groups);
-        }
-         cleanupPM();
-    }
-
-    /** */
-    protected void checkGetDetachmentRoots() {
-        Set expectedRoots = new HashSet();
-        FetchPlan fp = getPM().getFetchPlan();
-        Collection roots = fp.getDetachmentRoots();
-        if (!setEquals(expectedRoots, roots)) {
-            failCompare(
-                "checkGetDetachmentRoots(): wrong getDetachmentRoots() " + 
-                    "after getPersistenceManager().",
-                    expectedRoots, roots);
-        }
-         cleanupPM();
-    }
-
-    /** */
-    protected void checkSetDetachmentRoots() {
-        PCPoint p = new PCPoint(10, 20);
-        Set expectedRoots = new HashSet();
-        expectedRoots.add(p);
-        FetchPlan fp = getPM().getFetchPlan();
-        fp.setDetachmentRoots(expectedRoots);
-        Collection roots = fp.getDetachmentRoots();
-        if (!setEquals(expectedRoots, roots)) {
-            failCompare(
-                "checkGetDetachmentRoots(): wrong getDetachmentRoots() " + 
-                    "after setDetachmentRoots().",
-                    expectedRoots, roots);
-        }
-         cleanupPM();
-    }
-
-    /** */
-    private void checkSetDetachmentRootClasses() {
-        Class[] expectedRootClasses = new Class[] {PCPoint.class};
-        FetchPlan fp = getPM().getFetchPlan();
-        fp.setDetachmentRootClasses(
-                expectedRootClasses);
-        Class[] rootClasses = fp.getDetachmentRootClasses();
-        if (!Arrays.equals(expectedRootClasses, rootClasses)) {
-            failCompare(
-                "checkGetDetachmentRootClasses(): " + 
-                    "wrong getDetachmentRootClasses() " + 
-                    "after setDetachmentRootClasses().",
-                    expectedRootClasses, rootClasses);
-        }
-         cleanupPM();
-    }
-
-}
\ No newline at end of file
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.jdo.tck.api.persistencemanager.fetchplan;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.jdo.FetchPlan;
+
+import org.apache.jdo.tck.JDO_Test;
+
+import org.apache.jdo.tck.pc.mylib.PCPoint;
+import org.apache.jdo.tck.pc.mylib.PCRect;
+
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+/**
+ *<B>Title:</B> Test TITLE
+ *<BR>
+ *<B>Keywords:</B> fetch plan
+ *<BR>
+ *<B>Assertion IDs:</B> 12.7.1-1
+ *<BR>
+ *<B>Assertion Description: </B>
+public interface FetchPlan {
+String DEFAULT = "default";
+String ALL = "all";
+int FETCH_SIZE_GREEDY = -1;
+int FETCH_SIZE_OPTIMAL = 0;
+int DETACH_LOAD_FIELDS = 1;
+int DETACH_UNLOAD_FIELDS = 2;
+A12.7.1-1 [/** Add the fetchgroup to the set of active fetch groups. Duplicate names will be removed.
+FetchPlan addGroup(String fetchGroupName);
+/** Remove the fetch group from the set active fetch groups. 
+FetchPlan removeGroup(String fetchGroupName);
+/** Remove all active groups, including the default fetch group. 
+FetchPlan clearGroups();
+/** Return an immutable Set of the names of all active fetch groups. 
+Set getGroups();
+/** Set a Collection of group names to replace the current groups. Duplicate names will be removed.
+FetchPlan setGroups(Collection fetchGroupNames);
+/** Set an array of group names to replace the current groups. Duplicate names will be removed.
+FetchPlan setGroups(String[] fetchGroupNames);
+/** Set a single group to replace the current groups. 
+FetchPlan setGroup(String fetchGroupName);] 
+/** Set the roots for DetachAllOnCommit 
+FetchPlan setDetachmentRoots(Collection roots);
+/** Get the roots for DetachAllOnCommit 
+Collection getDetachmentRoots();
+/** Set the roots for DetachAllOnCommit 
+FetchPlan setDetachmentRootClasses(Class[] rootClasses);
+/** Get the roots for DetachAllOnCommit 
+Class[] getDetachmentRootClasses();
+/** Set the maximum fetch depth. 
+FetchPlan setMaxFetchDepth(int fetchDepth);
+/** Get the maximum fetch depth. 
+int getMaxFetchDepth();
+A12.7.1-2 [/** Set the fetch size for large result set support. 
+FetchPlan setFetchSize(int fetchSize);
+/** Return the fetch size; 0 if not set; -1 for greedy fetching. 
+int getFetchSize();]
+A12.7.1-3 [/** Set detachment options 
+FetchPlan setDetachmentOptions(int options);
+/** Return the detachment options 
+int getDetachmentOptions();]
+ */
+
+public class FetchPlanInterface extends JDO_Test {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion 12.7.1-1 (FetchPlanTest) failed: ";
+    
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(FetchPlanInterface.class);
+    }
+
+    /**
+     * @see JDO_Test#localSetUp()
+     */
+    protected void localSetUp() {
+        addTearDownClass(PCRect.class);
+        addTearDownClass(PCPoint.class);
+    }
+
+    /** */
+    protected boolean setEquals
+            (Collection expected, Collection actual) {
+        if (expected == actual) 
+            return true;
+        if (expected == null || actual == null) 
+            return false;
+        Set expectedSet = new HashSet(expected);
+        Set actualSet = new HashSet(actual);
+        return expectedSet.equals(actualSet);
+    }
+
+    /** */
+    protected void failCompare(String message, 
+            Object expected, Object actual) {
+        appendMessage(ASSERTION_FAILED + message);
+        appendMessage("expected: " + expected);
+        appendMessage("actual: " + actual);
+    }
+
+    /** */
+    protected void failCompare(String message, 
+            int expected, int actual) {
+        appendMessage(ASSERTION_FAILED + message);
+        appendMessage("expected: " + expected);
+        appendMessage("actual: " + actual);
+    }
+
+    /** */
+    public void testGroups() {
+        checkDefaultGroups();
+        checkClearGroups();
+        checkSetGroup();
+        checkAddGroup();
+        checkRemoveGroup();
+        checkClearGroups();
+        checkSetGroupsCollection();
+        checkSetGroupsArray();
+        failOnError();
+    }
+
+    /** */
+    public void testDetachmentRoots() {
+        checkGetDetachmentRoots();
+        checkSetDetachmentRoots();
+        checkSetDetachmentRootClasses();
+        failOnError();
+    }
+
+    /** */
+    public void testDetachmentOptions() {
+        int expectedOptions = 
+                FetchPlan.DETACH_LOAD_FIELDS + 
+                FetchPlan.DETACH_UNLOAD_FIELDS;
+        FetchPlan fp = getPM().getFetchPlan();
+        int initialOptions = fp.getDetachmentOptions();
+        if (FetchPlan.DETACH_LOAD_FIELDS != initialOptions) {
+            failCompare(
+                "testDetachmentOptions(): wrong getDetachmentOptions() " + 
+                    "after getPersistenceManager().",
+                    FetchPlan.DETACH_LOAD_FIELDS, initialOptions);
+        }
+        fp.setDetachmentOptions(expectedOptions);
+        int actualOptions = fp.getDetachmentOptions();
+        if (expectedOptions != actualOptions) {
+            failCompare(
+                "testDetachmentOptions(): wrong getDetachmentOptions() " + 
+                    "after setDetachmentOptions().",
+                    expectedOptions, actualOptions);
+        }
+        cleanupPM();
+        failOnError();
+    }
+
+    /** */
+    public void testMaxFetchDepth() {
+        int expectedMaxFetchDepth = 12;
+        FetchPlan fp = getPM().getFetchPlan();
+        fp.setMaxFetchDepth(expectedMaxFetchDepth);
+        int actualMaxFetchDepth = fp.getMaxFetchDepth();
+        if (expectedMaxFetchDepth != actualMaxFetchDepth) {
+            failCompare(
+                "testMaxFetchDepth(): wrong getMaxFetchDepth() " + 
+                    "after setMaxFetchDepth().",
+                    expectedMaxFetchDepth, actualMaxFetchDepth);
+        }
+        cleanupPM();
+        failOnError();
+    }
+
+    /** */
+    public void testFetchSize() {
+        int expectedFetchSize = 12;
+        FetchPlan fp = getPM().getFetchPlan();
+        fp.setFetchSize(expectedFetchSize);
+        int actualFetchSize = fp.getFetchSize();
+        if (expectedFetchSize != actualFetchSize) {
+            failCompare(
+                "testFetchSize(): wrong getFetchSize() " + 
+                    "after setFetchSize().",
+                    expectedFetchSize, actualFetchSize);
+        }
+        cleanupPM();
+        failOnError();
+    }
+
+    /** */
+    public void checkDefaultGroups() {
+        Set expectedGroups = new HashSet();
+        expectedGroups.add("default");
+        FetchPlan fp = getPM().getFetchPlan();
+        Collection groups = fp.getGroups();
+        if (!setEquals(expectedGroups, groups)) {
+            failCompare(
+                "checkDefaultGroups(): wrong getGroups() " + 
+                    "after getPersistenceManager().",
+                    expectedGroups, groups);
+        }
+        cleanupPM();
+    }
+
+    /** */
+    public void checkClearGroups() {
+        Set expectedGroups = new HashSet();
+        FetchPlan fp = getPM().getFetchPlan();
+        fp.clearGroups();
+        Collection groups = fp.getGroups();
+        if (!setEquals(expectedGroups, groups)) {
+            failCompare(
+                "checkClearGroups(): wrong getGroups() " + 
+                    "after clearGroups.",
+                    expectedGroups, groups);
+        }
+        cleanupPM();
+    }
+
+    /** */
+    public void checkSetGroup() {
+        Set expectedGroups = new HashSet();
+        expectedGroups.add("group1");
+        FetchPlan fp = getPM().getFetchPlan();
+        fp.setGroup("group1");
+        Collection groups = fp.getGroups();
+        if (!setEquals(expectedGroups, groups)) {
+            failCompare(
+                "checkSetGroup(): wrong getGroups() " + 
+                    "after setGroup.",
+                    expectedGroups, groups);
+        }
+        cleanupPM();
+    }
+
+    /** */
+    public void checkAddGroup() {
+        Set expectedGroups = new HashSet();
+        expectedGroups.add("default");
+        expectedGroups.add("group1");
+        FetchPlan fp = getPM().getFetchPlan();
+        fp.addGroup("group1");
+        Collection groups = fp.getGroups();
+        if (!setEquals(expectedGroups, groups)) {
+            failCompare(
+                "checkAddGroup(): wrong getGroups() " + 
+                    "after addGroup.",
+                    expectedGroups, groups);
+        }
+        cleanupPM();
+    }
+
+    /** */
+    public void checkRemoveGroup() {
+        Set expectedGroups = new HashSet();
+        FetchPlan fp = getPM().getFetchPlan();
+        fp.removeGroup("default");
+        Collection groups = fp.getGroups();
+        if (!setEquals(expectedGroups, groups)) {
+            failCompare(
+                "checkRemoveGroup(): wrong getGroups() " + 
+                    "after removeGroup.",
+                    expectedGroups, groups);
+        }
+        cleanupPM();
+    }
+
+    /** */
+    public void checkSetGroupsCollection() {
+        Set expectedGroups = new HashSet();
+        expectedGroups.add("default");
+        expectedGroups.add("group1");
+        expectedGroups.add("group2");
+        FetchPlan fp = getPM().getFetchPlan();
+        fp.setGroups(expectedGroups);
+        Collection groups = fp.getGroups();
+        if (!setEquals(expectedGroups, groups)) {
+            failCompare(
+                "checkSetGroupsCollection(): wrong getGroups() " + 
+                    "after SetGroups(Collection).",
+                    expectedGroups, groups);
+        }
+        cleanupPM();
+    }
+
+    /** */
+    public void checkSetGroupsArray() {
+        Set expectedGroups = new HashSet();
+        expectedGroups.add("default");
+        expectedGroups.add("group1");
+        expectedGroups.add("group2");
+        FetchPlan fp = getPM().getFetchPlan();
+        fp.setGroups(new String[] {"default", "group1", "group2"});
+        Collection groups = fp.getGroups();
+        if (!setEquals(expectedGroups, groups)) {
+            failCompare(
+                "checkSetGroupsArray(): wrong getGroups() " + 
+                    "after setGroups(String[]).",
+                    expectedGroups, groups);
+        }
+         cleanupPM();
+    }
+
+    /** */
+    protected void checkGetDetachmentRoots() {
+        Set expectedRoots = new HashSet();
+        FetchPlan fp = getPM().getFetchPlan();
+        Collection roots = fp.getDetachmentRoots();
+        if (!setEquals(expectedRoots, roots)) {
+            failCompare(
+                "checkGetDetachmentRoots(): wrong getDetachmentRoots() " + 
+                    "after getPersistenceManager().",
+                    expectedRoots, roots);
+        }
+         cleanupPM();
+    }
+
+    /** */
+    protected void checkSetDetachmentRoots() {
+        PCPoint p = new PCPoint(10, 20);
+        Set expectedRoots = new HashSet();
+        expectedRoots.add(p);
+        FetchPlan fp = getPM().getFetchPlan();
+        fp.setDetachmentRoots(expectedRoots);
+        Collection roots = fp.getDetachmentRoots();
+        if (!setEquals(expectedRoots, roots)) {
+            failCompare(
+                "checkGetDetachmentRoots(): wrong getDetachmentRoots() " + 
+                    "after setDetachmentRoots().",
+                    expectedRoots, roots);
+        }
+         cleanupPM();
+    }
+
+    /** */
+    private void checkSetDetachmentRootClasses() {
+        Class[] expectedRootClasses = new Class[] {PCPoint.class};
+        FetchPlan fp = getPM().getFetchPlan();
+        fp.setDetachmentRootClasses(
+                expectedRootClasses);
+        Class[] rootClasses = fp.getDetachmentRootClasses();
+        if (!Arrays.equals(expectedRootClasses, rootClasses)) {
+            failCompare(
+                "checkGetDetachmentRootClasses(): " + 
+                    "wrong getDetachmentRootClasses() " + 
+                    "after setDetachmentRootClasses().",
+                    expectedRootClasses, rootClasses);
+        }
+         cleanupPM();
+    }
+
+}
diff --git a/tck20/src/java/org/apache/jdo/tck/lifecycle/StateTransitionsReturnedObjects.java b/tck20/src/java/org/apache/jdo/tck/lifecycle/StateTransitionsReturnedObjects.java
index 68ccd77..015565c 100644
--- a/tck20/src/java/org/apache/jdo/tck/lifecycle/StateTransitionsReturnedObjects.java
+++ b/tck20/src/java/org/apache/jdo/tck/lifecycle/StateTransitionsReturnedObjects.java
@@ -105,7 +105,7 @@
         {   PERSISTENT_NEW,                 UNCHANGED,                          UNCHANGED,
             UNCHANGED,                      UNCHANGED,                          PERSISTENT_NEW,
             PERSISTENT_NEW,                 UNCHANGED,                          UNCHANGED, 
-            UNCHANGED,                      UNCHANGED,                          PERSISTENT_CLEAN,     
+            UNCHANGED,                      UNCHANGED,                          UNSPECIFIED,     
             PERSISTENT_DIRTY},
 
         // detachCopy outside tx
@@ -226,7 +226,7 @@
                 transaction.setNontransactionalRead(true);
             }
             if( current_state == PERSISTENT_NONTRANSACTIONAL_DIRTY) {
-                transaction.setNontransactionalRead(true);
+                transaction.setNontransactionalWrite(true);
             }
         }
     }
diff --git a/tck20/src/java/org/apache/jdo/tck/query/api/ChangeQuery.java b/tck20/src/java/org/apache/jdo/tck/query/api/ChangeQuery.java
index 0aae29c..3fac19d 100644
--- a/tck20/src/java/org/apache/jdo/tck/query/api/ChangeQuery.java
+++ b/tck20/src/java/org/apache/jdo/tck/query/api/ChangeQuery.java
@@ -1,104 +1,106 @@
-/*
- * Copyright 2005 The Apache Software Foundation.
- * 
- * 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 org.apache.jdo.tck.query.api;
-
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.jdo.Query;
-
-import org.apache.jdo.tck.JDO_Test;
-import org.apache.jdo.tck.pc.company.CompanyModelReader;
-import org.apache.jdo.tck.pc.company.FullTimeEmployee;
-import org.apache.jdo.tck.pc.company.Person;
-import org.apache.jdo.tck.query.QueryTest;
-import org.apache.jdo.tck.query.result.classes.FullName;
-import org.apache.jdo.tck.util.BatchTestRunner;
-
-/**
- *<B>Title:</B> Change Query.
- *<BR>
- *<B>Keywords:</B> query
- *<BR>
- *<B>Assertion ID:</B> A14.5-15.
- *<BR>
- *<B>Assertion Description: </B>
- * The Query instance returned from this method can be modified 
- * by the application, just like any other Query instance.
- */
-public class ChangeQuery extends QueryTest {
-
-    /** */
-    private static final String ASSERTION_FAILED = 
-        "Assertion A14.5-15 (ChangeQuery) failed: ";
-    
-    /**
-     * The <code>main</code> is called when the class
-     * is directly executed from the command line.
-     * @param args The arguments passed to the program.
-     */
-    public static void main(String[] args) {
-        BatchTestRunner.run(ChangeQuery.class);
-    }
-    
-    /** */
-    public void testPositive() {
-        Query query = getPM().newNamedQuery(Person.class, "changeQuery");
-        
-        // change query
-        query.setResult("firstname, lastname");
-        query.setResultClass(FullName.class);
-        query.setClass(FullTimeEmployee.class);
-        String filter = "salary > 1000 & projects.contains(p) & " +
-                        "p.budget > limit";
-        query.setFilter(filter);
-        String imports = "import org.apache.jdo.tck.pc.company.Project; " +
-                         "import java.math.BigDecimal;";
-        query.declareImports(imports);
-        query.declareVariables("Project p");
-        query.declareParameters("BigDecimal limit");
-        query.setOrdering("personid ASCENDING");
-        query.setRange(0, 5);
-        String singleStringQuery = 
-            "SELECT firstname, lastname INTO FullName FROM FullTimeEmployee " +
-            "WHERE salary > 1000 & projects.contains(p) & " +
-            "p.budget > limit " +
-            "VARIABLES Project p PARAMETERS BigDecimal limit " +
-            "ORDER BY personid ASCENDING RANGE 0, 5";
-
-        // query parameters
-        Object[] parameters = {new BigDecimal("2000")};        
-        // expected result
-        List expectedResult = Arrays.asList(new Object[] {
-            new FullName("emp1First", "emp1Last"), 
-            new FullName("emp2First", "emp2Last"),
-            new FullName("emp5First", "emp5Last")});
-
-        // execute query
-        executeJDOQuery(ASSERTION_FAILED, query, singleStringQuery, true, 
-                parameters, expectedResult, true);
-    }
-
-    /**
-     * @see JDO_Test#localSetUp()
-     */
-    protected void localSetUp() {
-        addTearDownClass(CompanyModelReader.getTearDownClasses());
-        loadAndPersistCompanyModel(getPM());
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.jdo.tck.query.api;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.jdo.Query;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.pc.company.CompanyModelReader;
+import org.apache.jdo.tck.pc.company.FullTimeEmployee;
+import org.apache.jdo.tck.pc.company.Person;
+import org.apache.jdo.tck.query.QueryTest;
+import org.apache.jdo.tck.query.result.classes.FullName;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+/**
+ *<B>Title:</B> Change Query.
+ *<BR>
+ *<B>Keywords:</B> query
+ *<BR>
+ *<B>Assertion ID:</B> A14.5-15.
+ *<BR>
+ *<B>Assertion Description: </B>
+ * The Query instance returned from this method can be modified 
+ * by the application, just like any other Query instance.
+ */
+public class ChangeQuery extends QueryTest {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A14.5-15 (ChangeQuery) failed: ";
+    
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(ChangeQuery.class);
+    }
+    
+    /** */
+    public void testPositive() {
+        Query query = getPM().newNamedQuery(Person.class, "changeQuery");
+        
+        // change query
+        query.setResult("DISTINCT firstname, lastname");
+        query.setResultClass(FullName.class);
+        query.setClass(FullTimeEmployee.class);
+        String filter = "salary > 1000 & projects.contains(p) & " +
+                        "p.budget > limit";
+        query.setFilter(filter);
+        String imports = "import org.apache.jdo.tck.pc.company.Project; " +
+                         "import java.math.BigDecimal;";
+        query.declareImports(imports);
+        query.declareVariables("Project p");
+        query.declareParameters("BigDecimal limit");
+        query.setOrdering("firstname ASCENDING, lastname ASCENDING");
+        query.setRange(0, 5);
+        String singleStringQuery = 
+            "SELECT DISTINCT firstname, lastname " +
+            "INTO FullName FROM FullTimeEmployee " +
+            "WHERE salary > 1000 & projects.contains(p) & " +
+            "p.budget > limit " +
+            "VARIABLES Project p PARAMETERS BigDecimal limit " +
+            "ORDER BY firstname ASCENDING, lastname ASCENDING RANGE 0, 5";
+
+        // query parameters
+        Object[] parameters = {new BigDecimal("2000")};        
+        // expected result
+        List expectedResult = Arrays.asList(new Object[] {
+            new FullName("emp1First", "emp1Last"), 
+            new FullName("emp2First", "emp2Last"),
+            new FullName("emp5First", "emp5Last")});
+
+        // execute query
+        executeJDOQuery(ASSERTION_FAILED, query, singleStringQuery, true, 
+                parameters, expectedResult, true);
+    }
+
+    /**
+     * @see JDO_Test#localSetUp()
+     */
+    protected void localSetUp() {
+        addTearDownClass(CompanyModelReader.getTearDownClasses());
+        loadAndPersistCompanyModel(getPM());
+    }
+}
diff --git a/tck20/src/java/org/apache/jdo/tck/query/jdoql/parameters/ImplicitParameters.java b/tck20/src/java/org/apache/jdo/tck/query/jdoql/parameters/ImplicitParameters.java
index ab10934..7f0b620 100644
--- a/tck20/src/java/org/apache/jdo/tck/query/jdoql/parameters/ImplicitParameters.java
+++ b/tck20/src/java/org/apache/jdo/tck/query/jdoql/parameters/ImplicitParameters.java
@@ -1,185 +1,186 @@
-/*
- * Copyright 2005 The Apache Software Foundation.
- * 
- * 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 org.apache.jdo.tck.query.jdoql.parameters;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.jdo.tck.JDO_Test;
-import org.apache.jdo.tck.pc.company.CompanyModelReader;
-import org.apache.jdo.tck.pc.company.Employee;
-import org.apache.jdo.tck.pc.company.Person;
-import org.apache.jdo.tck.query.QueryElementHolder;
-import org.apache.jdo.tck.query.QueryTest;
-import org.apache.jdo.tck.util.BatchTestRunner;
-
-/**
- *<B>Title:</B> Implicit parameters.
- *<BR>
- *<B>Keywords:</B> query
- *<BR>
- *<B>Assertion ID:</B> A14.6.3-3.
- *<BR>
- *<B>Assertion Description: </B>
- * Parameters implicitly declared (in the result, filter, grouping, ordering, 
- * or range) are identified by prepending a ":" to the parameter 
- * everywhere it appears. All parameter types can be determined 
- * by one of the following techniques:
- */
-public class ImplicitParameters extends QueryTest {
-
-    /** */
-    private static final String ASSERTION_FAILED = 
-        "Assertion A14.6.3-3 (ImplicitParameters) failed: ";
-    
-    /** 
-     * The array of valid queries which may be executed as 
-     * single string queries and as API queries.
-     */
-    private static final QueryElementHolder[] VALID_QUERIES = {
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "this, :param", 
-        /*INTO*/        null, 
-        /*FROM*/        Person.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      null, 
-        /*INTO*/        null, 
-        /*FROM*/        Person.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       "firstname == :param",
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "department.name", 
-        /*INTO*/        null, 
-        /*FROM*/        Employee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    "department.name HAVING COUNT(this) >= :min",
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      null, 
-        /*INTO*/        null, 
-        /*FROM*/        Person.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        ":zero",
-        /*TO*/          ":five")
-    };
-    
-    private static String parameter = "parameterInResult";
-    
-    /** 
-     * The expected results of valid queries.
-     */
-    private Object[] expectedResult = {
-        getExpectedResultOfFirstQuery(
-                getTransientCompanyModelInstancesAsList(new String[] {
-                "emp1", "emp2", "emp3", "emp4", "emp5"})),
-        getTransientCompanyModelInstancesAsList(new String[]{"emp1"}),
-        /* Note: "Development" is not a bean name! */
-        Arrays.asList(new Object[]{"Development"}),
-        getTransientCompanyModelInstancesAsList(new String[] {
-                "emp1", "emp2", "emp3", "emp4", "emp5"})
-    };
-            
-    /**
-     * The <code>main</code> is called when the class
-     * is directly executed from the command line.
-     * @param args The arguments passed to the program.
-     */
-    public static void main(String[] args) {
-        BatchTestRunner.run(ImplicitParameters.class);
-    }
-    
-    /** */
-    public void testResult() {
-        int index = 0;
-        executeQuery(index, new Object[] {parameter});
-    }
-    
-    /** */
-    public void testFilter() {
-        int index = 1;
-        executeQuery(index, new Object[] {"emp1First"});
-    }
-    
-    /** */
-    public void testGrouping() {
-        int index = 2;
-        executeQuery(index, new Object[] {new Long(3)});
-    }
-    
-    /** */
-    public void testRange() {
-        int index = 3;
-        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                new Object[] {new Long(0), new Long(5)}, expectedResult[index]);
-    }
-    
-    /**
-     * @see JDO_Test#localSetUp()
-     */
-    protected void localSetUp() {
-        addTearDownClass(CompanyModelReader.getTearDownClasses());
-        loadAndPersistCompanyModel(getPM());
-    }
-
-    /** */
-    private void executeQuery(int index, Object[] parameters) {
-        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                parameters, expectedResult[index]);
-        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                parameters, expectedResult[index]);
-    }
-    
-    private List getExpectedResultOfFirstQuery(List instances) {
-        Object[] expectedResult = new Object[instances.size()];
-        for (int i = 0; i < expectedResult.length; i++) {
-            expectedResult[i] = new Object[] {instances.get(i), parameter};
-        }
-        return Arrays.asList(expectedResult);
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.jdo.tck.query.jdoql.parameters;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.pc.company.CompanyModelReader;
+import org.apache.jdo.tck.pc.company.Employee;
+import org.apache.jdo.tck.pc.company.Person;
+import org.apache.jdo.tck.query.QueryElementHolder;
+import org.apache.jdo.tck.query.QueryTest;
+import org.apache.jdo.tck.util.BatchTestRunner;
+
+/**
+ *<B>Title:</B> Implicit parameters.
+ *<BR>
+ *<B>Keywords:</B> query
+ *<BR>
+ *<B>Assertion ID:</B> A14.6.3-3.
+ *<BR>
+ *<B>Assertion Description: </B>
+ * Parameters implicitly declared (in the result, filter, grouping, ordering, 
+ * or range) are identified by prepending a ":" to the parameter 
+ * everywhere it appears. All parameter types can be determined 
+ * by one of the following techniques:
+ */
+public class ImplicitParameters extends QueryTest {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A14.6.3-3 (ImplicitParameters) failed: ";
+    
+    /** 
+     * The array of valid queries which may be executed as 
+     * single string queries and as API queries.
+     */
+    private static final QueryElementHolder[] VALID_QUERIES = {
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "this, :param", 
+        /*INTO*/        null, 
+        /*FROM*/        Person.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      null, 
+        /*INTO*/        null, 
+        /*FROM*/        Person.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       "firstname == :param",
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "department.name", 
+        /*INTO*/        null, 
+        /*FROM*/        Employee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    "department.name HAVING COUNT(this) >= :minValue",
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      null, 
+        /*INTO*/        null, 
+        /*FROM*/        Person.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        ":zero",
+        /*TO*/          ":five")
+    };
+    
+    private static String parameter = "parameterInResult";
+    
+    /** 
+     * The expected results of valid queries.
+     */
+    private Object[] expectedResult = {
+        getExpectedResultOfFirstQuery(
+                getTransientCompanyModelInstancesAsList(new String[] {
+                "emp1", "emp2", "emp3", "emp4", "emp5"})),
+        getTransientCompanyModelInstancesAsList(new String[]{"emp1"}),
+        /* Note: "Development" is not a bean name! */
+        Arrays.asList(new Object[]{"Development"}),
+        getTransientCompanyModelInstancesAsList(new String[] {
+                "emp1", "emp2", "emp3", "emp4", "emp5"})
+    };
+            
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(ImplicitParameters.class);
+    }
+    
+    /** */
+    public void testResult() {
+        int index = 0;
+        executeQuery(index, new Object[] {parameter});
+    }
+    
+    /** */
+    public void testFilter() {
+        int index = 1;
+        executeQuery(index, new Object[] {"emp1First"});
+    }
+    
+    /** */
+    public void testGrouping() {
+        int index = 2;
+        executeQuery(index, new Object[] {new Long(3)});
+    }
+    
+    /** */
+    public void testRange() {
+        int index = 3;
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                new Object[] {new Long(0), new Long(5)}, expectedResult[index]);
+    }
+    
+    /**
+     * @see JDO_Test#localSetUp()
+     */
+    protected void localSetUp() {
+        addTearDownClass(CompanyModelReader.getTearDownClasses());
+        loadAndPersistCompanyModel(getPM());
+    }
+
+    /** */
+    private void executeQuery(int index, Object[] parameters) {
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                parameters, expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                parameters, expectedResult[index]);
+    }
+    
+    private List getExpectedResultOfFirstQuery(List instances) {
+        Object[] expectedResult = new Object[instances.size()];
+        for (int i = 0; i < expectedResult.length; i++) {
+            expectedResult[i] = new Object[] {instances.get(i), parameter};
+        }
+        return Arrays.asList(expectedResult);
+    }
+}
diff --git a/tck20/src/java/org/apache/jdo/tck/query/result/ResultClassRequirements.java b/tck20/src/java/org/apache/jdo/tck/query/result/ResultClassRequirements.java
index 6c1ff78..1792980 100644
--- a/tck20/src/java/org/apache/jdo/tck/query/result/ResultClassRequirements.java
+++ b/tck20/src/java/org/apache/jdo/tck/query/result/ResultClassRequirements.java
@@ -1,477 +1,478 @@
-/*
- * Copyright 2005 The Apache Software Foundation.
- * 
- * 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 org.apache.jdo.tck.query.result;
-
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.Map;
-
-import org.apache.jdo.tck.JDO_Test;
-import org.apache.jdo.tck.pc.company.CompanyModelReader;
-import org.apache.jdo.tck.pc.company.FullTimeEmployee;
-import org.apache.jdo.tck.pc.company.Project;
-import org.apache.jdo.tck.query.QueryElementHolder;
-import org.apache.jdo.tck.query.QueryTest;
-import org.apache.jdo.tck.query.result.classes.LongString;
-import org.apache.jdo.tck.query.result.classes.MissingNoArgsConstructor;
-import org.apache.jdo.tck.query.result.classes.NoFieldsNoMethods;
-import org.apache.jdo.tck.query.result.classes.PublicLongField;
-import org.apache.jdo.tck.query.result.classes.PublicPutMethod;
-import org.apache.jdo.tck.util.BatchTestRunner;
-import org.apache.jdo.tck.util.ConversionHelper;
-
-/**
- *<B>Title:</B> Result Class Requirements.
- *<BR>
- *<B>Keywords:</B> query
- *<BR>
- *<B>Assertion ID:</B> A14.6.12-1.
- *<BR>
- *<B>Assertion Description: </B>
- * The result class may be one of the java.lang classes ...
- */
-public class ResultClassRequirements extends QueryTest {
-
-    /** */
-    private static final String ASSERTION_FAILED = 
-        "Assertion A14.6.12-1 (ResultClassRequirements) failed: ";
-    
-    /** 
-     * The array of valid queries which may be executed as 
-     * single string queries and as API queries.
-     */
-    private static final QueryElementHolder[] VALID_QUERIES = {
-        // Long
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "personid",
-        /*INTO*/        Long.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // Double
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "salary",
-        /*INTO*/        Double.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // BigDecimal
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "budget",
-        /*INTO*/        BigDecimal.class, 
-        /*FROM*/        Project.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // java.util.Date
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "hiredate",
-        /*INTO*/        java.util.Date.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // Map
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "personid AS id, lastname AS name",
-        /*INTO*/        Map.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // user defined result class
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "personid AS l, lastname AS s",
-        /*INTO*/        LongString.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // constructor
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "new LongString(personid, lastname)",
-        /*INTO*/        null, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     "import org.apache.jdo.tck.query.result.classes.LongString;",
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // constructor without constructor call
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "personid, lastname",
-        /*INTO*/        LongString.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // public fields
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "personid AS l",
-        /*INTO*/        PublicLongField.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // public put method
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "personid, lastname",
-        /*INTO*/        PublicPutMethod.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null)
-    };
-    
-    /** 
-     * The array of invalid queries which may be executed as 
-     * single string queries and as API queries.
-     */
-    private static final QueryElementHolder[] INVALID_QUERIES = {
-        // JDK class
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "personid, lastname",
-        /*INTO*/        Long.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // JDK class, non assignment compatible
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "lastname",
-        /*INTO*/        Long.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // TCK class, salary field is not assignment compatible
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "personid AS l, salary AS s",
-        /*INTO*/        LongString.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // TCK class, non existing constructor
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "new LongString(personid)",
-        /*INTO*/        null, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     "import org.apache.jdo.tck.query.result.classes.LongString;",
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // TCK class, no no-args constructor
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "personid",
-        /*INTO*/        MissingNoArgsConstructor.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-        
-        // TCK class, no no-args constructor
-        new QueryElementHolder(
-        /*UNIQUE*/      null,
-        /*RESULT*/      "personid",
-        /*INTO*/        NoFieldsNoMethods.class, 
-        /*FROM*/        FullTimeEmployee.class,
-        /*EXCLUDE*/     null,
-        /*WHERE*/       null,
-        /*VARIABLES*/   null,
-        /*PARAMETERS*/  null,
-        /*IMPORTS*/     null,
-        /*GROUP BY*/    null,
-        /*ORDER BY*/    null,
-        /*FROM*/        null,
-        /*TO*/          null),
-    };
-        
-    // Two dimensional arrays to be converted to maps 
-    // in the expected result.
-    private static Object[][] emp1Map = 
-        {{"id", new Long(1)}, 
-         {"name", "emp1Last"}};
-    private static Object[][] emp2Map = 
-        {{"id", new Long(2)}, 
-         {"name", "emp2Last"}};
-    private static Object[][] emp5Map = 
-        {{"id", new Long(5)}, 
-         {"name", "emp5Last"}};
-    private static Object[][] publicPutMethod1 =
-        {{"personid", new Long(1)}, {"lastname", "emp1Last"}};
-    private static Object[][] publicPutMethod2 =
-        {{"personid", new Long(2)}, {"lastname", "emp2Last"}};
-    private static Object[][] publicPutMethod5 =
-        {{"personid", new Long(5)}, {"lastname", "emp5Last"}};
-    
-    /** 
-     * The expected results of valid queries.
-     */
-    private Object[] expectedResult = {
-        // Long
-        Arrays.asList(new Object[]{new Long(1), new Long(2), new Long(5)}),
-        // Double
-        Arrays.asList(new Object[]{
-                new Double(20000.0), new Double(10000.0), new Double(45000.0)}),
-        // BigDecimal
-        Arrays.asList(new Object[]{new BigDecimal("2500000.99"), 
-                new BigDecimal("50000.00"), new BigDecimal("2000.99")}),
-        // java.util.Date
-        Arrays.asList(new Object[]{
-                CompanyModelReader.stringToUtilDate("1/Jan/1999"), 
-                CompanyModelReader.stringToUtilDate("1/Jul/2003"), 
-                CompanyModelReader.stringToUtilDate("15/Aug/1998")}),
-        // Map
-        Arrays.asList(new Object[]{
-                ConversionHelper.arrayToMap(emp1Map),
-                ConversionHelper.arrayToMap(emp2Map),
-                ConversionHelper.arrayToMap(emp5Map)}),
-        // user defined result class
-        Arrays.asList(new Object[]{
-                new LongString(1, "emp1Last"), 
-                new LongString(2, "emp2Last"), 
-                new LongString(5, "emp5Last")}),
-        // constructor
-        Arrays.asList(new Object[]{
-                new LongString(1, "emp1Last"), 
-                new LongString(2, "emp2Last"), 
-                new LongString(5, "emp5Last")}),
-        // constructor without constructor call
-        Arrays.asList(new Object[]{
-                new LongString(1, "emp1Last"), 
-                new LongString(2, "emp2Last"), 
-                new LongString(5, "emp5Last")}),
-        // public fields
-        Arrays.asList(new Object[]{
-                new PublicLongField(1), 
-                new PublicLongField(2), 
-                new PublicLongField(5)}),
-        // public put method
-        Arrays.asList(new Object[]{
-                new PublicPutMethod(ConversionHelper.arrayToMap(publicPutMethod1)),
-                new PublicPutMethod(ConversionHelper.arrayToMap(publicPutMethod2)),
-                new PublicPutMethod(ConversionHelper.arrayToMap(publicPutMethod5))})
-    };
-            
-    /**
-     * The <code>main</code> is called when the class
-     * is directly executed from the command line.
-     * @param args The arguments passed to the program.
-     */
-    public static void main(String[] args) {
-        BatchTestRunner.run(ResultClassRequirements.class);
-    }
-    
-    /** */
-    public void testLong() {
-        int index = 0;
-        executeQuery(index);
-    }
-
-    /** */
-    public void testDouble() {
-        int index = 1;
-        executeQuery(index);
-    }
-
-    /** */
-    public void testBigDecimal() {
-        int index = 2;
-        executeQuery(index);
-    }
-
-    /** */
-    public void testDate() {
-        int index = 3;
-        executeQuery(index);
-    }
-
-    /** */
-    public void testMap() {
-        int index = 4;
-        executeQuery(index);
-    }
-
-    /** */
-    public void testUserDefinedResultClass() {
-        int index = 5;
-        executeQuery(index);
-    }
-
-    /** */
-    public void testConstructor() {
-        int index = 6;
-        executeQuery(index);
-        index++;
-        executeQuery(index);
-    }
-
-    /** */
-    public void testFields() {
-        int index = 8;
-        executeQuery(index);
-    }
-
-    /** */
-    public void testPut() {
-        int index = 9;
-        executeQuery(index);
-    }
-
-    /** */
-    public void testNegative() {
-        for (int i = 0; i < INVALID_QUERIES.length; i++) {
-            compileAPIQuery(ASSERTION_FAILED, INVALID_QUERIES[i], false);
-            compileSingleStringQuery(ASSERTION_FAILED, INVALID_QUERIES[i], 
-                    false);
-        }
-    }
-
-    /** */
-    private void executeQuery(int index) {
-        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                expectedResult[index]);
-        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
-                expectedResult[index]);
-    }
-
-    /**
-     * @see JDO_Test#localSetUp()
-     */
-    protected void localSetUp() {
-        addTearDownClass(CompanyModelReader.getTearDownClasses());
-        loadAndPersistCompanyModel(getPM());
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.jdo.tck.query.result;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.apache.jdo.tck.JDO_Test;
+import org.apache.jdo.tck.pc.company.CompanyModelReader;
+import org.apache.jdo.tck.pc.company.FullTimeEmployee;
+import org.apache.jdo.tck.pc.company.Project;
+import org.apache.jdo.tck.query.QueryElementHolder;
+import org.apache.jdo.tck.query.QueryTest;
+import org.apache.jdo.tck.query.result.classes.LongString;
+import org.apache.jdo.tck.query.result.classes.MissingNoArgsConstructor;
+import org.apache.jdo.tck.query.result.classes.NoFieldsNoMethods;
+import org.apache.jdo.tck.query.result.classes.PublicLongField;
+import org.apache.jdo.tck.query.result.classes.PublicPutMethod;
+import org.apache.jdo.tck.util.BatchTestRunner;
+import org.apache.jdo.tck.util.ConversionHelper;
+
+/**
+ *<B>Title:</B> Result Class Requirements.
+ *<BR>
+ *<B>Keywords:</B> query
+ *<BR>
+ *<B>Assertion ID:</B> A14.6.12-1.
+ *<BR>
+ *<B>Assertion Description: </B>
+ * The result class may be one of the java.lang classes ...
+ */
+public class ResultClassRequirements extends QueryTest {
+
+    /** */
+    private static final String ASSERTION_FAILED = 
+        "Assertion A14.6.12-1 (ResultClassRequirements) failed: ";
+    
+    /** 
+     * The array of valid queries which may be executed as 
+     * single string queries and as API queries.
+     */
+    private static final QueryElementHolder[] VALID_QUERIES = {
+        // Long
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "personid",
+        /*INTO*/        Long.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // Double
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "salary",
+        /*INTO*/        Double.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // BigDecimal
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "budget",
+        /*INTO*/        BigDecimal.class, 
+        /*FROM*/        Project.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // java.util.Date
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "hiredate",
+        /*INTO*/        java.util.Date.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // Map
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "personid AS id, lastname AS name",
+        /*INTO*/        Map.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // user defined result class
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "personid AS l, lastname AS s",
+        /*INTO*/        LongString.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // constructor
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "new LongString(personid, lastname)",
+        /*INTO*/        null, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     "import org.apache.jdo.tck.query.result.classes.LongString;",
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // constructor without constructor call
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "personid, lastname",
+        /*INTO*/        LongString.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // public fields
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "personid AS l",
+        /*INTO*/        PublicLongField.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // public put method
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "personid, lastname",
+        /*INTO*/        PublicPutMethod.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null)
+    };
+    
+    /** 
+     * The array of invalid queries which may be executed as 
+     * single string queries and as API queries.
+     */
+    private static final QueryElementHolder[] INVALID_QUERIES = {
+        // JDK class
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "personid, lastname",
+        /*INTO*/        Long.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // JDK class, non assignment compatible
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "this",
+        /*INTO*/        Long.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // TCK class, salary field is not assignment compatible
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "personid AS l, salary AS s",
+        /*INTO*/        LongString.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // TCK class, non existing constructor
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "new LongString(personid)",
+        /*INTO*/        null, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     "import org.apache.jdo.tck.query.result.classes.LongString;",
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // TCK class, no no-args constructor
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "personid",
+        /*INTO*/        MissingNoArgsConstructor.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+        
+        // TCK class, no no-args constructor
+        new QueryElementHolder(
+        /*UNIQUE*/      null,
+        /*RESULT*/      "personid",
+        /*INTO*/        NoFieldsNoMethods.class, 
+        /*FROM*/        FullTimeEmployee.class,
+        /*EXCLUDE*/     null,
+        /*WHERE*/       null,
+        /*VARIABLES*/   null,
+        /*PARAMETERS*/  null,
+        /*IMPORTS*/     null,
+        /*GROUP BY*/    null,
+        /*ORDER BY*/    null,
+        /*FROM*/        null,
+        /*TO*/          null),
+    };
+        
+    // Two dimensional arrays to be converted to maps 
+    // in the expected result.
+    private static Object[][] emp1Map = 
+        {{"id", new Long(1)}, 
+         {"name", "emp1Last"}};
+    private static Object[][] emp2Map = 
+        {{"id", new Long(2)}, 
+         {"name", "emp2Last"}};
+    private static Object[][] emp5Map = 
+        {{"id", new Long(5)}, 
+         {"name", "emp5Last"}};
+    private static Object[][] publicPutMethod1 =
+        {{"personid", new Long(1)}, {"lastname", "emp1Last"}};
+    private static Object[][] publicPutMethod2 =
+        {{"personid", new Long(2)}, {"lastname", "emp2Last"}};
+    private static Object[][] publicPutMethod5 =
+        {{"personid", new Long(5)}, {"lastname", "emp5Last"}};
+    
+    /** 
+     * The expected results of valid queries.
+     */
+    private Object[] expectedResult = {
+        // Long
+        Arrays.asList(new Object[]{new Long(1), new Long(2), new Long(5)}),
+        // Double
+        Arrays.asList(new Object[]{
+                new Double(20000.0), new Double(10000.0), new Double(45000.0)}),
+        // BigDecimal
+        Arrays.asList(new Object[]{new BigDecimal("2500000.99"), 
+                new BigDecimal("50000.00"), new BigDecimal("2000.99")}),
+        // java.util.Date
+        Arrays.asList(new Object[]{
+                CompanyModelReader.stringToUtilDate("1/Jan/1999"), 
+                CompanyModelReader.stringToUtilDate("1/Jul/2003"), 
+                CompanyModelReader.stringToUtilDate("15/Aug/1998")}),
+        // Map
+        Arrays.asList(new Object[]{
+                ConversionHelper.arrayToMap(emp1Map),
+                ConversionHelper.arrayToMap(emp2Map),
+                ConversionHelper.arrayToMap(emp5Map)}),
+        // user defined result class
+        Arrays.asList(new Object[]{
+                new LongString(1, "emp1Last"), 
+                new LongString(2, "emp2Last"), 
+                new LongString(5, "emp5Last")}),
+        // constructor
+        Arrays.asList(new Object[]{
+                new LongString(1, "emp1Last"), 
+                new LongString(2, "emp2Last"), 
+                new LongString(5, "emp5Last")}),
+        // constructor without constructor call
+        Arrays.asList(new Object[]{
+                new LongString(1, "emp1Last"), 
+                new LongString(2, "emp2Last"), 
+                new LongString(5, "emp5Last")}),
+        // public fields
+        Arrays.asList(new Object[]{
+                new PublicLongField(1), 
+                new PublicLongField(2), 
+                new PublicLongField(5)}),
+        // public put method
+        Arrays.asList(new Object[]{
+                new PublicPutMethod(ConversionHelper.arrayToMap(publicPutMethod1)),
+                new PublicPutMethod(ConversionHelper.arrayToMap(publicPutMethod2)),
+                new PublicPutMethod(ConversionHelper.arrayToMap(publicPutMethod5))})
+    };
+            
+    /**
+     * The <code>main</code> is called when the class
+     * is directly executed from the command line.
+     * @param args The arguments passed to the program.
+     */
+    public static void main(String[] args) {
+        BatchTestRunner.run(ResultClassRequirements.class);
+    }
+    
+    /** */
+    public void testLong() {
+        int index = 0;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testDouble() {
+        int index = 1;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testBigDecimal() {
+        int index = 2;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testDate() {
+        int index = 3;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testMap() {
+        int index = 4;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testUserDefinedResultClass() {
+        int index = 5;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testConstructor() {
+        int index = 6;
+        executeQuery(index);
+        index++;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testFields() {
+        int index = 8;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testPut() {
+        int index = 9;
+        executeQuery(index);
+    }
+
+    /** */
+    public void testNegative() {
+        for (int i = 0; i < INVALID_QUERIES.length; i++) {
+            compileAPIQuery(ASSERTION_FAILED, INVALID_QUERIES[i], false);
+            compileSingleStringQuery(ASSERTION_FAILED, INVALID_QUERIES[i], 
+                    false);
+        }
+    }
+
+    /** */
+    private void executeQuery(int index) {
+        executeAPIQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+        executeSingleStringQuery(ASSERTION_FAILED, VALID_QUERIES[index], 
+                expectedResult[index]);
+    }
+
+    /**
+     * @see JDO_Test#localSetUp()
+     */
+    protected void localSetUp() {
+        addTearDownClass(CompanyModelReader.getTearDownClasses());
+        loadAndPersistCompanyModel(getPM());
+    }
+}
