http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceTest.java
deleted file mode 100644
index edf788f..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*****************************************************************
- *   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.cayenne;
-
-import java.sql.Types;
-import java.util.List;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.ClientMtTable1Subclass1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextInheritanceTest extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    private TableHelper tMtTable1;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-
-        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
-        tMtTable1.setColumns(
-                "TABLE1_ID",
-                "GLOBAL_ATTRIBUTE1",
-                "SERVER_ATTRIBUTE1",
-                "SUBCLASS_ATTRIBUTE1").setColumnTypes(
-                Types.INTEGER,
-                Types.VARCHAR,
-                Types.VARCHAR,
-                Types.VARCHAR);
-    }
-
-    public void testInsertSubclass() throws Exception {
-
-        ClientMtTable1Subclass1 object = 
context.newObject(ClientMtTable1Subclass1.class);
-        object.setGlobalAttribute1("sub1");
-        object.setServerAttribute1("sa1");
-        object.setSubclass1Attribute1("suba1");
-
-        context.commitChanges();
-
-        assertEquals(1, tMtTable1.getRowCount());
-        assertEquals("sub1", tMtTable1.getString("GLOBAL_ATTRIBUTE1"));
-        assertEquals("sa1", tMtTable1.getString("SERVER_ATTRIBUTE1"));
-        assertEquals("suba1", tMtTable1.getString("SUBCLASS_ATTRIBUTE1"));
-    }
-
-    public void testPerformQueryInheritanceLeaf() throws Exception {
-
-        tMtTable1.insert(1, "xxx", "yyy", null);
-        tMtTable1.insert(2, "sub1", "zzz", "sa1");
-        tMtTable1.insert(3, "1111", "aaa", null);
-
-        SelectQuery query = new SelectQuery(ClientMtTable1Subclass1.class);
-        List<ClientMtTable1Subclass1> objects = context.performQuery(query);
-
-        assertEquals(1, objects.size());
-        assertEquals("sa1", objects.get(0).getSubclass1Attribute1());
-    }
-
-    public void testPerformQueryInheritanceSuper() throws Exception {
-
-        tMtTable1.insert(1, "a", "yyy", null);
-        tMtTable1.insert(2, "sub1", "zzz", "sa1");
-        tMtTable1.insert(3, "z", "aaa", null);
-
-        SelectQuery query = new SelectQuery(ClientMtTable1.class);
-        List<ClientMtTable1> objects = context.performQuery(query);
-
-        assertEquals(3, objects.size());
-
-        int checkedFields = 0;
-        for (int i = 0; i < objects.size(); i++) {
-            Integer id = (Integer) 
objects.get(i).getObjectId().getIdSnapshot().get(
-                    "TABLE1_ID");
-            if (id == 1) {
-                assertEquals("a", objects.get(i).getGlobalAttribute1());
-                checkedFields++;
-            }
-            else if (id == 2) {
-                assertEquals("sa1", ((ClientMtTable1Subclass1) objects.get(i))
-                        .getSubclass1Attribute1());
-                checkedFields++;
-            }
-
-        }
-        assertEquals(2, checkedFields);
-    }
-
-    public void testPerformQueryWithQualifierInheritanceSuper() throws 
Exception {
-
-        tMtTable1.insert(1, "a", "XX", null);
-        tMtTable1.insert(2, "sub1", "XXA", "sa1");
-        tMtTable1.insert(3, "z", "MM", null);
-
-        SelectQuery query = new SelectQuery(ClientMtTable1.class);
-        query.andQualifier(ExpressionFactory.likeExp(
-                ClientMtTable1.SERVER_ATTRIBUTE1_PROPERTY,
-                "X%"));
-        List<ClientMtTable1> objects = context.performQuery(query);
-
-        assertEquals(2, objects.size());
-
-        int checkedFields = 0;
-        for (int i = 0; i < objects.size(); i++) {
-            Integer id = (Integer) 
objects.get(i).getObjectId().getIdSnapshot().get(
-                    "TABLE1_ID");
-            if (id == 1) {
-                assertEquals("a", objects.get(i).getGlobalAttribute1());
-                checkedFields++;
-            }
-            else if (id == 2) {
-                assertEquals("sa1", ((ClientMtTable1Subclass1) objects.get(i))
-                        .getSubclass1Attribute1());
-                checkedFields++;
-            }
-
-        }
-        assertEquals(2, checkedFields);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipIT.java
new file mode 100644
index 0000000..0ff92b1
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipIT.java
@@ -0,0 +1,112 @@
+/*****************************************************************
+ *   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.cayenne;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.ObjectIdQuery;
+import org.apache.cayenne.query.RefreshQuery;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.mt.ClientMtMapToMany;
+import org.apache.cayenne.testdo.mt.ClientMtMapToManyTarget;
+import org.apache.cayenne.testdo.mt.MtMapToMany;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.Map;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextMapRelationshipIT extends ClientCase {
+
+    @Inject
+    private CayenneContext context;
+
+    @Inject
+    private DBHelper dbHelper;
+
+    private TableHelper tMtMapToMany;
+    private TableHelper tMtMapToManyTarget;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_MAP_TO_MANY_TARGET");
+        dbHelper.deleteAll("MT_MAP_TO_MANY");
+
+        tMtMapToMany = new TableHelper(dbHelper, "MT_MAP_TO_MANY");
+        tMtMapToMany.setColumns("ID");
+
+        tMtMapToManyTarget = new TableHelper(dbHelper, 
"MT_MAP_TO_MANY_TARGET");
+        tMtMapToManyTarget.setColumns("ID", "MAP_TO_MANY_ID");
+    }
+
+    private void createTwoMapToManysWithTargetsDataSet() throws Exception {
+        tMtMapToMany.insert(1).insert(2);
+        tMtMapToManyTarget.insert(1, 1).insert(2, 1).insert(3, 1).insert(4, 2);
+    }
+
+    public void testReadToMany() throws Exception {
+        createTwoMapToManysWithTargetsDataSet();
+
+        ObjectId id = new ObjectId("MtMapToMany", MtMapToMany.ID_PK_COLUMN, 1);
+        ClientMtMapToMany o1 = (ClientMtMapToMany) Cayenne.objectForQuery(
+                context,
+                new ObjectIdQuery(id));
+
+        Map<Object, ClientMtMapToManyTarget> targets = o1.getTargets();
+
+        assertTrue(((ValueHolder) targets).isFault());
+
+        assertNotNull(targets);
+        assertEquals(3, targets.size());
+        assertNotNull(targets.get(new Integer(1)));
+        assertNotNull(targets.get(new Integer(2)));
+        assertNotNull(targets.get(new Integer(3)));
+    }
+
+    public void testAddToMany() throws Exception {
+        createTwoMapToManysWithTargetsDataSet();
+
+        ObjectId id = new ObjectId("MtMapToMany", MtMapToMany.ID_PK_COLUMN, 1);
+        ClientMtMapToMany o1 = (ClientMtMapToMany) Cayenne.objectForQuery(
+                context,
+                new ObjectIdQuery(id));
+
+        Map<Object, ClientMtMapToManyTarget> targets = o1.getTargets();
+        assertNotNull(targets);
+        assertEquals(3, targets.size());
+
+        ClientMtMapToManyTarget newTarget = o1.getObjectContext().newObject(
+                ClientMtMapToManyTarget.class);
+
+        o1.addToTargets(newTarget);
+        assertEquals(4, targets.size());
+        assertSame(o1, newTarget.getMapToMany());
+
+        o1.getObjectContext().commitChanges();
+
+        o1.getObjectContext().performGenericQuery(new RefreshQuery());
+        assertEquals(4, o1.getTargets().size());
+
+        int newId = Cayenne.intPKForObject(newTarget);
+        assertSame(newTarget, o1.getTargets().get(new Integer(newId)));
+
+        assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
+        assertEquals(PersistenceState.COMMITTED, 
newTarget.getPersistenceState());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipTest.java
deleted file mode 100644
index 182643a..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*****************************************************************
- *   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.cayenne;
-
-import java.util.Map;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.ObjectIdQuery;
-import org.apache.cayenne.query.RefreshQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.mt.ClientMtMapToMany;
-import org.apache.cayenne.testdo.mt.ClientMtMapToManyTarget;
-import org.apache.cayenne.testdo.mt.MtMapToMany;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextMapRelationshipTest extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMtMapToMany;
-    private TableHelper tMtMapToManyTarget;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_MAP_TO_MANY_TARGET");
-        dbHelper.deleteAll("MT_MAP_TO_MANY");
-
-        tMtMapToMany = new TableHelper(dbHelper, "MT_MAP_TO_MANY");
-        tMtMapToMany.setColumns("ID");
-
-        tMtMapToManyTarget = new TableHelper(dbHelper, 
"MT_MAP_TO_MANY_TARGET");
-        tMtMapToManyTarget.setColumns("ID", "MAP_TO_MANY_ID");
-    }
-
-    private void createTwoMapToManysWithTargetsDataSet() throws Exception {
-        tMtMapToMany.insert(1).insert(2);
-        tMtMapToManyTarget.insert(1, 1).insert(2, 1).insert(3, 1).insert(4, 2);
-    }
-
-    public void testReadToMany() throws Exception {
-        createTwoMapToManysWithTargetsDataSet();
-
-        ObjectId id = new ObjectId("MtMapToMany", MtMapToMany.ID_PK_COLUMN, 1);
-        ClientMtMapToMany o1 = (ClientMtMapToMany) Cayenne.objectForQuery(
-                context,
-                new ObjectIdQuery(id));
-
-        Map<Object, ClientMtMapToManyTarget> targets = o1.getTargets();
-
-        assertTrue(((ValueHolder) targets).isFault());
-
-        assertNotNull(targets);
-        assertEquals(3, targets.size());
-        assertNotNull(targets.get(new Integer(1)));
-        assertNotNull(targets.get(new Integer(2)));
-        assertNotNull(targets.get(new Integer(3)));
-    }
-
-    public void testAddToMany() throws Exception {
-        createTwoMapToManysWithTargetsDataSet();
-
-        ObjectId id = new ObjectId("MtMapToMany", MtMapToMany.ID_PK_COLUMN, 1);
-        ClientMtMapToMany o1 = (ClientMtMapToMany) Cayenne.objectForQuery(
-                context,
-                new ObjectIdQuery(id));
-
-        Map<Object, ClientMtMapToManyTarget> targets = o1.getTargets();
-        assertNotNull(targets);
-        assertEquals(3, targets.size());
-
-        ClientMtMapToManyTarget newTarget = o1.getObjectContext().newObject(
-                ClientMtMapToManyTarget.class);
-
-        o1.addToTargets(newTarget);
-        assertEquals(4, targets.size());
-        assertSame(o1, newTarget.getMapToMany());
-
-        o1.getObjectContext().commitChanges();
-
-        o1.getObjectContext().performGenericQuery(new RefreshQuery());
-        assertEquals(4, o1.getTargets().size());
-
-        int newId = Cayenne.intPKForObject(newTarget);
-        assertSame(newTarget, o1.getTargets().get(new Integer(newId)));
-
-        assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-        assertEquals(PersistenceState.COMMITTED, 
newTarget.getPersistenceState());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerIT.java
new file mode 100644
index 0000000..a5b4815
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerIT.java
@@ -0,0 +1,90 @@
+/*****************************************************************
+ *   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.cayenne;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.graph.GraphEvent;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import static org.mockito.Mockito.mock;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextMergeHandlerIT extends ClientCase {
+
+    @Inject
+    protected CayenneContext context;
+
+    public void testShouldProcessEvent() {
+
+        CayenneContextMergeHandler handler = new 
CayenneContextMergeHandler(context);
+
+        // 1. Our context initiated the sync:
+        // src == channel && postedBy == context
+        GraphEvent e1 = new GraphEvent(context.getChannel(), context, null);
+        assertFalse(handler.shouldProcessEvent(e1));
+
+        // 2. Another context initiated the sync:
+        // postedBy != context && source == channel
+        GraphEvent e2 = new GraphEvent(context.getChannel(), 
mock(ObjectContext.class), null);
+        assertTrue(handler.shouldProcessEvent(e2));
+
+        // 2.1 Another object initiated the sync:
+        // postedBy != context && source == channel
+        GraphEvent e21 = new GraphEvent(context.getChannel(), new Object(), 
null);
+        assertTrue(handler.shouldProcessEvent(e21));
+
+        // 3. Another channel initiated the sync:
+        // postedBy == ? && source != channel
+        GraphEvent e3 = new GraphEvent(new MockDataChannel(), new Object(), 
null);
+        assertFalse(handler.shouldProcessEvent(e3));
+
+        // 4. inactive
+        GraphEvent e4 = new GraphEvent(context.getChannel(), 
mock(ObjectContext.class), null);
+        handler.active = false;
+        assertFalse(handler.shouldProcessEvent(e4));
+    }
+
+    public void testNodePropertyChanged() {
+
+        ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
+
+        CayenneContextMergeHandler handler = new 
CayenneContextMergeHandler(context);
+
+        assertNull(o1.getGlobalAttribute1Direct());
+
+        handler.nodePropertyChanged(o1.getObjectId(), 
ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, null, "abc");
+        assertEquals("abc", o1.getGlobalAttribute1Direct());
+
+        handler.nodePropertyChanged(o1.getObjectId(), 
ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, "abc", "xyz");
+
+        assertEquals("xyz", o1.getGlobalAttribute1Direct());
+
+        // block if old value is different
+        handler.nodePropertyChanged(o1.getObjectId(), 
ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, "123", "mnk");
+
+        assertEquals("xyz", o1.getGlobalAttribute1Direct());
+
+        handler.nodePropertyChanged(o1.getObjectId(), 
ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, "xyz", null);
+
+        assertNull(o1.getGlobalAttribute1Direct());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerTest.java
deleted file mode 100644
index e7dd147..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*****************************************************************
- *   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.cayenne;
-
-import static org.mockito.Mockito.mock;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.graph.GraphEvent;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextMergeHandlerTest extends ClientCase {
-
-    @Inject
-    protected CayenneContext context;
-
-    public void testShouldProcessEvent() {
-
-        CayenneContextMergeHandler handler = new 
CayenneContextMergeHandler(context);
-
-        // 1. Our context initiated the sync:
-        // src == channel && postedBy == context
-        GraphEvent e1 = new GraphEvent(context.getChannel(), context, null);
-        assertFalse(handler.shouldProcessEvent(e1));
-
-        // 2. Another context initiated the sync:
-        // postedBy != context && source == channel
-        GraphEvent e2 = new GraphEvent(context.getChannel(), 
mock(ObjectContext.class), null);
-        assertTrue(handler.shouldProcessEvent(e2));
-
-        // 2.1 Another object initiated the sync:
-        // postedBy != context && source == channel
-        GraphEvent e21 = new GraphEvent(context.getChannel(), new Object(), 
null);
-        assertTrue(handler.shouldProcessEvent(e21));
-
-        // 3. Another channel initiated the sync:
-        // postedBy == ? && source != channel
-        GraphEvent e3 = new GraphEvent(new MockDataChannel(), new Object(), 
null);
-        assertFalse(handler.shouldProcessEvent(e3));
-
-        // 4. inactive
-        GraphEvent e4 = new GraphEvent(context.getChannel(), 
mock(ObjectContext.class), null);
-        handler.active = false;
-        assertFalse(handler.shouldProcessEvent(e4));
-    }
-
-    public void testNodePropertyChanged() {
-
-        ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
-
-        CayenneContextMergeHandler handler = new 
CayenneContextMergeHandler(context);
-
-        assertNull(o1.getGlobalAttribute1Direct());
-
-        handler.nodePropertyChanged(o1.getObjectId(), 
ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, null, "abc");
-        assertEquals("abc", o1.getGlobalAttribute1Direct());
-
-        handler.nodePropertyChanged(o1.getObjectId(), 
ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, "abc", "xyz");
-
-        assertEquals("xyz", o1.getGlobalAttribute1Direct());
-
-        // block if old value is different
-        handler.nodePropertyChanged(o1.getObjectId(), 
ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, "123", "mnk");
-
-        assertEquals("xyz", o1.getGlobalAttribute1Direct());
-
-        handler.nodePropertyChanged(o1.getObjectId(), 
ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, "xyz", null);
-
-        assertNull(o1.getGlobalAttribute1Direct());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingIT.java
new file mode 100644
index 0000000..f286274
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingIT.java
@@ -0,0 +1,133 @@
+/*****************************************************************
+ *   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.cayenne;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.NamedQuery;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.unit.di.DataChannelInterceptor;
+import org.apache.cayenne.unit.di.UnitTestClosure;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.Collections;
+import java.util.List;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextNamedQueryCachingIT extends ClientCase {
+
+    @Inject
+    private DBHelper dbHelper;
+
+    @Inject
+    private CayenneContext context;
+
+    @Inject(ClientCase.ROP_CLIENT_KEY)
+    private DataChannelInterceptor clientServerInterceptor;
+
+    private TableHelper tMtTable1;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE2");
+        dbHelper.deleteAll("MT_TABLE1");
+
+        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
+        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
+    }
+
+    protected void createThreeMtTable1sDataSet() throws Exception {
+        tMtTable1.insert(1, "g1", "s1");
+        tMtTable1.insert(2, "g2", "s2");
+        tMtTable1.insert(3, "g3", "s3");
+    }
+
+    public void testLocalCache() throws Exception {
+        createThreeMtTable1sDataSet();
+
+        final NamedQuery q1 = new NamedQuery("MtQueryWithLocalCache");
+
+        final List<?> result1 = context.performQuery(q1);
+        assertEquals(3, result1.size());
+
+        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+                List<?> result2 = context.performQuery(q1);
+                assertSame(result1, result2);
+            }
+        });
+
+        // refresh
+        q1.setForceNoCache(true);
+        List<?> result3 = context.performQuery(q1);
+        assertNotSame(result1, result3);
+        assertEquals(3, result3.size());
+    }
+
+    public void testLocalCacheParameterized() throws Exception {
+        createThreeMtTable1sDataSet();
+
+        final NamedQuery q1 = new NamedQuery(
+                "ParameterizedMtQueryWithLocalCache",
+                Collections.singletonMap("g", "g1"));
+
+        final NamedQuery q2 = new NamedQuery(
+                "ParameterizedMtQueryWithLocalCache",
+                Collections.singletonMap("g", "g2"));
+
+        final List<?> result1 = context.performQuery(q1);
+        assertEquals(1, result1.size());
+
+        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+                List<?> result2 = context.performQuery(q1);
+                assertSame(result1, result2);
+            }
+        });
+        
+        final List<?> result3 = context.performQuery(q2);
+        assertNotSame(result1, result3);
+        assertEquals(1, result3.size());
+
+        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+                List<?> result4 = context.performQuery(q2);
+                assertSame(result3, result4);
+
+                List<?> result5 = context.performQuery(q1);
+                assertSame(result1, result5);
+            }
+        });
+    
+    }
+    
+    public void testParameterizedMappedToEJBQLQueries() throws Exception {
+        
+        createThreeMtTable1sDataSet();
+        NamedQuery query = new NamedQuery("ParameterizedEJBQLMtQuery", 
Collections.singletonMap("g", "g1"));
+        
+        List<?> r1 = context.performQuery(query);
+        assertEquals(1, r1.size());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingTest.java
deleted file mode 100644
index d9e71bc..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*****************************************************************
- *   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.cayenne;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.NamedQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.unit.di.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.UnitTestClosure;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextNamedQueryCachingTest extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    @Inject(ClientCase.ROP_CLIENT_KEY)
-    private DataChannelInterceptor clientServerInterceptor;
-
-    private TableHelper tMtTable1;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-
-        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
-        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
-    }
-
-    protected void createThreeMtTable1sDataSet() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-        tMtTable1.insert(2, "g2", "s2");
-        tMtTable1.insert(3, "g3", "s3");
-    }
-
-    public void testLocalCache() throws Exception {
-        createThreeMtTable1sDataSet();
-
-        final NamedQuery q1 = new NamedQuery("MtQueryWithLocalCache");
-
-        final List<?> result1 = context.performQuery(q1);
-        assertEquals(3, result1.size());
-
-        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-                List<?> result2 = context.performQuery(q1);
-                assertSame(result1, result2);
-            }
-        });
-
-        // refresh
-        q1.setForceNoCache(true);
-        List<?> result3 = context.performQuery(q1);
-        assertNotSame(result1, result3);
-        assertEquals(3, result3.size());
-    }
-
-    public void testLocalCacheParameterized() throws Exception {
-        createThreeMtTable1sDataSet();
-
-        final NamedQuery q1 = new NamedQuery(
-                "ParameterizedMtQueryWithLocalCache",
-                Collections.singletonMap("g", "g1"));
-
-        final NamedQuery q2 = new NamedQuery(
-                "ParameterizedMtQueryWithLocalCache",
-                Collections.singletonMap("g", "g2"));
-
-        final List<?> result1 = context.performQuery(q1);
-        assertEquals(1, result1.size());
-
-        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-                List<?> result2 = context.performQuery(q1);
-                assertSame(result1, result2);
-            }
-        });
-        
-        final List<?> result3 = context.performQuery(q2);
-        assertNotSame(result1, result3);
-        assertEquals(1, result3.size());
-
-        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-                List<?> result4 = context.performQuery(q2);
-                assertSame(result3, result4);
-
-                List<?> result5 = context.performQuery(q1);
-                assertSame(result1, result5);
-            }
-        });
-    
-    }
-    
-    public void testParameterizedMappedToEJBQLQueries() throws Exception {
-        
-        createThreeMtTable1sDataSet();
-        NamedQuery query = new NamedQuery("ParameterizedEJBQLMtQuery", 
Collections.singletonMap("g", "g1"));
-        
-        List<?> r1 = context.performQuery(query);
-        assertEquals(1, r1.size());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingIT.java
new file mode 100644
index 0000000..e59bcc9
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingIT.java
@@ -0,0 +1,75 @@
+/*****************************************************************
+ *   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.cayenne;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.QueryCacheStrategy;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.SortOrder;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.List;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextPaginatedListCachingIT extends ClientCase {
+
+    @Inject
+    private DBHelper dbHelper;
+
+    @Inject
+    private CayenneContext context;
+
+    private TableHelper tMtTable1;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE2");
+        dbHelper.deleteAll("MT_TABLE1");
+
+        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
+        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
+    }
+
+    protected void createSevenMtTable1sDataSet() throws Exception {
+        for (int i = 1; i <= 7; i++) {
+            tMtTable1.insert(i, "g" + i, "s" + i);
+        }
+    }
+
+    public void testLocalCache() throws Exception {
+        createSevenMtTable1sDataSet();
+
+        SelectQuery query = new SelectQuery(ClientMtTable1.class);
+        query.addOrdering(ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, 
SortOrder.ASCENDING);
+        query.setPageSize(3);
+        query.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
+
+        List<ClientMtTable1> result1 = context.performQuery(query);
+        assertEquals(7, result1.size());
+
+        // ensure we can resolve all objects without a failure...
+        for (ClientMtTable1 x : result1) {
+            x.getGlobalAttribute1();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingTest.java
deleted file mode 100644
index 479948e..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*****************************************************************
- *   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.cayenne;
-
-import java.util.List;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.QueryCacheStrategy;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextPaginatedListCachingTest extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    private TableHelper tMtTable1;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-
-        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
-        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
-    }
-
-    protected void createSevenMtTable1sDataSet() throws Exception {
-        for (int i = 1; i <= 7; i++) {
-            tMtTable1.insert(i, "g" + i, "s" + i);
-        }
-    }
-
-    public void testLocalCache() throws Exception {
-        createSevenMtTable1sDataSet();
-
-        SelectQuery query = new SelectQuery(ClientMtTable1.class);
-        query.addOrdering(ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, 
SortOrder.ASCENDING);
-        query.setPageSize(3);
-        query.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        List<ClientMtTable1> result1 = context.performQuery(query);
-        assertEquals(7, result1.size());
-
-        // ensure we can resolve all objects without a failure...
-        for (ClientMtTable1 x : result1) {
-            x.getGlobalAttribute1();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
new file mode 100644
index 0000000..e3865d0
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
@@ -0,0 +1,100 @@
+/*****************************************************************
+ *   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.cayenne;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.SortOrder;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.mt.ClientMtTablePrimitives;
+import org.apache.cayenne.testdo.mt.MtTablePrimitives;
+import org.apache.cayenne.unit.UnitDbAdapter;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.sql.Types;
+import java.util.List;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextPrimitiveIT extends ClientCase {
+
+    @Inject
+    private CayenneContext context;
+    
+    @Inject
+    private UnitDbAdapter accessStackAdapter;
+
+    @Inject
+    private DBHelper dbHelper;
+
+    private TableHelper tMtTablePrimitives;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE_PRIMITIVES");
+
+        int bool = accessStackAdapter.supportsBoolean() ? Types.BOOLEAN : 
Types.INTEGER;
+        
+        tMtTablePrimitives = new TableHelper(dbHelper, "MT_TABLE_PRIMITIVES");
+        tMtTablePrimitives.setColumns("ID", "BOOLEAN_COLUMN", 
"INT_COLUMN").setColumnTypes(
+                Types.INTEGER,
+                bool,
+                Types.INTEGER);
+    }
+
+    private void createTwoPrimitivesDataSet() throws Exception {
+        tMtTablePrimitives.insert(1, accessStackAdapter.supportsBoolean() ? 
true : 1, 0);
+        tMtTablePrimitives.insert(2, accessStackAdapter.supportsBoolean() ? 
false : 0, 5);
+    }
+
+    public void testSelectPrimitives() throws Exception {
+        createTwoPrimitivesDataSet();
+
+        SelectQuery query = new SelectQuery(ClientMtTablePrimitives.class);
+        query.addOrdering("db:" + MtTablePrimitives.ID_PK_COLUMN, 
SortOrder.ASCENDING);
+
+        List<ClientMtTablePrimitives> results = context.performQuery(query);
+        assertTrue(results.get(0).isBooleanColumn());
+        assertFalse(results.get(1).isBooleanColumn());
+
+        assertEquals(0, results.get(0).getIntColumn());
+        assertEquals(5, results.get(1).getIntColumn());
+    }
+
+    public void testCommitChangesPrimitives() throws Exception {
+
+        ClientMtTablePrimitives object = 
context.newObject(ClientMtTablePrimitives.class);
+
+        object.setBooleanColumn(true);
+        object.setIntColumn(3);
+
+        context.commitChanges();
+
+        assertTrue(tMtTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
+        assertEquals(3, tMtTablePrimitives.getInt("INT_COLUMN"));
+
+        object.setBooleanColumn(false);
+        object.setIntColumn(8);
+        context.commitChanges();
+
+        assertFalse(tMtTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
+        assertEquals(8, tMtTablePrimitives.getInt("INT_COLUMN"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveTest.java
deleted file mode 100644
index 2b02654..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*****************************************************************
- *   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.cayenne;
-
-import java.sql.Types;
-import java.util.List;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.mt.ClientMtTablePrimitives;
-import org.apache.cayenne.testdo.mt.MtTablePrimitives;
-import org.apache.cayenne.unit.UnitDbAdapter;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextPrimitiveTest extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-    
-    @Inject
-    private UnitDbAdapter accessStackAdapter;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMtTablePrimitives;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE_PRIMITIVES");
-
-        int bool = accessStackAdapter.supportsBoolean() ? Types.BOOLEAN : 
Types.INTEGER;
-        
-        tMtTablePrimitives = new TableHelper(dbHelper, "MT_TABLE_PRIMITIVES");
-        tMtTablePrimitives.setColumns("ID", "BOOLEAN_COLUMN", 
"INT_COLUMN").setColumnTypes(
-                Types.INTEGER,
-                bool,
-                Types.INTEGER);
-    }
-
-    private void createTwoPrimitivesDataSet() throws Exception {
-        tMtTablePrimitives.insert(1, accessStackAdapter.supportsBoolean() ? 
true : 1, 0);
-        tMtTablePrimitives.insert(2, accessStackAdapter.supportsBoolean() ? 
false : 0, 5);
-    }
-
-    public void testSelectPrimitives() throws Exception {
-        createTwoPrimitivesDataSet();
-
-        SelectQuery query = new SelectQuery(ClientMtTablePrimitives.class);
-        query.addOrdering("db:" + MtTablePrimitives.ID_PK_COLUMN, 
SortOrder.ASCENDING);
-
-        List<ClientMtTablePrimitives> results = context.performQuery(query);
-        assertTrue(results.get(0).isBooleanColumn());
-        assertFalse(results.get(1).isBooleanColumn());
-
-        assertEquals(0, results.get(0).getIntColumn());
-        assertEquals(5, results.get(1).getIntColumn());
-    }
-
-    public void testCommitChangesPrimitives() throws Exception {
-
-        ClientMtTablePrimitives object = 
context.newObject(ClientMtTablePrimitives.class);
-
-        object.setBooleanColumn(true);
-        object.setIntColumn(3);
-
-        context.commitChanges();
-
-        assertTrue(tMtTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
-        assertEquals(3, tMtTablePrimitives.getInt("INT_COLUMN"));
-
-        object.setBooleanColumn(false);
-        object.setIntColumn(8);
-        context.commitChanges();
-
-        assertFalse(tMtTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
-        assertEquals(8, tMtTablePrimitives.getInt("INT_COLUMN"));
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryIT.java
new file mode 100644
index 0000000..2100320
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryIT.java
@@ -0,0 +1,76 @@
+/*****************************************************************
+ *   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.cayenne;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.RefreshQuery;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextRefreshQueryIT extends ClientCase {
+
+    @Inject
+    private DBHelper dbHelper;
+
+    @Inject
+    private CayenneContext context;
+
+    private TableHelper tMtTable1;
+    private TableHelper tMtTable2;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE2");
+        dbHelper.deleteAll("MT_TABLE1");
+
+        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
+        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
+
+        tMtTable2 = new TableHelper(dbHelper, "MT_TABLE2");
+        tMtTable2.setColumns("TABLE2_ID", "TABLE1_ID", "GLOBAL_ATTRIBUTE");
+    }
+
+    private void createM1AndTwoM2sDataSet() throws Exception {
+        tMtTable1.insert(1, "g1", "s1");
+        tMtTable2.insert(1, 1, "g1").insert(2, 1, "g1");
+    }
+
+    private void delete1M2DataSet() throws Exception {
+        tMtTable2.delete().where("TABLE2_ID", 1).execute();
+    }
+
+    public void testRefreshToMany() throws Exception {
+
+        createM1AndTwoM2sDataSet();
+
+        ClientMtTable1 a = Cayenne.objectForPK(context, ClientMtTable1.class, 
1);
+        assertEquals(2, a.getTable2Array().size());
+
+        delete1M2DataSet();
+
+        RefreshQuery refresh = new RefreshQuery(a);
+        context.performGenericQuery(refresh);
+        assertEquals(PersistenceState.HOLLOW, a.getPersistenceState());
+        assertEquals(1, a.getTable2Array().size());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryTest.java
deleted file mode 100644
index ca7c476..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*****************************************************************
- *   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.cayenne;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.RefreshQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextRefreshQueryTest extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    private TableHelper tMtTable1;
-    private TableHelper tMtTable2;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-
-        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
-        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
-
-        tMtTable2 = new TableHelper(dbHelper, "MT_TABLE2");
-        tMtTable2.setColumns("TABLE2_ID", "TABLE1_ID", "GLOBAL_ATTRIBUTE");
-    }
-
-    private void createM1AndTwoM2sDataSet() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-        tMtTable2.insert(1, 1, "g1").insert(2, 1, "g1");
-    }
-
-    private void delete1M2DataSet() throws Exception {
-        tMtTable2.delete().where("TABLE2_ID", 1).execute();
-    }
-
-    public void testRefreshToMany() throws Exception {
-
-        createM1AndTwoM2sDataSet();
-
-        ClientMtTable1 a = Cayenne.objectForPK(context, ClientMtTable1.class, 
1);
-        assertEquals(2, a.getTable2Array().size());
-
-        delete1M2DataSet();
-
-        RefreshQuery refresh = new RefreshQuery(a);
-        context.performGenericQuery(refresh);
-        assertEquals(PersistenceState.HOLLOW, a.getPersistenceState());
-        assertEquals(1, a.getTable2Array().size());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsIT.java
new file mode 100644
index 0000000..fbc9f20
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsIT.java
@@ -0,0 +1,100 @@
+/*****************************************************************
+ *   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.cayenne;
+
+import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.ClientMtTable2;
+import org.apache.cayenne.testdo.mt.MtTable1;
+import org.apache.cayenne.testdo.mt.MtTable2;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextRelationshipsIT extends ClientCase {
+
+    @Inject
+    private DBHelper dbHelper;
+
+    @Inject
+    private CayenneContext context;
+
+    @Inject
+    private DataContext serverContext;
+
+    private TableHelper tMtTable1;
+    private TableHelper tMtTable2;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE2");
+        dbHelper.deleteAll("MT_TABLE1");
+        dbHelper.deleteAll("MT_JOIN45");
+        dbHelper.deleteAll("MT_TABLE4");
+        dbHelper.deleteAll("MT_TABLE5");
+
+        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
+        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
+
+        tMtTable2 = new TableHelper(dbHelper, "MT_TABLE2");
+        tMtTable2.setColumns("TABLE2_ID", "TABLE1_ID", "GLOBAL_ATTRIBUTE");
+    }
+
+    public void testLostUncommittedToOneModifications_Client() throws 
Exception {
+
+        tMtTable1.insert(1, "G1", "S1");
+        tMtTable1.insert(2, "G2", "S2");
+        tMtTable2.insert(33, 1, "GX");
+
+        ClientMtTable2 o = Cayenne.objectForPK(context, ClientMtTable2.class, 
33);
+
+        ClientMtTable1 r2 = Cayenne.objectForPK(context, ClientMtTable1.class, 
2);
+        ClientMtTable1 r1 = o.getTable1();
+
+        o.setTable1(r2);
+
+        assertSame(r2, o.getTable1());
+
+        // see CAY-1757 - this used to reset our changes
+        assertFalse(r1.getTable2Array().contains(o));
+        assertSame(r2, o.getTable1());
+    }
+
+    public void testLostUncommittedToOneModifications_Server() throws 
Exception {
+
+        tMtTable1.insert(1, "G1", "S1");
+        tMtTable1.insert(2, "G2", "S2");
+        tMtTable2.insert(33, 1, "GX");
+
+        MtTable2 o = Cayenne.objectForPK(serverContext, MtTable2.class, 33);
+
+        MtTable1 r2 = Cayenne.objectForPK(serverContext, MtTable1.class, 2);
+        MtTable1 r1 = o.getTable1();
+
+        o.setTable1(r2);
+
+        assertSame(r2, o.getTable1());
+
+        assertFalse(r1.getTable2Array().contains(o));
+        assertSame(r2, o.getTable1());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsTest.java
deleted file mode 100644
index 38aa1b4..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*****************************************************************
- *   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.cayenne;
-
-import org.apache.cayenne.access.DataContext;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.ClientMtTable2;
-import org.apache.cayenne.testdo.mt.MtTable1;
-import org.apache.cayenne.testdo.mt.MtTable2;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextRelationshipsTest extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    @Inject
-    private DataContext serverContext;
-
-    private TableHelper tMtTable1;
-    private TableHelper tMtTable2;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-        dbHelper.deleteAll("MT_JOIN45");
-        dbHelper.deleteAll("MT_TABLE4");
-        dbHelper.deleteAll("MT_TABLE5");
-
-        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
-        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", 
"SERVER_ATTRIBUTE1");
-
-        tMtTable2 = new TableHelper(dbHelper, "MT_TABLE2");
-        tMtTable2.setColumns("TABLE2_ID", "TABLE1_ID", "GLOBAL_ATTRIBUTE");
-    }
-
-    public void testLostUncommittedToOneModifications_Client() throws 
Exception {
-
-        tMtTable1.insert(1, "G1", "S1");
-        tMtTable1.insert(2, "G2", "S2");
-        tMtTable2.insert(33, 1, "GX");
-
-        ClientMtTable2 o = Cayenne.objectForPK(context, ClientMtTable2.class, 
33);
-
-        ClientMtTable1 r2 = Cayenne.objectForPK(context, ClientMtTable1.class, 
2);
-        ClientMtTable1 r1 = o.getTable1();
-
-        o.setTable1(r2);
-
-        assertSame(r2, o.getTable1());
-
-        // see CAY-1757 - this used to reset our changes
-        assertFalse(r1.getTable2Array().contains(o));
-        assertSame(r2, o.getTable1());
-    }
-
-    public void testLostUncommittedToOneModifications_Server() throws 
Exception {
-
-        tMtTable1.insert(1, "G1", "S1");
-        tMtTable1.insert(2, "G2", "S2");
-        tMtTable2.insert(33, 1, "GX");
-
-        MtTable2 o = Cayenne.objectForPK(serverContext, MtTable2.class, 33);
-
-        MtTable1 r2 = Cayenne.objectForPK(serverContext, MtTable1.class, 2);
-        MtTable1 r1 = o.getTable1();
-
-        o.setTable1(r2);
-
-        assertSame(r2, o.getTable1());
-
-        assertFalse(r1.getTable2Array().contains(o));
-        assertSame(r2, o.getTable1());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateIT.java
new file mode 100644
index 0000000..1cd129b
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateIT.java
@@ -0,0 +1,54 @@
+/*****************************************************************
+ *   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.cayenne;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.SQLTemplate;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextSQLTemplateIT extends ClientCase {
+
+    @Inject
+    private DBHelper dbHelper;
+
+    @Inject
+    private CayenneContext context;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE2");
+        dbHelper.deleteAll("MT_TABLE1");
+    }
+
+    public void testObjectRoot() throws Exception {
+
+        assertNull(Cayenne.objectForPK(context, ClientMtTable1.class, 1));
+        context.performGenericQuery(new SQLTemplate(
+                ClientMtTable1.class,
+                "insert into MT_TABLE1 "
+                        + "(TABLE1_ID, GLOBAL_ATTRIBUTE1, SERVER_ATTRIBUTE1) "
+                        + "values (1, 'g1', 's1')"));
+
+        assertNotNull(Cayenne.objectForPK(context, ClientMtTable1.class, 1));
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateTest.java
deleted file mode 100644
index ac71e78..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*****************************************************************
- *   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.cayenne;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextSQLTemplateTest extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-    }
-
-    public void testObjectRoot() throws Exception {
-
-        assertNull(Cayenne.objectForPK(context, ClientMtTable1.class, 1));
-        context.performGenericQuery(new SQLTemplate(
-                ClientMtTable1.class,
-                "insert into MT_TABLE1 "
-                        + "(TABLE1_ID, GLOBAL_ATTRIBUTE1, SERVER_ATTRIBUTE1) "
-                        + "values (1, 'g1', 's1')"));
-
-        assertNotNull(Cayenne.objectForPK(context, ClientMtTable1.class, 1));
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsIT.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsIT.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsIT.java
new file mode 100644
index 0000000..4faed91
--- /dev/null
+++ 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsIT.java
@@ -0,0 +1,153 @@
+/*****************************************************************
+ *   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.cayenne;
+
+import org.apache.cayenne.access.ClientServerChannel;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.LifecycleEvent;
+import org.apache.cayenne.reflect.LifecycleCallbackRegistry;
+import org.apache.cayenne.remote.ClientChannelServerDiffsListener1;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.ClientMtTable2;
+import org.apache.cayenne.testdo.mt.MtTable1;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextServerDiffsIT extends ClientCase {
+
+    @Inject
+    private ClientServerChannel clientServerChannel;
+
+    @Inject
+    private CayenneContext context;
+
+    public void testReturnDiffInPrePersist() {
+
+        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
+                .getEntityResolver()
+                .getCallbackRegistry();
+
+        try {
+
+            callbackRegistry.addListener(
+                    LifecycleEvent.POST_ADD,
+                    MtTable1.class,
+                    new ClientChannelServerDiffsListener1(),
+                    "prePersist");
+
+            ClientMtTable1 o = context.newObject(ClientMtTable1.class);
+            o.setServerAttribute1("YY");
+            context.commitChanges();
+
+            assertFalse(o.getObjectId().isTemporary());
+            assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
+            assertEquals("XXX", o.getGlobalAttribute1());
+        }
+        finally {
+            callbackRegistry.clear();
+        }
+    }
+
+    public void testReturnDiffInPreUpdate() {
+        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
+                .getEntityResolver()
+                .getCallbackRegistry();
+
+        try {
+
+            callbackRegistry.addListener(
+                    LifecycleEvent.PRE_UPDATE,
+                    MtTable1.class,
+                    new ClientChannelServerDiffsListener1(),
+                    "preUpdate");
+
+            ClientMtTable1 o = context.newObject(ClientMtTable1.class);
+            o.setServerAttribute1("YY");
+            context.commitChanges();
+
+            assertNull(o.getGlobalAttribute1());
+
+            o.setServerAttribute1("XX");
+            context.commitChanges();
+
+            assertFalse(o.getObjectId().isTemporary());
+            assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
+            assertEquals("111", o.getGlobalAttribute1());
+        }
+        finally {
+            callbackRegistry.clear();
+        }
+    }
+
+    public void testReturnDiffClientArcChanges() {
+
+        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
+                .getEntityResolver()
+                .getCallbackRegistry();
+
+        try {
+            callbackRegistry.addListener(
+                    LifecycleEvent.POST_ADD,
+                    MtTable1.class,
+                    new ClientChannelServerDiffsListener1(),
+                    "prePersist");
+
+            ClientMtTable1 o = context.newObject(ClientMtTable1.class);
+            ClientMtTable2 o1 = context.newObject(ClientMtTable2.class);
+            o.addToTable2Array(o1);
+            context.commitChanges();
+
+            assertFalse(o.getObjectId().isTemporary());
+            assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
+            assertEquals("XXX", o.getGlobalAttribute1());
+        }
+        finally {
+            callbackRegistry.clear();
+        }
+    }
+
+    public void testReturnDiffServerArcChanges() {
+
+        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
+                .getEntityResolver()
+                .getCallbackRegistry();
+
+        try {
+            callbackRegistry.addListener(
+                    LifecycleEvent.POST_ADD,
+                    MtTable1.class,
+                    new ClientChannelServerDiffsListener1(),
+                    "prePersistAddRelationship");
+
+            ClientMtTable1 o = context.newObject(ClientMtTable1.class);
+            ClientMtTable2 o1 = context.newObject(ClientMtTable2.class);
+            o.addToTable2Array(o1);
+            context.commitChanges();
+
+            assertFalse(o.getObjectId().isTemporary());
+            assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
+            assertEquals(2, o.getTable2Array().size());
+
+        }
+        finally {
+            callbackRegistry.clear();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsTest.java
 
b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsTest.java
deleted file mode 100644
index 54027a1..0000000
--- 
a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*****************************************************************
- *   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.cayenne;
-
-import org.apache.cayenne.access.ClientServerChannel;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.map.LifecycleEvent;
-import org.apache.cayenne.reflect.LifecycleCallbackRegistry;
-import org.apache.cayenne.remote.ClientChannelServerDiffsListener1;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.ClientMtTable2;
-import org.apache.cayenne.testdo.mt.MtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextServerDiffsTest extends ClientCase {
-
-    @Inject
-    private ClientServerChannel clientServerChannel;
-
-    @Inject
-    private CayenneContext context;
-
-    public void testReturnDiffInPrePersist() {
-
-        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        try {
-
-            callbackRegistry.addListener(
-                    LifecycleEvent.POST_ADD,
-                    MtTable1.class,
-                    new ClientChannelServerDiffsListener1(),
-                    "prePersist");
-
-            ClientMtTable1 o = context.newObject(ClientMtTable1.class);
-            o.setServerAttribute1("YY");
-            context.commitChanges();
-
-            assertFalse(o.getObjectId().isTemporary());
-            assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-            assertEquals("XXX", o.getGlobalAttribute1());
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-
-    public void testReturnDiffInPreUpdate() {
-        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        try {
-
-            callbackRegistry.addListener(
-                    LifecycleEvent.PRE_UPDATE,
-                    MtTable1.class,
-                    new ClientChannelServerDiffsListener1(),
-                    "preUpdate");
-
-            ClientMtTable1 o = context.newObject(ClientMtTable1.class);
-            o.setServerAttribute1("YY");
-            context.commitChanges();
-
-            assertNull(o.getGlobalAttribute1());
-
-            o.setServerAttribute1("XX");
-            context.commitChanges();
-
-            assertFalse(o.getObjectId().isTemporary());
-            assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-            assertEquals("111", o.getGlobalAttribute1());
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-
-    public void testReturnDiffClientArcChanges() {
-
-        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        try {
-            callbackRegistry.addListener(
-                    LifecycleEvent.POST_ADD,
-                    MtTable1.class,
-                    new ClientChannelServerDiffsListener1(),
-                    "prePersist");
-
-            ClientMtTable1 o = context.newObject(ClientMtTable1.class);
-            ClientMtTable2 o1 = context.newObject(ClientMtTable2.class);
-            o.addToTable2Array(o1);
-            context.commitChanges();
-
-            assertFalse(o.getObjectId().isTemporary());
-            assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-            assertEquals("XXX", o.getGlobalAttribute1());
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-
-    public void testReturnDiffServerArcChanges() {
-
-        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        try {
-            callbackRegistry.addListener(
-                    LifecycleEvent.POST_ADD,
-                    MtTable1.class,
-                    new ClientChannelServerDiffsListener1(),
-                    "prePersistAddRelationship");
-
-            ClientMtTable1 o = context.newObject(ClientMtTable1.class);
-            ClientMtTable2 o1 = context.newObject(ClientMtTable2.class);
-            o.addToTable2Array(o1);
-            context.commitChanges();
-
-            assertFalse(o.getObjectId().isTemporary());
-            assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-            assertEquals(2, o.getTable2Array().size());
-
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-}

Reply via email to