You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2022/07/07 18:48:43 UTC

[cayenne] branch master updated (dc23c4525 -> 96819eb69)

This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


    from dc23c4525 CAY-2742 Switch minimum required Java version to 11  - drop code that handled incompatibility between Java 8 and 9 in the MacOS version
     new 984bbf22b CAY-2744 Remove ROP support  - delete ROP modules
     new 220c4b427 CAY-2744 Remove ROP support  - delete ROP-related documentation
     new c1247afd2 CAY-2744 Remove ROP support  - delete ROP tutorials
     new 0280cd257 CAY-2744 Remove ROP support  - drop unused dependencies
     new 96819eb69 CAY-2744 Remove ROP support  - cleanup client related code

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../assemblies/generic/assembly-generic.xml        |   6 -
 .../main/resources/assemblies/mac/assembly-mac.xml |   6 -
 .../assemblies/windows/assembly-windows.xml        |   6 -
 .../apache/cayenne/tools/CayenneGeneratorTask.java |  20 +-
 .../org/apache/cayenne/gen/CgenConfiguration.java  |  51 +-
 .../cayenne/gen/ClientClassGenerationAction.java   | 108 ----
 .../apache/cayenne/gen/ClientDataMapArtifact.java  |  50 --
 .../apache/cayenne/gen/ClientEntityArtifact.java   |  45 --
 .../gen/DefaultClassGenerationActionFactory.java   |   4 +-
 .../java/org/apache/cayenne/gen/PropertyUtils.java |  49 +-
 .../apache/cayenne/gen/xml/CgenConfigHandler.java  |  13 +-
 .../tools/CayenneGeneratorEntityFilterAction.java  |   7 +-
 .../cayenne/gen/BaseTemplatesGenerationTest.java   |   2 +-
 .../apache/cayenne/gen/CgenConfigurationTest.java  |   4 +-
 .../cayenne/gen/ClassGenerationActionTest.java     |  36 +-
 .../gen/ClientSuperClassGenerationTest.java        | 109 ----
 .../apache/cayenne/gen/TemplateLocationTest.java   |   2 +-
 .../cayenne/gen/xml/CgenSaverDelegateTest.java     |   6 +-
 cayenne-client-jetty/pom.xml                       | 147 -----
 .../rop/client/ClientJettyHttp2Module.java         |  44 --
 .../rop/client/ClientJettyHttpModule.java          |  40 --
 .../rop/client/JettyClientModuleProvider.java      |  46 --
 .../rop/JettyHttp2ClientConnectionProvider.java    |  59 --
 .../rop/JettyHttpClientConnectionProvider.java     | 128 ----
 .../cayenne/rop/http/JettyHttpROPConnector.java    | 190 ------
 ...guration.rop.client.CayenneClientModuleProvider |  20 -
 .../rop/client/JettyModuleProviderTest.java        |  35 --
 .../cayenne/rop/http/JettyHttpROPConnectorIT.java  | 134 ----
 .../org/apache/cayenne/util/Http2TestServer.java   | 127 ----
 cayenne-client/pom.xml                             | 135 ----
 .../rop/client/CayenneClientModuleProvider.java    |  29 -
 .../rop/client/CayenneContextFactory.java          |  67 --
 .../rop/client/ClientChannelProvider.java          |  47 --
 .../configuration/rop/client/ClientConstants.java  |  50 --
 .../configuration/rop/client/ClientModule.java     |  69 ---
 .../configuration/rop/client/ClientRuntime.java    |  66 --
 .../rop/client/ClientRuntimeBuilder.java           | 147 -----
 .../client/LocalClientServerChannelProvider.java   |  51 --
 .../rop/client/LocalConnectionProvider.java        |  43 --
 .../client/MainCayenneClientModuleProvider.java    |  46 --
 .../org/apache/cayenne/remote/BaseConnection.java  | 125 ----
 .../org/apache/cayenne/remote/ClientChannel.java   | 314 ----------
 .../apache/cayenne/remote/ClientConnection.java    |  47 --
 .../remote/hessian/ClientSerializerFactory.java    |  75 ---
 .../remote/hessian/DataRowDeserializer.java        |  81 ---
 .../remote/hessian/service/HessianUtil.java        |  87 ---
 .../java/org/apache/cayenne/remote/package.html    |  24 -
 .../cayenne/remote/service/LocalConnection.java    | 144 -----
 .../apache/cayenne/rop/HttpClientConnection.java   | 134 ----
 .../cayenne/rop/HttpClientConnectionProvider.java  |  73 ---
 .../org/apache/cayenne/rop/ProxyRemoteService.java |  76 ---
 .../java/org/apache/cayenne/rop/ROPConnector.java  |  52 --
 .../main/java/org/apache/cayenne/rop/ROPUtil.java  | 151 -----
 .../ClientHessianSerializationServiceProvider.java |  39 --
 .../apache/cayenne/rop/http/HttpROPConnector.java  | 166 -----
 ...guration.rop.client.CayenneClientModuleProvider |  20 -
 .../apache/cayenne/CayenneContextCayenneIT.java    |  51 --
 .../CayenneContextClientChannelEventsIT.java       | 353 -----------
 .../cayenne/CayenneContextDeleteRulesIT.java       | 123 ----
 .../org/apache/cayenne/CayenneContextEJBQLIT.java  |  93 ---
 .../CayenneContextGraphDiffCompressorIT.java       | 103 ----
 .../java/org/apache/cayenne/CayenneContextIT.java  | 342 -----------
 .../cayenne/CayenneContextInheritanceIT.java       | 146 -----
 .../cayenne/CayenneContextMapRelationshipIT.java   | 119 ----
 .../cayenne/CayenneContextMeaningfulPKIT.java      |  71 ---
 .../cayenne/CayenneContextMergeHandlerIT.java      |  98 ---
 .../cayenne/CayenneContextNamedQueryCachingIT.java | 133 ----
 .../CayenneContextPaginatedListCachingIT.java      |  75 ---
 .../apache/cayenne/CayenneContextPrimitiveIT.java  | 134 ----
 .../apache/cayenne/CayenneContextReflexiveIT.java  |  94 ---
 .../cayenne/CayenneContextRefreshQueryIT.java      |  79 ---
 .../cayenne/CayenneContextRelationshipsIT.java     | 102 ----
 .../cayenne/CayenneContextSQLTemplateIT.java       |  50 --
 .../cayenne/CayenneContextServerDiffsIT.java       | 163 -----
 .../apache/cayenne/CayenneContextValidationIT.java |  86 ---
 .../cayenne/CayenneContextWithDataContextIT.java   | 465 --------------
 .../test/java/org/apache/cayenne/DataRowTest.java  |  51 --
 .../org/apache/cayenne/NestedCayenneContextIT.java | 680 ---------------------
 .../cayenne/NestedCayenneContextTooneIT.java       | 222 -------
 .../apache/cayenne/ObjectContextChangeLogTest.java |  48 --
 .../test/java/org/apache/cayenne/ObjectIdTest.java |  84 ---
 .../cayenne/PersistentObjectInContextIT.java       | 151 -----
 .../cayenne/access/ClientServerChannelIT.java      | 263 --------
 .../cayenne/access/ClientServerChannelQueryIT.java | 241 --------
 .../org/apache/cayenne/access/types/EnumTest.java  | 113 ----
 .../org/apache/cayenne/cay_2641/Cay2641IT.java     |  97 ---
 .../rop/client/ClientLocalRuntimeTest.java         |  84 ---
 .../configuration/rop/client/ClientModuleTest.java |  98 ---
 .../rop/client/ClientRuntimeBuilderTest.java       | 160 -----
 .../rop/client/ClientRuntimeTest.java              | 118 ----
 .../MainCayenneClientModuleProviderTest.java       |  35 --
 .../org/apache/cayenne/event/EventSubjectTest.java |  40 --
 .../org/apache/cayenne/graph/NodeDiffTest.java     |  58 --
 .../cayenne/map/ClientEntityResolverTest.java      |  66 --
 .../cayenne/map/ClientObjectRelationshipTest.java  |  48 --
 .../java/org/apache/cayenne/map/DataMapTest.java   |  42 --
 .../java/org/apache/cayenne/map/DbEntityTest.java  |  58 --
 .../java/org/apache/cayenne/map/EntityTest.java    |  65 --
 .../apache/cayenne/query/ClientExpressionIT.java   | 346 -----------
 .../apache/cayenne/query/ClientObjectSelectIT.java | 156 -----
 .../query/ClientSelectQueryExpressionIT.java       |  73 ---
 .../apache/cayenne/query/ObjectIdQueryTest.java    |  42 --
 .../apache/cayenne/query/PrefetchTreeNodeTest.java | 159 -----
 .../org/apache/cayenne/query/RefreshQueryTest.java |  40 --
 .../cayenne/query/RelationshipQueryTest.java       |  42 --
 .../org/apache/cayenne/query/SQLTemplateTest.java  |  51 --
 .../org/apache/cayenne/query/SelectById_IT.java    |  57 --
 .../cayenne/query/SelectQueryAbstractEntityIT.java | 113 ----
 .../cayenne/remote/CayenneContextDeletionIT.java   |  63 --
 .../cayenne/remote/ClientChannelServerDiffsIT.java | 281 ---------
 .../remote/ClientChannelServerDiffsListener1.java  |  37 --
 .../apache/cayenne/remote/ClientChannelTest.java   | 251 --------
 .../apache/cayenne/remote/LocalConnectionTest.java |  49 --
 .../cayenne/remote/MockClientConnection.java       |  68 ---
 .../cayenne/remote/NestedObjectContextLocalIT.java |  84 ---
 .../remote/NestedObjectContextParentEventsIT.java  |  80 ---
 .../remote/NestedObjectContextPeerEventsIT.java    | 168 -----
 .../remote/NestedObjectContextRollbackIT.java      |  98 ---
 .../cayenne/remote/ROPPrefetchToManyMapIT.java     |  81 ---
 .../cayenne/remote/RelationshipChangeIT.java       |  86 ---
 .../apache/cayenne/remote/RemoteCallbacksIT.java   | 142 -----
 .../apache/cayenne/remote/RemoteCayenneCase.java   |  66 --
 .../remote/RemoteIncrementalFaultListIT.java       | 273 ---------
 .../apache/cayenne/remote/RemoteRollbackIT.java    | 178 ------
 .../org/apache/cayenne/remote/SyncMessageTest.java |  85 ---
 .../org/apache/cayenne/remote/ValueInjectorIT.java | 100 ---
 .../rop/http/HessianROPSerializationServiceIT.java | 114 ----
 .../apache/cayenne/unit/UnitLocalConnection.java   |  63 --
 .../apache/cayenne/unit/di/client/ClientCase.java  |  59 --
 .../client/ClientCaseCayenneContextProvider.java   |  36 --
 .../client/ClientCaseClientConnectionProvider.java |  35 --
 .../unit/di/client/ClientCaseContextsSync.java     |  70 ---
 .../unit/di/client/ClientCaseLifecycleManager.java |  67 --
 .../cayenne/unit/di/client/ClientCaseModule.java   |  62 --
 .../di/client/ClientCaseObjectContextProvider.java |  35 --
 .../unit/di/client/ClientCaseProperties.java       |  36 --
 .../cayenne/unit/di/client/ClientCaseSelfIT.java   |  53 --
 .../unit/di/client/ClientRuntimeProperty.java      |  36 --
 .../unit/di/client/ClientRuntimeProvider.java      |  62 --
 .../client/ClientRuntimeProviderContextsSync.java  |  42 --
 .../di/client/ClientServerChannelProvider.java     |  42 --
 .../client/ClientServerDataChannelDecorator.java   |  90 ---
 .../client/ClientServerDataChannelInterceptor.java |  75 ---
 .../InterceptingClientServerChannelProvider.java   |  38 --
 .../apache/cayenne/util/GenericResponseTest.java   |  64 --
 .../org/apache/cayenne/util/ListResponseTest.java  |  42 --
 .../cayenne/util/ObjectDetachOperationIT.java      | 120 ----
 .../cayenne/util/PersistentObjectListTest.java     |  79 ---
 .../util/ShallowMergeOperation_ClientIT.java       | 214 -------
 .../merge/token/model/CreateTableToModel.java      |   5 -
 .../merge/token/model/CreateTableToModelIT.java    |   2 -
 .../java/org/apache/cayenne/tools/CgenTask.java    |  28 +-
 .../org/apache/cayenne/tools/CgenTaskTest.java     |   1 -
 .../project/extension/ProjectExtension.java        |   4 +-
 cayenne-protostuff/pom.xml                         | 157 -----
 ...bjectContextChangeLogSubListMessageFactory.java |  38 --
 .../ProtostuffServerModuleProvider.java            |  49 --
 .../rop/client/ProtostuffClientModuleProvider.java |  46 --
 .../configuration/rop/client/ProtostuffModule.java |  48 --
 .../cayenne/query/PrefetchTreeNodeSchema.java      | 157 -----
 .../ProtostuffROPSerializationService.java         |  92 ---
 .../org/apache/cayenne/rop/protostuff/Wrapper.java |  40 --
 ...guration.rop.client.CayenneClientModuleProvider |  20 -
 ...onfiguration.server.CayenneServerModuleProvider |  20 -
 ...tContextChangeLogSubListMessageFactoryTest.java |  55 --
 .../rop/client/ProtostuffModuleProviderTest.java   |  42 --
 .../cayenne/query/PrefetchTreeNodeSchemaTest.java  |  61 --
 .../remote/service/ProtostuffLocalConnection.java  |  78 ---
 .../service/ProtostuffLocalConnectionProvider.java |  40 --
 .../ProtostuffPersistentObjectCollectionsTest.java | 211 -------
 .../rop/protostuff/ProtostuffProperties.java       |  32 -
 .../ProtostuffROPSerializationServiceIT.java       |  83 ---
 .../protostuff/ProtostuffROPSerializationTest.java | 136 -----
 .../apache/cayenne/rop/protostuff/RuntimeBase.java |  67 --
 .../rop/protostuff/persistent/ClientMtTable1.java  |  31 -
 .../rop/protostuff/persistent/ClientMtTable2.java  |  31 -
 .../rop/protostuff/persistent/MtTable1.java        |  28 -
 .../rop/protostuff/persistent/MtTable2.java        |  28 -
 .../persistent/auto/_ClientMtTable1.java           | 178 ------
 .../persistent/auto/_ClientMtTable2.java           |  62 --
 .../rop/protostuff/persistent/auto/_MtTable1.java  | 212 -------
 .../rop/protostuff/persistent/auto/_MtTable2.java  | 106 ----
 .../src/test/resources/cayenne-protostuff.xml      |  16 -
 .../src/test/resources/protostuff.map.xml          |  42 --
 cayenne-rop-server/pom.xml                         |  91 ---
 .../java/org/apache/cayenne/CayenneContext.java    | 381 ------------
 .../cayenne/CayenneContextChildDiffLoader.java     | 140 -----
 .../apache/cayenne/CayenneContextGraphManager.java | 386 ------------
 .../apache/cayenne/CayenneContextMergeHandler.java | 273 ---------
 .../apache/cayenne/CayenneContextQueryAction.java  | 186 ------
 .../configuration/rop/server/ROPServerModule.java  |  68 ---
 .../rop/server/ROPServerModuleProvider.java        |  48 --
 .../apache/cayenne/remote/BootstrapMessage.java    |  36 --
 .../org/apache/cayenne/remote/ClientMessage.java   |  31 -
 .../apache/cayenne/remote/IncrementalQuery.java    |  73 ---
 .../cayenne/remote/IncrementalSelectQuery.java     | 234 -------
 .../org/apache/cayenne/remote/QueryMessage.java    |  55 --
 .../java/org/apache/cayenne/remote/RangeQuery.java | 156 -----
 .../cayenne/remote/RemoteIncrementalFaultList.java | 669 --------------------
 .../org/apache/cayenne/remote/RemoteService.java   |  54 --
 .../org/apache/cayenne/remote/RemoteSession.java   | 154 -----
 .../org/apache/cayenne/remote/SyncMessage.java     |  91 ---
 .../remote/hessian/CayenneSerializerFactory.java   |  43 --
 .../cayenne/remote/hessian/HessianConfig.java      | 152 -----
 .../remote/hessian/service/HessianService.java     |  64 --
 .../hessian/service/ServerDataRowSerializer.java   |  56 --
 .../ServerPersistentObjectListSerializer.java      |  50 --
 .../hessian/service/ServerSerializerFactory.java   |  71 ---
 .../cayenne/remote/service/BaseRemoteService.java  | 197 ------
 .../cayenne/remote/service/DispatchHelper.java     |  49 --
 .../cayenne/remote/service/HttpRemoteService.java  | 134 ----
 .../remote/service/MissingSessionException.java    |  38 --
 .../cayenne/remote/service/ServerSession.java      |  49 --
 .../rop/HessianROPSerializationService.java        |  69 ---
 .../java/org/apache/cayenne/rop/ROPConstants.java  |  33 -
 .../org/apache/cayenne/rop/ROPRequestContext.java  | 107 ----
 .../cayenne/rop/ROPSerializationService.java       |  39 --
 .../java/org/apache/cayenne/rop/ROPServlet.java    | 136 -----
 .../ServerHessianSerializationServiceProvider.java |  59 --
 .../cayenne/rop/ServerHttpRemoteService.java       |  47 --
 ...onfiguration.server.CayenneServerModuleProvider |  20 -
 .../cayenne/CayenneContextGraphManagerTest.java    |  67 --
 .../configuration/rop/server/MockModule1.java      |  30 -
 .../configuration/rop/server/MockModule2.java      |  32 -
 .../rop/server/MockRequestHandler.java             |  35 --
 .../rop/server/ROPHessianServlet_ConfigModule.java |  38 --
 .../rop/server/ROPServerModuleProviderTest.java    |  34 --
 .../configuration/rop/server/ROPServletTest.java   | 194 ------
 .../apache/cayenne/remote/MockRemoteService.java   |  40 --
 .../apache/cayenne/remote/RemoteSessionTest.java   |  58 --
 .../cayenne/remote/hessian/HessianConfigTest.java  |  61 --
 .../hessian/MockAbstractSerializerFactory.java     |  51 --
 .../remote/hessian/service/HessianServiceTest.java |  73 ---
 .../remote/service/BaseRemoteServiceTest.java      | 142 -----
 .../cayenne/remote/service/DispatchHelperTest.java |  54 --
 .../service/MockUnserializableException.java       |  24 -
 .../cayenne/access/ClientReturnDiffFilter.java     | 138 -----
 .../apache/cayenne/access/ClientServerChannel.java |  81 ---
 .../access/ClientServerChannelQueryAction.java     | 274 ---------
 .../apache/cayenne/configuration/Constants.java    |  15 -
 .../configuration/xml/ObjEntityHandler.java        |   3 -
 .../apache/cayenne/map/ClientEntityResolver.java   |  64 --
 .../org/apache/cayenne/map/ClientObjAttribute.java |  70 ---
 .../org/apache/cayenne/map/ClientObjEntity.java    |  58 --
 .../apache/cayenne/map/ClientObjRelationship.java  |  74 ---
 .../main/java/org/apache/cayenne/map/DataMap.java  | 120 ----
 .../org/apache/cayenne/map/EntityResolver.java     |  67 --
 .../java/org/apache/cayenne/map/ObjAttribute.java  |  29 -
 .../java/org/apache/cayenne/map/ObjEntity.java     | 147 +----
 .../org/apache/cayenne/map/ObjRelationship.java    |  21 -
 .../cayenne/map/SyntheticPKObjAttribute.java       |  19 -
 .../apache/cayenne/query/BaseQueryMetadata.java    |   2 +-
 .../java/org/apache/cayenne/query/SelectById.java  |   2 +-
 .../cayenne/query/ToCacheKeyTraversalHandler.java  |   2 -
 .../apache/cayenne/util/ObjectDetachOperation.java | 205 -------
 .../configuration/xml/ObjEntityHandlerTest.java    |  11 +-
 .../configuration/xml/XMLDataMapLoaderTest.java    |   2 -
 .../apache/cayenne/map/ClientEntityResolverIT.java | 103 ----
 .../cayenne/map/ClientObjectRelationshipTest.java  |  48 --
 .../java/org/apache/cayenne/map/DataMapTest.java   |  39 --
 .../org/apache/cayenne/map/ObjAttributeTest.java   |  11 -
 .../java/org/apache/cayenne/map/ObjEntityIT.java   |  83 ---
 .../org/apache/cayenne/map/ObjRelationshipIT.java  |  21 -
 .../docs/asciidoc/_cayenne-guide/part1/setup.adoc  |   6 +-
 .../src/docs/asciidoc/_cayenne-guide/part3.adoc    |  27 -
 .../asciidoc/_cayenne-guide/part3/clientImpl.adoc  |  16 -
 .../asciidoc/_cayenne-guide/part3/limitations.adoc |  18 -
 .../docs/asciidoc/_cayenne-guide/part3/rop.adoc    |  54 --
 .../_cayenne-guide/part3/ropDeployment.adoc        |  42 --
 .../asciidoc/_cayenne-guide/part3/ropSetup.adoc    |  20 -
 .../asciidoc/_cayenne-guide/part3/serverImpl.adoc  |  16 -
 .../src/docs/asciidoc/cayenne-guide.adoc           |   3 -
 docs/asciidoc/getting-started-rop/pom.xml          | 122 ----
 .../docs/asciidoc/_getting-started-rop/header.html |  24 -
 .../docs/asciidoc/_getting-started-rop/part1.adoc  |  17 -
 .../_getting-started-rop/part1/prerequisites.adoc  |  25 -
 .../docs/asciidoc/_getting-started-rop/part2.adoc  |  23 -
 .../_getting-started-rop/part2/adding.adoc         | 139 -----
 .../_getting-started-rop/part2/connect.adoc        | 188 ------
 .../_getting-started-rop/part2/hessianWebServ.adoc | 137 -----
 .../_getting-started-rop/part2/starting.adoc       | 109 ----
 .../docs/asciidoc/_getting-started-rop/var.adoc    |  15 -
 .../src/docs/asciidoc/getting-started-rop.adoc     |  45 --
 .../docs/asciidoc/images/datamap-enableclient.png  | Bin 98756 -> 0 bytes
 docs/asciidoc/pom.xml                              |   1 -
 docs/doc/pom.xml                                   |   5 -
 .../apache/cayenne/tools/CayenneGeneratorMojo.java |  19 +-
 .../tools/CayenneGeneratorIntegrationTest.java     |  10 -
 .../cayenne/modeler/CodeTemplateManager.java       |  41 --
 .../modeler/action/CreateObjEntityAction.java      |   5 -
 .../dialog/datamap/PackageUpdateController.java    |  23 +-
 .../dialog/datamap/SuperclassUpdateController.java |  16 +-
 .../modeler/dialog/objentity/ClassNameUpdater.java |  68 +--
 .../dialog/objentity/ClassNameUpdaterView.java     |   8 -
 .../apache/cayenne/modeler/editor/DataMapView.java | 147 +----
 .../cayenne/modeler/editor/ObjEntityTab.java       |  93 +--
 .../editor/cgen/ClassGenerationValidator.java      |  15 +-
 .../modeler/editor/cgen/ClientModeController.java  |  49 --
 .../editor/cgen/CodeGeneratorController.java       |   6 +-
 .../modeler/editor/cgen/CustomModeController.java  |  61 +-
 .../modeler/editor/cgen/CustomModePanel.java       |  21 +-
 .../editor/cgen/GeneratorTabController.java        |   8 +-
 .../editor/cgen/StandardModeController.java        |   1 -
 .../editor/cgen/domain/CgenTabController.java      |   2 +-
 .../cayenne/modeler/pref/DataMapDefaults.java      |   5 +-
 .../apache/cayenne/wocompat/EOModelProcessor.java  |   7 +-
 pom.xml                                            |  10 -
 tutorials/pom.xml                                  |   4 -
 tutorials/tutorial-rop-client-http2/pom.xml        |  50 --
 .../org/apache/cayenne/tutorial/Http2Client.java   | 127 ----
 .../cayenne/tutorial/persistent/client/Artist.java |  31 -
 .../tutorial/persistent/client/Gallery.java        |  31 -
 .../tutorial/persistent/client/Painting.java       |  31 -
 .../tutorial/persistent/client/auto/_Artist.java   |  93 ---
 .../tutorial/persistent/client/auto/_Gallery.java  |  72 ---
 .../tutorial/persistent/client/auto/_Painting.java |  86 ---
 .../src/main/resources/keystore                    | Bin 3697 -> 0 bytes
 tutorials/tutorial-rop-client/pom.xml              |  57 --
 .../cayenne/tutorial/persistent/client/Artist.java |  28 -
 .../tutorial/persistent/client/Datamap.java        |  36 --
 .../tutorial/persistent/client/Gallery.java        |  28 -
 .../cayenne/tutorial/persistent/client/Main.java   |  98 ---
 .../tutorial/persistent/client/Painting.java       |  28 -
 .../tutorial/persistent/client/auto/_Artist.java   |  93 ---
 .../tutorial/persistent/client/auto/_Datamap.java  |  12 -
 .../tutorial/persistent/client/auto/_Gallery.java  |  72 ---
 .../tutorial/persistent/client/auto/_Painting.java |  86 ---
 .../src/main/resources/.gitignore                  |   0
 .../tutorial-rop-client/src/test/java/.gitignore   |   0
 .../src/test/resources/.gitignore                  |   0
 tutorials/tutorial-rop-server-http2/pom.xml        |  73 ---
 .../apache/cayenne/tutorial/Http2ROPServlet.java   |  66 --
 .../org/apache/cayenne/tutorial/Http2Server.java   | 114 ----
 .../apache/cayenne/tutorial/persistent/Artist.java |  28 -
 .../cayenne/tutorial/persistent/Gallery.java       |  28 -
 .../cayenne/tutorial/persistent/Painting.java      |  28 -
 .../cayenne/tutorial/persistent/auto/_Artist.java  | 133 ----
 .../cayenne/tutorial/persistent/auto/_Gallery.java | 112 ----
 .../tutorial/persistent/auto/_Painting.java        | 124 ----
 .../cayenne/tutorial/persistent/client/Artist.java |  31 -
 .../tutorial/persistent/client/Gallery.java        |  31 -
 .../tutorial/persistent/client/Painting.java       |  31 -
 .../tutorial/persistent/client/auto/_Artist.java   |  93 ---
 .../tutorial/persistent/client/auto/_Gallery.java  |  72 ---
 .../tutorial/persistent/client/auto/_Painting.java |  84 ---
 .../src/main/resources/cayenne-project.xml         |  18 -
 .../src/main/resources/datamap.map.xml             |  50 --
 .../src/main/resources/keystore                    | Bin 3697 -> 0 bytes
 tutorials/tutorial-rop-server/pom.xml              |  76 ---
 tutorials/tutorial-rop-server/realm.properties     |  16 -
 .../apache/cayenne/tutorial/persistent/Artist.java |  50 --
 .../cayenne/tutorial/persistent/Datamap.java       |  36 --
 .../cayenne/tutorial/persistent/Gallery.java       |  25 -
 .../cayenne/tutorial/persistent/Painting.java      |  25 -
 .../cayenne/tutorial/persistent/auto/_Artist.java  | 133 ----
 .../cayenne/tutorial/persistent/auto/_Datamap.java |  12 -
 .../cayenne/tutorial/persistent/auto/_Gallery.java | 112 ----
 .../tutorial/persistent/auto/_Painting.java        | 124 ----
 .../cayenne/tutorial/persistent/client/Artist.java |  28 -
 .../tutorial/persistent/client/Datamap.java        |  36 --
 .../tutorial/persistent/client/Gallery.java        |  28 -
 .../tutorial/persistent/client/Painting.java       |  28 -
 .../tutorial/persistent/client/auto/_Artist.java   |  93 ---
 .../tutorial/persistent/client/auto/_Datamap.java  |  12 -
 .../tutorial/persistent/client/auto/_Gallery.java  |  72 ---
 .../tutorial/persistent/client/auto/_Painting.java |  84 ---
 .../src/main/resources/cayenne-project.xml         |  18 -
 .../src/main/resources/datamap.map.xml             |  50 --
 .../src/main/webapp/META-INF/context.xml           |  23 -
 .../src/main/webapp/WEB-INF/web.xml                |  53 --
 .../tutorial-rop-server/src/test/java/.gitignore   |   0
 .../src/test/resources/.gitignore                  |   0
 372 files changed, 119 insertions(+), 28645 deletions(-)
 delete mode 100644 cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
 delete mode 100644 cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
 delete mode 100644 cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientEntityArtifact.java
 delete mode 100644 cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClientSuperClassGenerationTest.java
 delete mode 100644 cayenne-client-jetty/pom.xml
 delete mode 100644 cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/ClientJettyHttp2Module.java
 delete mode 100644 cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/ClientJettyHttpModule.java
 delete mode 100644 cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/JettyClientModuleProvider.java
 delete mode 100644 cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/JettyHttp2ClientConnectionProvider.java
 delete mode 100644 cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/JettyHttpClientConnectionProvider.java
 delete mode 100644 cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/http/JettyHttpROPConnector.java
 delete mode 100644 cayenne-client-jetty/src/main/resources/META-INF/services/org.apache.cayenne.configuration.rop.client.CayenneClientModuleProvider
 delete mode 100644 cayenne-client-jetty/src/test/java/org/apache/cayenne/configuration/rop/client/JettyModuleProviderTest.java
 delete mode 100644 cayenne-client-jetty/src/test/java/org/apache/cayenne/rop/http/JettyHttpROPConnectorIT.java
 delete mode 100644 cayenne-client-jetty/src/test/java/org/apache/cayenne/util/Http2TestServer.java
 delete mode 100644 cayenne-client/pom.xml
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/CayenneClientModuleProvider.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/CayenneContextFactory.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientChannelProvider.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientConstants.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientRuntime.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeBuilder.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/LocalClientServerChannelProvider.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/LocalConnectionProvider.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/MainCayenneClientModuleProvider.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/remote/BaseConnection.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/remote/ClientChannel.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/remote/ClientConnection.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/ClientSerializerFactory.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/DataRowDeserializer.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/service/HessianUtil.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/remote/package.html
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/remote/service/LocalConnection.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/rop/HttpClientConnection.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/rop/HttpClientConnectionProvider.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/rop/ProxyRemoteService.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/rop/ROPConnector.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/rop/ROPUtil.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/rop/http/ClientHessianSerializationServiceProvider.java
 delete mode 100644 cayenne-client/src/main/java/org/apache/cayenne/rop/http/HttpROPConnector.java
 delete mode 100644 cayenne-client/src/main/resources/META-INF/services/org.apache.cayenne.configuration.rop.client.CayenneClientModuleProvider
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMeaningfulPKIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextReflexiveIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/DataRowTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextTooneIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/ObjectContextChangeLogTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/ObjectIdTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/PersistentObjectInContextIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/access/ClientServerChannelIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/access/ClientServerChannelQueryIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/access/types/EnumTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/cay_2641/Cay2641IT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientLocalRuntimeTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientModuleTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeBuilderTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/MainCayenneClientModuleProviderTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/event/EventSubjectTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/graph/NodeDiffTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/map/ClientEntityResolverTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/map/ClientObjectRelationshipTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/map/DataMapTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/map/DbEntityTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/map/EntityTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/query/ClientExpressionIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/query/ClientObjectSelectIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/query/ClientSelectQueryExpressionIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/query/ObjectIdQueryTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/query/PrefetchTreeNodeTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/query/RefreshQueryTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/query/RelationshipQueryTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/query/SQLTemplateTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/query/SelectById_IT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/query/SelectQueryAbstractEntityIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/CayenneContextDeletionIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/ClientChannelServerDiffsIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/ClientChannelServerDiffsListener1.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/ClientChannelTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/LocalConnectionTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/MockClientConnection.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/NestedObjectContextLocalIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/NestedObjectContextParentEventsIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/NestedObjectContextPeerEventsIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/NestedObjectContextRollbackIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/ROPPrefetchToManyMapIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/RelationshipChangeIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteCallbacksIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteCayenneCase.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteIncrementalFaultListIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/RemoteRollbackIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/SyncMessageTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/remote/ValueInjectorIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/rop/http/HessianROPSerializationServiceIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/UnitLocalConnection.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCase.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseCayenneContextProvider.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseClientConnectionProvider.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseContextsSync.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseLifecycleManager.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseModule.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseObjectContextProvider.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseProperties.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientCaseSelfIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientRuntimeProperty.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientRuntimeProvider.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientRuntimeProviderContextsSync.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientServerChannelProvider.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientServerDataChannelDecorator.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/ClientServerDataChannelInterceptor.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/unit/di/client/InterceptingClientServerChannelProvider.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/util/GenericResponseTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/util/ListResponseTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/util/ObjectDetachOperationIT.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/util/PersistentObjectListTest.java
 delete mode 100644 cayenne-client/src/test/java/org/apache/cayenne/util/ShallowMergeOperation_ClientIT.java
 delete mode 100644 cayenne-protostuff/pom.xml
 delete mode 100644 cayenne-protostuff/src/main/java/org/apache/cayenne/ObjectContextChangeLogSubListMessageFactory.java
 delete mode 100644 cayenne-protostuff/src/main/java/org/apache/cayenne/configuration/ProtostuffServerModuleProvider.java
 delete mode 100644 cayenne-protostuff/src/main/java/org/apache/cayenne/configuration/rop/client/ProtostuffClientModuleProvider.java
 delete mode 100644 cayenne-protostuff/src/main/java/org/apache/cayenne/configuration/rop/client/ProtostuffModule.java
 delete mode 100644 cayenne-protostuff/src/main/java/org/apache/cayenne/query/PrefetchTreeNodeSchema.java
 delete mode 100644 cayenne-protostuff/src/main/java/org/apache/cayenne/rop/protostuff/ProtostuffROPSerializationService.java
 delete mode 100644 cayenne-protostuff/src/main/java/org/apache/cayenne/rop/protostuff/Wrapper.java
 delete mode 100644 cayenne-protostuff/src/main/resources/META-INF/services/org.apache.cayenne.configuration.rop.client.CayenneClientModuleProvider
 delete mode 100644 cayenne-protostuff/src/main/resources/META-INF/services/org.apache.cayenne.configuration.server.CayenneServerModuleProvider
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/ObjectContextChangeLogSubListMessageFactoryTest.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/configuration/rop/client/ProtostuffModuleProviderTest.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/query/PrefetchTreeNodeSchemaTest.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/remote/service/ProtostuffLocalConnection.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/remote/service/ProtostuffLocalConnectionProvider.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/ProtostuffPersistentObjectCollectionsTest.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/ProtostuffProperties.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/ProtostuffROPSerializationServiceIT.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/ProtostuffROPSerializationTest.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/RuntimeBase.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/persistent/ClientMtTable1.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/persistent/ClientMtTable2.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/persistent/MtTable1.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/persistent/MtTable2.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/persistent/auto/_ClientMtTable1.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/persistent/auto/_ClientMtTable2.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/persistent/auto/_MtTable1.java
 delete mode 100644 cayenne-protostuff/src/test/java/org/apache/cayenne/rop/protostuff/persistent/auto/_MtTable2.java
 delete mode 100644 cayenne-protostuff/src/test/resources/cayenne-protostuff.xml
 delete mode 100644 cayenne-protostuff/src/test/resources/protostuff.map.xml
 delete mode 100644 cayenne-rop-server/pom.xml
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/CayenneContext.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/CayenneContextChildDiffLoader.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/CayenneContextGraphManager.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/CayenneContextMergeHandler.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/CayenneContextQueryAction.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/configuration/rop/server/ROPServerModule.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/configuration/rop/server/ROPServerModuleProvider.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/BootstrapMessage.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/ClientMessage.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/IncrementalQuery.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/IncrementalSelectQuery.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/QueryMessage.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/RangeQuery.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/RemoteIncrementalFaultList.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/RemoteService.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/RemoteSession.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/SyncMessage.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/hessian/CayenneSerializerFactory.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/hessian/HessianConfig.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/hessian/service/HessianService.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/hessian/service/ServerDataRowSerializer.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/hessian/service/ServerPersistentObjectListSerializer.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/hessian/service/ServerSerializerFactory.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/service/BaseRemoteService.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/service/DispatchHelper.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/service/HttpRemoteService.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/service/MissingSessionException.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/remote/service/ServerSession.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/rop/HessianROPSerializationService.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/rop/ROPConstants.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/rop/ROPRequestContext.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/rop/ROPSerializationService.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/rop/ROPServlet.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/rop/ServerHessianSerializationServiceProvider.java
 delete mode 100644 cayenne-rop-server/src/main/java/org/apache/cayenne/rop/ServerHttpRemoteService.java
 delete mode 100644 cayenne-rop-server/src/main/resources/META-INF/services/org.apache.cayenne.configuration.server.CayenneServerModuleProvider
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/CayenneContextGraphManagerTest.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/configuration/rop/server/MockModule1.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/configuration/rop/server/MockModule2.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/configuration/rop/server/MockRequestHandler.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/configuration/rop/server/ROPHessianServlet_ConfigModule.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/configuration/rop/server/ROPServerModuleProviderTest.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/configuration/rop/server/ROPServletTest.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/remote/MockRemoteService.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/remote/RemoteSessionTest.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/remote/hessian/HessianConfigTest.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/remote/hessian/MockAbstractSerializerFactory.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/remote/hessian/service/HessianServiceTest.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/remote/service/BaseRemoteServiceTest.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/remote/service/DispatchHelperTest.java
 delete mode 100644 cayenne-rop-server/src/test/java/org/apache/cayenne/remote/service/MockUnserializableException.java
 delete mode 100644 cayenne-server/src/main/java/org/apache/cayenne/access/ClientReturnDiffFilter.java
 delete mode 100644 cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannel.java
 delete mode 100644 cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
 delete mode 100644 cayenne-server/src/main/java/org/apache/cayenne/map/ClientEntityResolver.java
 delete mode 100644 cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjAttribute.java
 delete mode 100644 cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjEntity.java
 delete mode 100644 cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjRelationship.java
 delete mode 100644 cayenne-server/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java
 delete mode 100644 cayenne-server/src/test/java/org/apache/cayenne/map/ClientEntityResolverIT.java
 delete mode 100644 cayenne-server/src/test/java/org/apache/cayenne/map/ClientObjectRelationshipTest.java
 delete mode 100644 docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3.adoc
 delete mode 100644 docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/clientImpl.adoc
 delete mode 100644 docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/limitations.adoc
 delete mode 100644 docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/rop.adoc
 delete mode 100644 docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/ropDeployment.adoc
 delete mode 100644 docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/ropSetup.adoc
 delete mode 100644 docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/serverImpl.adoc
 delete mode 100644 docs/asciidoc/getting-started-rop/pom.xml
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/header.html
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part1.adoc
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part1/prerequisites.adoc
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2.adoc
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/adding.adoc
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/connect.adoc
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/hessianWebServ.adoc
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/starting.adoc
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/var.adoc
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/getting-started-rop.adoc
 delete mode 100644 docs/asciidoc/getting-started-rop/src/docs/asciidoc/images/datamap-enableclient.png
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
 delete mode 100644 tutorials/tutorial-rop-client-http2/pom.xml
 delete mode 100644 tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/Http2Client.java
 delete mode 100644 tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
 delete mode 100644 tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
 delete mode 100644 tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
 delete mode 100644 tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
 delete mode 100644 tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
 delete mode 100644 tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
 delete mode 100644 tutorials/tutorial-rop-client-http2/src/main/resources/keystore
 delete mode 100644 tutorials/tutorial-rop-client/pom.xml
 delete mode 100644 tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
 delete mode 100644 tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Datamap.java
 delete mode 100644 tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
 delete mode 100644 tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Main.java
 delete mode 100644 tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
 delete mode 100644 tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
 delete mode 100644 tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Datamap.java
 delete mode 100644 tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
 delete mode 100644 tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
 delete mode 100644 tutorials/tutorial-rop-client/src/main/resources/.gitignore
 delete mode 100644 tutorials/tutorial-rop-client/src/test/java/.gitignore
 delete mode 100644 tutorials/tutorial-rop-client/src/test/resources/.gitignore
 delete mode 100644 tutorials/tutorial-rop-server-http2/pom.xml
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/Http2ROPServlet.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/Http2Server.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Artist.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Gallery.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Painting.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Artist.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Gallery.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Painting.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/resources/cayenne-project.xml
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/resources/datamap.map.xml
 delete mode 100644 tutorials/tutorial-rop-server-http2/src/main/resources/keystore
 delete mode 100644 tutorials/tutorial-rop-server/pom.xml
 delete mode 100644 tutorials/tutorial-rop-server/realm.properties
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Artist.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Datamap.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Gallery.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Painting.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Artist.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Datamap.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Gallery.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Painting.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Datamap.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Datamap.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
 delete mode 100644 tutorials/tutorial-rop-server/src/main/resources/cayenne-project.xml
 delete mode 100644 tutorials/tutorial-rop-server/src/main/resources/datamap.map.xml
 delete mode 100644 tutorials/tutorial-rop-server/src/main/webapp/META-INF/context.xml
 delete mode 100644 tutorials/tutorial-rop-server/src/main/webapp/WEB-INF/web.xml
 delete mode 100644 tutorials/tutorial-rop-server/src/test/java/.gitignore
 delete mode 100644 tutorials/tutorial-rop-server/src/test/resources/.gitignore


[cayenne] 02/05: CAY-2744 Remove ROP support - delete ROP-related documentation

Posted by nt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 220c4b42776bcc739cbd7eb057b8249350127aa1
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Jul 7 18:24:47 2022 +0300

    CAY-2744 Remove ROP support
     - delete ROP-related documentation
---
 .../docs/asciidoc/_cayenne-guide/part1/setup.adoc  |   6 +-
 .../src/docs/asciidoc/_cayenne-guide/part3.adoc    |  27 ---
 .../asciidoc/_cayenne-guide/part3/clientImpl.adoc  |  16 --
 .../asciidoc/_cayenne-guide/part3/limitations.adoc |  18 --
 .../docs/asciidoc/_cayenne-guide/part3/rop.adoc    |  54 ------
 .../_cayenne-guide/part3/ropDeployment.adoc        |  42 -----
 .../asciidoc/_cayenne-guide/part3/ropSetup.adoc    |  20 ---
 .../asciidoc/_cayenne-guide/part3/serverImpl.adoc  |  16 --
 .../src/docs/asciidoc/cayenne-guide.adoc           |   3 -
 docs/asciidoc/getting-started-rop/pom.xml          | 122 -------------
 .../docs/asciidoc/_getting-started-rop/header.html |  24 ---
 .../docs/asciidoc/_getting-started-rop/part1.adoc  |  17 --
 .../_getting-started-rop/part1/prerequisites.adoc  |  25 ---
 .../docs/asciidoc/_getting-started-rop/part2.adoc  |  23 ---
 .../_getting-started-rop/part2/adding.adoc         | 139 ---------------
 .../_getting-started-rop/part2/connect.adoc        | 188 ---------------------
 .../_getting-started-rop/part2/hessianWebServ.adoc | 137 ---------------
 .../_getting-started-rop/part2/starting.adoc       | 109 ------------
 .../docs/asciidoc/_getting-started-rop/var.adoc    |  15 --
 .../src/docs/asciidoc/getting-started-rop.adoc     |  45 -----
 .../docs/asciidoc/images/datamap-enableclient.png  | Bin 98756 -> 0 bytes
 docs/asciidoc/pom.xml                              |   1 -
 22 files changed, 5 insertions(+), 1042 deletions(-)

diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part1/setup.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part1/setup.adoc
index 895dc75c1..6555da65b 100644
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part1/setup.adoc
+++ b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part1/setup.adoc
@@ -26,12 +26,16 @@ include::../var.adoc[]
 |===
 |Cayenne Version |Java Version |Status
 
+|4.3
+|Java 11 or newer
+|Development
+
 |4.2
 |Java 1.8 or newer
 |Release Candidate
 
 |4.1
-|Java 1.8 or newer
+|Java 1.8 -- Java 17
 |Stable
 
 |4.0
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3.adoc
deleted file mode 100644
index 274789d7e..000000000
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3.adoc
+++ /dev/null
@@ -1,27 +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
-//
-// https://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.
-
-[#rop]
-== Cayenne Framework - Remote Object Persistence
-
-include::part3/rop.adoc[]
-
-include::part3/ropDeployment.adoc[]
-
-// TODO: add content to these files:
-//include::part3/ropSetup.adoc[]
-//include::part3/serverImpl.adoc[]
-//include::part3/clientImpl.adoc[]
-//include::part3/limitations.adoc[]
-
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/clientImpl.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/clientImpl.adoc
deleted file mode 100644
index 2260affc6..000000000
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/clientImpl.adoc
+++ /dev/null
@@ -1,16 +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
-//
-// https://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.
-
-=== Implementing ROP Client
-
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/limitations.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/limitations.adoc
deleted file mode 100644
index bfe87ac8c..000000000
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/limitations.adoc
+++ /dev/null
@@ -1,18 +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
-//
-// https://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.
-
-=== Current Limitations
-
-
-
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/rop.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/rop.adoc
deleted file mode 100644
index 083ca1863..000000000
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/rop.adoc
+++ /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
-//
-// https://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.
-
-[[introduction-to-rop]]
-=== Introduction to ROP
-
-==== What is ROP
-
-"Remote Object Persistence" is a low-overhead web services-based technology that provides lightweight object persistence and query functionality to 'remote' applications. In other words it provides familiar Cayenne API to applications that do not have direct access to the database. Instead such applications would access Cayenne Web Service (CWS). A single abstract data model (expressed as Cayenne XML DataMap) is used on the server and on the client, while execution logic can be partition [...]
-
-image::../images/remote-object-persistence.jpg[align="center"]
-
-Persistence stack above consists of the following parts:
-
-- ORM Tier: a server-side Cayenne Java application that directly connects to the database via JDBC.
-
-- CWS (Cayenne Web Service): A wrapper around an ORM tier that makes it accessible to remote CWS clients.
-
-- Remote Tier (aka Client Tier): A Java application that has no direct DB connection and persists its objects by connecting to remote Cayenne Web Service (CWS). Note that CWS Client doesn't have to be a desktop application. It can be another server-side application. The word "client" means a client of Cayenne Web Service.
-
-==== Main Features
-
-- Unified approach to lightweight object persistence across multiple tiers of a distributed system.
-
-- Same abstract object model on the server and on the client.
-
-- Client can "bootstrap" from the server by dynamically loading persistence metadata.
-
-- An ability to define client objects differently than the server ones, and still have seamless persistence.
-
-- Generic web service interface that doesn't change when object model changes.
-
-- An ability to work in two modes: dedicated session mode or shared ("chat") mode when multiple remote clients collaboratively work on the same data.
-
-- Lazy object and collection faulting.
-
-- Full context lifecycle
-
-- Queries, expressions, local query caching, paginated queries.
-
-- Validation
-
-- Delete Rules
\ No newline at end of file
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/ropDeployment.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/ropDeployment.adoc
deleted file mode 100644
index b443544ac..000000000
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/ropDeployment.adoc
+++ /dev/null
@@ -1,42 +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
-//
-// https://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.
-
-=== ROP Deployment
-
-==== Server Security Note
-
-Recent versions of Tomcat and Jetty containers (e.g. Tomcat 6 and 7, Jetty 8) contain code
-addressing a security concern related to "session fixation problem" by resetting the existing session ID of any request
-that requires BASIC authentication. If ROP service is protected with declarative security
-(see the ROP tutorial and the following chapters on security), this feature prevents the ROP client
-from attaching to its session, resulting in `MissingSessionExceptions`.
-
-To solve that you will need to either switch to an alternative security mechanism,
-or disable "session fixation problem" protections of the container.
-E.g. the later can be achieved in Tomcat 7 by adding the following `context.xml` file to the webapp's `META-INF/` directory:
-
-[source, XML]
-----
-<Context>
-    <Valve className="org.apache.catalina.authenticator.BasicAuthenticator"
-            changeSessionIdOnAuthentication="false" />
-</Context>
-----
-
-(The `<Valve>` tag can also be placed within the `<Context>` in any other locations used by Tomcat to load context configurations)
-
-//==== Deploying ROP Client
-
-//==== Security
-
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/ropSetup.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/ropSetup.adoc
deleted file mode 100644
index ff2a6bdea..000000000
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/ropSetup.adoc
+++ /dev/null
@@ -1,20 +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
-//
-// https://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.
-
-=== Implementing ROP Client
-
-==== System Requirements
-
-==== Jar Files and Dependencies
-
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/serverImpl.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/serverImpl.adoc
deleted file mode 100644
index f9ace4e38..000000000
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part3/serverImpl.adoc
+++ /dev/null
@@ -1,16 +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
-//
-// https://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.
-
-=== Implementing ROP Server
-
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/cayenne-guide.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/cayenne-guide.adoc
index ef689ee4c..6ffabfd28 100644
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/cayenne-guide.adoc
+++ b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/cayenne-guide.adoc
@@ -47,9 +47,6 @@ include::_cayenne-guide/part5.adoc[]
 
 include::_cayenne-guide/part6.adoc[]
 
-// move ROP docs down
-include::_cayenne-guide/part3.adoc[]
-
 include::_cayenne-guide/configurationProperties.adoc[]
 
 include::_cayenne-guide/serviceCollections.adoc[]
diff --git a/docs/asciidoc/getting-started-rop/pom.xml b/docs/asciidoc/getting-started-rop/pom.xml
deleted file mode 100644
index 70358d011..000000000
--- a/docs/asciidoc/getting-started-rop/pom.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-	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
-
-	https://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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>cayenne-asciidoc-parent</artifactId>
-        <groupId>org.apache.cayenne.docs</groupId>
-        <version>4.3.M1-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>getting-started-rop</artifactId>
-
-    <packaging>jar</packaging>
-    <name>${project.artifactId}: AsciiDoc - Getting Started with Cayenne ROP (Remote Object Persistence)</name>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.asciidoctor</groupId>
-                <artifactId>asciidoctor-maven-plugin</artifactId>
-                <dependencies>
-                    <dependency>
-                        <groupId>org.apache.cayenne.docs</groupId>
-                        <artifactId>cayenne-asciidoc-extension</artifactId>
-                        <version>${project.version}</version>
-                    </dependency>
-                </dependencies>
-
-                <executions>
-                    <!-- generate "embeddable" html content with front matter and without header/footer/styles -->
-                    <execution>
-                        <id>asciidoctor-html-web</id>
-                        <phase>generate-resources</phase>
-                        <goals>
-                            <goal>process-asciidoc</goal>
-                        </goals>
-                        <configuration>
-                            <backend>html5</backend>
-                            <headerFooter>false</headerFooter> <!-- do not generate header and footer -->
-                            <outputDirectory>${project.build.directory}/tmp/</outputDirectory>
-                            <extensions>
-                                <extension>
-                                    <className>org.apache.cayenne.asciidoc.CayennePostProcessor</className>
-                                </extension>
-                            </extensions>
-                            <attributes>
-                                <toc>auto</toc>
-                            </attributes>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-    <profiles>
-        <profile>
-            <id>assembly</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.asciidoctor</groupId>
-                        <artifactId>asciidoctor-maven-plugin</artifactId>
-                        <executions>
-                            <!-- generate standalone html help -->
-                            <execution>
-                                <id>asciidoctor-html-standalone</id>
-                                <phase>${build.docs}</phase>
-                                <goals>
-                                    <goal>process-asciidoc</goal>
-                                </goals>
-                                <configuration>
-                                    <backend>html5</backend>
-                                    <sourceHighlighter>coderay</sourceHighlighter>
-                                    <embedAssets>true</embedAssets>
-                                    <attributes>
-                                        <toc>left</toc>
-                                    </attributes>
-                                </configuration>
-                            </execution>
-
-                            <!-- generate PDF -->
-                            <execution>
-                                <id>generate-pdf-doc</id>
-                                <phase>${build.docs}</phase>
-                                <goals>
-                                    <goal>process-asciidoc</goal>
-                                </goals>
-                                <configuration>
-                                    <backend>pdf</backend>
-                                    <sourceHighlighter>coderay</sourceHighlighter>
-                                    <attributes>
-                                        <pagenums />
-                                        <toc />
-                                    </attributes>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-
-</project>
\ No newline at end of file
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/header.html b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/header.html
deleted file mode 100644
index 1c90b0a91..000000000
--- a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/header.html
+++ /dev/null
@@ -1,24 +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
-#
-#    https://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.
-
-title: "Cayenne Getting Started ROP"
-description: "Tutorial how to quick start new Cayenne ROP project"
-cayenneVersion: "4.2"
-docsMenuTitle: "Getting Started ROP"
-weight: 40
----
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part1.adoc b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part1.adoc
deleted file mode 100644
index 9fb6c132d..000000000
--- a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part1.adoc
+++ /dev/null
@@ -1,17 +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
-//
-// https://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.
-
-== Prerequisites
-
-include::part1/prerequisites.adoc[]
\ No newline at end of file
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part1/prerequisites.adoc b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part1/prerequisites.adoc
deleted file mode 100644
index 9327bda0f..000000000
--- a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part1/prerequisites.adoc
+++ /dev/null
@@ -1,25 +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
-//
-// https://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.
-
-=== Prerequisites
-
-This tutorial starts where "Getting Started with Cayenne" left off. If you have gone through the previous tutorial, and have the "tutorial" project open in Eclipse, you can go directly to the next step. If not, here are the compressed instructions to prepare you for work with ROP:
-
-* Step 1 - Eclipse Setup
-* Step 2 - Create a project
-* Step 3 - Create Cayenne OR Mapping
-* Step 4 - Create Java Classes
-* Step 5 - Convert the project to webapp.
-
-Note that at "Step 5" you can skip the JSP creation part. Just setup `web.xml` and `maven-jetty-plugin` in the POM.
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2.adoc b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2.adoc
deleted file mode 100644
index 263f84516..000000000
--- a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2.adoc
+++ /dev/null
@@ -1,23 +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
-//
-// https://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.
-
-== Remote Object Persistence Quick Start
-
-include::part2/starting.adoc[]
-
-include::part2/hessianWebServ.adoc[]
-
-include::part2/connect.adoc[]
-
-include::part2/adding.adoc[]
\ No newline at end of file
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/adding.adoc b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/adding.adoc
deleted file mode 100644
index 8b75e5c7a..000000000
--- a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/adding.adoc
+++ /dev/null
@@ -1,139 +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
-//
-// https://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.
-
-=== Adding BASIC Authentication
-
-You probably don't want everybody in the world to connect to your service and access (and update!) arbitrary data
-in the database. The first step in securing Cayenne service is implementing client authentication.
-The easiest way to do it is to delegate the authentication task to the web container that is running the service.
-HessianConnection used in the previous chapter supports BASIC authentication on the client side,
-so we'll demonstrate how to set it up here.
-
-==== Securing ROP Server Application
-
-Open web.xml file in the server project and setup security constraints with BASIC authentication for the ROP service:
-
-[source, XML]
-----
-<security-constraint>
-    <web-resource-collection>
-        <web-resource-name>CayenneService</web-resource-name>
-        <url-pattern>/cayenne-service</url-pattern>
-    </web-resource-collection>
-    <auth-constraint>
-        <role-name>cayenne-service-user</role-name>
-    </auth-constraint>
-</security-constraint>
-
-<login-config>
-    <auth-method>BASIC</auth-method>
-    <realm-name>Cayenne Realm</realm-name>
-</login-config>
-
-<security-role>
-    <role-name>cayenne-service-user</role-name>
-</security-role>
-----
-
-==== Configuring Jetty for BASIC Authentication
-
-NOTE: These instructions are specific to Jetty 6. Other containers (and versions of Jetty) will have different mechanisms
-to achieve the same thing.
-
-Open pom.xml in the server project and configure a "userRealm" for the Jetty plugin:
-
-[source, XML]
-----
-<plugin>
-    <groupId>org.eclipse.jetty</groupId>
-        <artifactId>maven-jetty-plugin</artifactId>
-        <version>9.4.8.v20171121</version>
-        <!-- adding configuration below: -->
-        <configuration>
-            <userRealms>
-                <userRealm implementation="org.eclipse.jetty.security.HashLoginService">
-                    <!-- this name must match the realm-name in web.xml -->
-                    <name>Cayenne Realm</name>
-                    <config>realm.properties</config>
-                </userRealm>
-            </userRealms>
-        </configuration>
-    </plugin>
-</plugins>
-----
-
-Now create a new file called `realm.properties` at the root of the server project and put user login/password in there:
-
-----
-cayenne-user: secret,cayenne-service-user
-----
-
-Now let's stop the server and start it again. Everything should start as before, but if you go to
-http://localhost:8080/tutorial/cayenne-service, your browser should pop up authentication dialog.
-Enter "cayenne-user/secret" for user name / password, and you should see "Hessian Requires POST" message.
-So the server is now secured.
-
-==== Running Client with Basic Authentication
-
-If you run the client without any changes, you'll get the following error:
-
-----
-Mar 01, 2016 7:25:50 PM org.apache.cayenne.rop.http.HttpROPConnector logConnect
-INFO: Connecting to [cayenne-user@http://localhost:8080/tutorial-rop-server/cayenne-service] - dedicated session.
-Mar 01, 2016 7:25:50 PM org.apache.cayenne.rop.HttpClientConnection connect
-INFO: Server returned HTTP response code: 401 for URL: http://localhost:8080/tutorial-rop-server/cayenne-service
-java.rmi.RemoteException: Server returned HTTP response code: 401 for URL: http://localhost:8080/tutorial-rop-server/cayenne-service
-	at org.apache.cayenne.rop.ProxyRemoteService.establishSession(ProxyRemoteService.java:45)
-	at org.apache.cayenne.rop.HttpClientConnection.connect(HttpClientConnection.java:85)
-	at org.apache.cayenne.rop.HttpClientConnection.getServerEventBridge(HttpClientConnection.java:68)
-	at org.apache.cayenne.remote.ClientChannel.setupRemoteChannelListener(ClientChannel.java:279)
-	at org.apache.cayenne.remote.ClientChannel.<init>(ClientChannel.java:71)
-	at org.apache.cayenne.configuration.rop.client.ClientChannelProvider.get(ClientChannelProvider.java:48)
-	at org.apache.cayenne.configuration.rop.client.ClientChannelProvider.get(ClientChannelProvider.java:31)
-	at org.apache.cayenne.di.spi.CustomProvidersProvider.get(CustomProvidersProvider.java:39)
-	at org.apache.cayenne.di.spi.FieldInjectingProvider.get(FieldInjectingProvider.java:43)
-	at org.apache.cayenne.di.spi.DefaultScopeProvider.get(DefaultScopeProvider.java:50)
-	at org.apache.cayenne.di.spi.DefaultInjector.getInstance(DefaultInjector.java:139)
-	at org.apache.cayenne.di.spi.FieldInjectingProvider.value(FieldInjectingProvider.java:105)
-	at org.apache.cayenne.di.spi.FieldInjectingProvider.injectMember(FieldInjectingProvider.java:68)
-	at org.apache.cayenne.di.spi.FieldInjectingProvider.injectMembers(FieldInjectingProvider.java:59)
-	at org.apache.cayenne.di.spi.FieldInjectingProvider.get(FieldInjectingProvider.java:44)
-	at org.apache.cayenne.di.spi.DefaultScopeProvider.get(DefaultScopeProvider.java:50)
-	at org.apache.cayenne.di.spi.DefaultInjector.getInstance(DefaultInjector.java:134)
-	at org.apache.cayenne.configuration.CayenneRuntime.newContext(CayenneRuntime.java:134)
-	at org.apache.cayenne.tutorial.persistent.client.Main.main(Main.java:44)
-----
-
-Which is exactly what you'd expect, as the client is not authenticating itself.
-So change the line in Main.java where we obtained an ROP connection to this:
-
-[source, java]
-----
-Map<String,String> properties = new HashMap<>();
-properties.put(ClientConstants.ROP_SERVICE_URL_PROPERTY, "http://localhost:8080/cayenne-service");
-properties.put(ClientConstants.ROP_SERVICE_USERNAME_PROPERTY, "cayenne-user");
-properties.put(ClientConstants.ROP_SERVICE_PASSWORD_PROPERTY, "secret");
-properties.put(ClientConstants.ROP_SERVICE_REALM_PROPERTY, "Cayenne Realm");
-
-ClientRuntime runtime = ClientRuntime.builder()
-                        .properties(properties)
-                        .addModule(new ClientJettyHttpModule())
-                        .build();
-----
-
-Try running again, and everything should work as before. Obviously in production environment,
-in addition to authentication you'll need to use HTTPS to access the server to prevent third-party
-eavesdropping on your password and data.
-
-Congratulations, you are done with the ROP tutorial!
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/connect.adoc b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/connect.adoc
deleted file mode 100644
index e1b3263c3..000000000
--- a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/connect.adoc
+++ /dev/null
@@ -1,188 +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
-//
-// https://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.
-
-=== Porting Existing Code to Connect to a Web Service Instead of a Database
-
-==== Starting Command Line Client
-
-One of the benefits of ROP is that the client code is no different from the server code - it uses the same
-ObjectContext interface for access, same query and commit API. So the code below will be similar to the code
-presented in the first Cayenne Getting Started Guide, although with a few ROP-specific parts required
-to bootstrap the ObjectContext.
-
-Let's start by creating an empty Main class with the standard main() method in the client project:
-
-[source, java]
-----
-package org.example.cayenne.persistent.client;
-
-public class Main {
-
-    public static void main(String[] args) {
-
-    }
-}
-----
-
-Now the part that is actually different from regular Cayenne - establishing the server connection and
-obtaining the ObjectContext:
-
-[source, java]
-----
-Map<String, String> properties = new HashMap<>();
-properties.put(ClientConstants.ROP_SERVICE_URL_PROPERTY, "http://localhost:8080/cayenne-service");
-properties.put(ClientConstants.ROP_SERVICE_USERNAME_PROPERTY, "cayenne-user");
-properties.put(ClientConstants.ROP_SERVICE_PASSWORD_PROPERTY, "secret");
-properties.put(ClientConstants.ROP_SERVICE_REALM_PROPERTY, "Cayenne Realm");
-
-
-ClientRuntime runtime = ClientRuntime.builder()
-                        .properties(properties)
-                        .addModule(new ClientJettyHttpModule())
-                        .build();
-ObjectContext context = runtime.newContext();
-----
-
-Note that the "runtime" can be used to create as many peer ObjectContexts as needed over the same connection,
-while ObjectContext is a kind of isolated "persistence session", similar to the server-side context. A few more notes.
-Since we are using HTTP(S) to communicate with ROP server, there's no need to explicitly close the connection
-(or channel, or context).
-
-So now let's do the same persistent operaions that we did in the first tutorial "Main" class. Let's start by
-creating and saving some objects:
-
-[source, java]
-----
-// creating new Artist
-Artist picasso = context.newObject(Artist.class);
-picasso.setName("Pablo Picasso");
-
-// Creating other objects
-Gallery metropolitan = context.newObject(Gallery.class);
-metropolitan.setName("Metropolitan Museum of Art");
-
-Painting girl = context.newObject(Painting.class);
-girl.setName("Girl Reading at a Table");
-
-Painting stein = context.newObject(Painting.class);
-stein.setName("Gertrude Stein");
-
-// connecting objects together via relationships
-picasso.addToPaintings(girl);
-picasso.addToPaintings(stein);
-
-girl.setGallery(metropolitan);
-stein.setGallery(metropolitan);
-
-// saving all the changes above
-context.commitChanges();
-----
-
-Now let's select them back:
-
-[source, java]
-----
-// ObjectSelect examples
-List<Painting> paintings1 = ObjectSelect.query(Painting.class).select(context);
-
-List<Painting> paintings2 = ObjectSelect.query(Painting.class)
-        .where(Painting.NAME.likeIgnoreCase("gi%")).select(context);
-----
-
-Now, delete:
-
-[source, java]
-----
-// Delete object example
-Artist picasso = ObjectSelect.query(Artist.class).where(Artist.NAME.eq("Pablo Picasso")).selectOne(context);
-
-if (picasso != null) {
-    context.deleteObject(picasso);
-    context.commitChanges();
-}
-----
-
-This code is exactly the same as in the first tutorial. So now let's try running the client and see what happens.
-In Eclipse open main class and select "Run > Run As > Java Application" from the menu (assuming the ROP server
-started in the previous step is still running). You will some output in both server and client process consoles. Client:
-
-----
-INFO: Connecting to [http://localhost:8080/tutorial/cayenne-service] - dedicated session.
-INFO: === Connected, session: org.apache.cayenne.remote.RemoteSession@26544ec1[sessionId=17uub1h34r9x1] - took 111 ms.
-INFO: --- Message 0: Bootstrap
-INFO: === Message 0: Bootstrap done - took 58 ms.
-INFO: --- Message 1: flush-cascade-sync
-INFO: === Message 1: flush-cascade-sync done - took 1119 ms.
-INFO: --- Message 2: Query
-INFO: === Message 2: Query done - took 48 ms.
-INFO: --- Message 3: Query
-INFO: === Message 3: Query done - took 63 ms.
-INFO: --- Message 4: Query
-INFO: === Message 4: Query done - took 19 ms.
-INFO: --- Message 5: Query
-INFO: === Message 5: Query done - took 7 ms.
-INFO: --- Message 6: Query
-INFO: === Message 6: Query done - took 5 ms.
-INFO: --- Message 7: Query
-INFO: === Message 7: Query done - took 2 ms.
-INFO: --- Message 8: Query
-INFO: === Message 8: Query done - took 4 ms.
-INFO: --- Message 9: flush-cascade-sync
-INFO: === Message 9: flush-cascade-sync done - took 34 ms.
-----
-
-As you see client prints no SQL statmenets, just a bunch of query and flush messages sent to the server.
-The server side is more verbose, showing the actual client queries executed against the database:
-
-----
-...
-INFO: SELECT NEXT_ID FROM AUTO_PK_SUPPORT WHERE TABLE_NAME = ? FOR UPDATE [bind: 1:'ARTIST']
-INFO: SELECT NEXT_ID FROM AUTO_PK_SUPPORT WHERE TABLE_NAME = ? FOR UPDATE [bind: 1:'GALLERY']
-INFO: SELECT NEXT_ID FROM AUTO_PK_SUPPORT WHERE TABLE_NAME = ? FOR UPDATE [bind: 1:'PAINTING']
-INFO: INSERT INTO ARTIST (DATE_OF_BIRTH, ID, NAME) VALUES (?, ?, ?)
-INFO: [batch bind: 1->DATE_OF_BIRTH:NULL, 2->ID:200, 3->NAME:'Pablo Picasso']
-INFO: === updated 1 row.
-INFO: INSERT INTO GALLERY (ID, NAME) VALUES (?, ?)
-INFO: [batch bind: 1->ID:200, 2->NAME:'Metropolitan Museum of Art']
-INFO: === updated 1 row.
-INFO: INSERT INTO PAINTING (ARTIST_ID, GALLERY_ID, ID, NAME) VALUES (?, ?, ?, ?)
-INFO: [batch bind: 1->ARTIST_ID:200, 2->GALLERY_ID:200, 3->ID:200, 4->NAME:'Girl Reading at a Table']
-INFO: [batch bind: 1->ARTIST_ID:200, 2->GALLERY_ID:200, 3->ID:201, 4->NAME:'Gertrude Stein']
-INFO: === updated 2 rows.
-INFO: +++ transaction committed.
-INFO: --- transaction started.
-INFO: SELECT t0.GALLERY_ID, t0.NAME, t0.ARTIST_ID, t0.ID FROM PAINTING t0
-INFO: === returned 2 rows. - took 14 ms.
-INFO: +++ transaction committed.
-INFO: --- transaction started.
-INFO: SELECT t0.GALLERY_ID, t0.NAME, t0.ARTIST_ID, t0.ID FROM PAINTING t0
-      WHERE UPPER(t0.NAME) LIKE UPPER(?) [bind: 1->NAME:'gi%']
-INFO: === returned 1 row. - took 10 ms.
-INFO: +++ transaction committed.
-INFO: --- transaction started.
-INFO: SELECT t0.DATE_OF_BIRTH, t0.NAME, t0.ID FROM ARTIST t0 WHERE t0.NAME = ? [bind: 1->NAME:'Pablo Picasso']
-INFO: === returned 1 row. - took 8 ms.
-INFO: +++ transaction committed.
-INFO: --- transaction started.
-INFO: DELETE FROM PAINTING WHERE ID = ?
-INFO: [batch bind: 1->ID:200]
-INFO: [batch bind: 1->ID:201]
-INFO: === updated 2 rows.
-INFO: DELETE FROM ARTIST WHERE ID = ?
-INFO: [batch bind: 1->ID:200]
-INFO: === updated 1 row.
-INFO: +++ transaction committed.
-----
-
-You are done with the basic ROP client!
\ No newline at end of file
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/hessianWebServ.adoc b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/hessianWebServ.adoc
deleted file mode 100644
index e894dfcf6..000000000
--- a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/hessianWebServ.adoc
+++ /dev/null
@@ -1,137 +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
-//
-// https://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.
-
-===  Setting up Hessian Web Service
-
-==== Setting up Dependencies
-
-Now lets get back to the "tutorial" project that contains a web application and set up dependencies.
-Let's add `resin-hessian.jar` (and the caucho repo declaration) and `cayenne-rop-server` to the `pom.xml`
-
-[source, XML]
-----
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    ...
-    <dependencies>
-        ...
-        <dependency>
-        	<groupId>org.apache.cayenne</groupId>
-        	<artifactId>cayenne-rop-server</artifactId>
-        	<!-- Here specify the version of Cayenne you are actually using -->
-            <version>{version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.caucho</groupId>
-            <artifactId>hessian</artifactId>
-            <version>4.0.38</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-    ...
-    </build>
-
-    <repositories>
-        <repository>
-            <id>caucho</id>
-            <name>Caucho Repository</name>
-            <url>http://caucho.com/m2</url>
-            <layout>default</layout>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-        </repository>
-    </repositories>
-    </project>
-----
-
-[NOTE]
-.Maven Optimization Hint
-====
-On a real project both server and client modules will likely share a common parent
-`pom.xml` where common repository delcaration can be placed, with child pom's "inheriting" it from parent.
-This would reduce build code duplication.
-====
-
-==== Client Classes on the Server
-
-Since ROP web service requires both server and client persistent classes, we need to generate a second copy
-of the client classes inside the server project. This is a minor inconvenience that will hopefully go away
-in the future versions of Cayenne. Don't forget to refresh the project in Eclipse after class generation is done.
-
-==== Configuring web.xml
-
-Cayenne web service is declared in the web.xml. It is implemented as a servlet `org.apache.cayenne.rop.ROPServlet`.
-Open `tutorial/src/main/webapp/WEB-INF/web.xml` in Eclipse and add a service declaration:
-
-[source, XML]
-----
-<?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE web-app
-   PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
-   "http://java.sun.com/dtd/web-app_2_3.dtd">
-<web-app>
-    <display-name>Cayenne Tutorial</display-name>
-    <servlet>
-        <servlet-name>cayenne-project</servlet-name>
-        <servlet-class>org.apache.cayenne.rop.ROPServlet</servlet-class>
-        <load-on-startup>0</load-on-startup>
-    </servlet>
-    <servlet-mapping>
-        <servlet-name>cayenne-project</servlet-name>
-        <url-pattern>/cayenne-service</url-pattern>
-    </servlet-mapping>
-    </web-app>
-----
-
-[NOTE]
-.Extending Server Behavior via Callbacks
-====
-While no custom Java code is required on the server,
-just a service declaration, it is possible to customizing server-side behavior via callbacks and listeners
-(not shown in the tutorial).
-====
-
-==== Running ROP Server
-
-Use previosly created Eclipse Jetty run configuration available via "Run > Run Configurations..."
-(or create a new one if none exists yet). You should see output in the Eclipse console similar to the following:
-
-----
-[INFO] Scanning for projects...
-[INFO]
-[INFO] ------------------------------------------------------------------------
-[INFO] Building tutorial 0.0.1-SNAPSHOT
-[INFO] ------------------------------------------------------------------------
-...
-[INFO] Starting jetty 6.1.22 ...
-INFO::jetty-6.1.22
-INFO::No Transaction manager found - if your webapp requires one, please configure one.
-INFO::Started SelectChannelConnector@0.0.0.0:8080
-[INFO] Started Jetty Server
-INFO: Loading XML configuration resource from file:cayenne-project.xml
-INFO: loading user name and password.
-INFO: Created connection pool: jdbc:derby:memory:testdb;create=true
-    Driver class: org.apache.derby.jdbc.EmbeddedDriver
-    Min. connections in the pool: 1
-    Max. connections in the pool: 1
-----
-
-Cayenne ROP service URL is http://localhost:8080/tutorial/cayenne-service[]. If you click on it,
-you will see "Hessian Requires POST" message, that means that the service is alive, but you need a client other
-than the web browser to access it.
\ No newline at end of file
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/starting.adoc b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/starting.adoc
deleted file mode 100644
index 8741df056..000000000
--- a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/part2/starting.adoc
+++ /dev/null
@@ -1,109 +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
-//
-// https://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.
-
-include::../var.adoc[]
-
-=== Starting Client Project
-
-==== Create an ROP Client Project in Eclipse
-
-Creation of a new Eclipse project has been discussed in some details in "Getting Started with Cayenne" guide,
-so we will omit the screenshots for the common parts.
-
-In Eclipse select "File > New > Other..." and then "Maven > Maven Project". Click "Next".
-On the following screen check "Create a simple project" checkbox and click "Next" again.
-In the dialog shown on the screenshot below, enter "org.example.cayenne" for the "Group Id" and "tutorial-rop-client"
-for the "Artifact Id" (both without the quotes) and click "Finish".
-
-Now you should have a new empty project in the Eclipse workspace. Check that the project Java compiler settings are correct.
-Rightclick on the "tutorial-rop-client" project, select "Properties > Java Compiler"
-and ensure that "Compiler compliance level" is at least 1.5 (some versions of Maven plugin
-seem to be setting it to 1.4 by default).
-
-==== Create Client Java Classes
-
-The client doesn't need the XML ORM mapping, as it is loaded from the server. However it needs the client-side Java classes.
-Let's generate them from the existing mapping:
-
-* Start CayenneModeler and open `cayenne.xml` from the "tutorial" project (located under `tutorial/src/main/resources`,
-unless it is already open.
-
-* Select the "datamap" DataMap and check "Allow Client Entities" checkbox.
-
-* Enter `org.example.cayenne.persistent.client` for the "Client Java Package" and click "Update.." button
-next to the field to refresh the client package of all entities.
-
-image::../images/datamap-enableclient.png[align="center"]
-
-* Select "Tools > Generate Classes" menu.
-
-* For "Type" select "Client Persistent Objects".
-
-* For the "Output Directory" select `tutorial-rop-client/src/main/java` folder (as client classes should go in the client project).
-
-* Click on "Classes" tab and check the "Check All Classes" checkbox (unless it is already checked and reads "Uncheck all Classes").
-
-* Click "Generate".
-
-Now go back to Eclipse, right click on "tutorial-rop-client" project and select "Refresh" - you should see pairs
-of classes generated for each mapped entity, same as on the server. And again, we see a bunch of errors in those classes.
-Let's fix it now by adding two dependencies, "cayenne-client" and "hessian", in the bottom of the pom.xml file.
-We also need to add Caucho M2 repository to pull Hessian jar files. The resulting POM should look like this:
-
-[source, XML,subs="verbatim,attributes"]
-----
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.example.cayenne</groupId>
-    <artifactId>tutorial-rop-client</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.cayenne</groupId>
-            <artifactId>cayenne-client-jetty</artifactId>
-            <!-- Here specify the version of Cayenne you are actually using -->
-            <version>{version}</version>
-        </dependency>
-        <dependency>
-        <groupId>com.caucho</groupId>
-            <artifactId>hessian</artifactId>
-            <version>4.0.38</version>
-        </dependency>
-    </dependencies>
-
-    <repositories>
-        <repository>
-            <id>caucho</id>
-            <name>Caucho Repository</name>
-            <url>http://caucho.com/m2</url>
-            <layout>default</layout>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-        </repository>
-    </repositories>
-</project>
-----
-
-Your computer must be connected to the internet. Once you save the pom.xml, Eclipse will download the needed jar files
-and add them to the project build path. After that all the errors should disappear.
-
-Now let's check the entity class pairs. They look almost identical to their server counterparts,
-although the superclass and the property access code are different. At this point these differences are somewhat academic,
-so let's go on with the tutorial.
\ No newline at end of file
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/var.adoc b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/var.adoc
deleted file mode 100644
index aaeabee64..000000000
--- a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/_getting-started-rop/var.adoc
+++ /dev/null
@@ -1,15 +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
-//
-// https://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.
-
-:version: {project-version}
\ No newline at end of file
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/getting-started-rop.adoc b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/getting-started-rop.adoc
deleted file mode 100644
index 040abffdf..000000000
--- a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/getting-started-rop.adoc
+++ /dev/null
@@ -1,45 +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
-//
-// https://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.
-= Getting Started with Cayenne ROP (Remote Object Persistence)
-:revnumber: {project-major-version} ({project-version})
-// enable section numbering, limiting depth to 2
-:sectnums:
-:sectnumlevels: 2
-// use custom header
-:cayenne-header: _getting-started-rop/header.html
-:cayenne-header-position: body
-// customize final layout
-//:linkcss:
-// base path to java code include
-:cayenne-root: {basedir}/../../..
-
-[small]#Copyright © 2011-{docyear} Apache Software Foundation and individual authors#
-
-.License
-[small]#_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 https://www.apache.org/licenses/LICENSE-2.0_#
-
-[small]#_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._#
-
-include::_getting-started-rop/part1.adoc[]
-
-include::_getting-started-rop/part2.adoc[]
-
-
-
diff --git a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/images/datamap-enableclient.png b/docs/asciidoc/getting-started-rop/src/docs/asciidoc/images/datamap-enableclient.png
deleted file mode 100644
index 4e57a5e18..000000000
Binary files a/docs/asciidoc/getting-started-rop/src/docs/asciidoc/images/datamap-enableclient.png and /dev/null differ
diff --git a/docs/asciidoc/pom.xml b/docs/asciidoc/pom.xml
index d42e13c6a..6e2e3fa78 100644
--- a/docs/asciidoc/pom.xml
+++ b/docs/asciidoc/pom.xml
@@ -36,7 +36,6 @@
         <module>cayenne-guide</module>
         <module>getting-started-guide</module>
         <module>getting-started-db-first</module>
-        <module>getting-started-rop</module>
         <module>upgrade-guide</module>
     </modules>
 


[cayenne] 05/05: CAY-2744 Remove ROP support - cleanup client related code

Posted by nt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 96819eb6996ce979e85c7504bd3d659beeece43e
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Jul 7 21:48:30 2022 +0300

    CAY-2744 Remove ROP support
     - cleanup client related code
---
 .../apache/cayenne/tools/CayenneGeneratorTask.java |  20 +-
 .../org/apache/cayenne/gen/CgenConfiguration.java  |  51 ++--
 .../cayenne/gen/ClientClassGenerationAction.java   | 108 --------
 .../apache/cayenne/gen/ClientDataMapArtifact.java  |  50 ----
 .../apache/cayenne/gen/ClientEntityArtifact.java   |  45 ----
 .../gen/DefaultClassGenerationActionFactory.java   |   4 +-
 .../java/org/apache/cayenne/gen/PropertyUtils.java |  49 ++--
 .../apache/cayenne/gen/xml/CgenConfigHandler.java  |  13 +-
 .../tools/CayenneGeneratorEntityFilterAction.java  |   7 +-
 .../cayenne/gen/BaseTemplatesGenerationTest.java   |   2 +-
 .../apache/cayenne/gen/CgenConfigurationTest.java  |   4 +-
 .../cayenne/gen/ClassGenerationActionTest.java     |  36 +--
 .../gen/ClientSuperClassGenerationTest.java        | 109 --------
 .../apache/cayenne/gen/TemplateLocationTest.java   |   2 +-
 .../cayenne/gen/xml/CgenSaverDelegateTest.java     |   6 +-
 .../merge/token/model/CreateTableToModel.java      |   5 -
 .../merge/token/model/CreateTableToModelIT.java    |   2 -
 .../java/org/apache/cayenne/tools/CgenTask.java    |  28 +--
 .../org/apache/cayenne/tools/CgenTaskTest.java     |   1 -
 .../project/extension/ProjectExtension.java        |   4 +-
 .../cayenne/access/ClientReturnDiffFilter.java     | 138 -----------
 .../apache/cayenne/access/ClientServerChannel.java |  81 ------
 .../access/ClientServerChannelQueryAction.java     | 274 ---------------------
 .../apache/cayenne/configuration/Constants.java    |  15 --
 .../configuration/xml/ObjEntityHandler.java        |   3 -
 .../apache/cayenne/map/ClientEntityResolver.java   |  64 -----
 .../org/apache/cayenne/map/ClientObjAttribute.java |  70 ------
 .../org/apache/cayenne/map/ClientObjEntity.java    |  58 -----
 .../apache/cayenne/map/ClientObjRelationship.java  |  74 ------
 .../main/java/org/apache/cayenne/map/DataMap.java  | 120 ---------
 .../org/apache/cayenne/map/EntityResolver.java     |  67 -----
 .../java/org/apache/cayenne/map/ObjAttribute.java  |  29 ---
 .../java/org/apache/cayenne/map/ObjEntity.java     | 147 +----------
 .../org/apache/cayenne/map/ObjRelationship.java    |  21 --
 .../cayenne/map/SyntheticPKObjAttribute.java       |  19 --
 .../apache/cayenne/query/BaseQueryMetadata.java    |   2 +-
 .../java/org/apache/cayenne/query/SelectById.java  |   2 +-
 .../cayenne/query/ToCacheKeyTraversalHandler.java  |   2 -
 .../apache/cayenne/util/ObjectDetachOperation.java | 205 ---------------
 .../configuration/xml/ObjEntityHandlerTest.java    |  11 +-
 .../configuration/xml/XMLDataMapLoaderTest.java    |   2 -
 .../apache/cayenne/map/ClientEntityResolverIT.java | 103 --------
 .../cayenne/map/ClientObjectRelationshipTest.java  |  48 ----
 .../java/org/apache/cayenne/map/DataMapTest.java   |  39 ---
 .../org/apache/cayenne/map/ObjAttributeTest.java   |  11 -
 .../java/org/apache/cayenne/map/ObjEntityIT.java   |  83 -------
 .../org/apache/cayenne/map/ObjRelationshipIT.java  |  21 --
 .../apache/cayenne/tools/CayenneGeneratorMojo.java |  19 +-
 .../tools/CayenneGeneratorIntegrationTest.java     |  10 -
 .../cayenne/modeler/CodeTemplateManager.java       |  41 ---
 .../modeler/action/CreateObjEntityAction.java      |   5 -
 .../dialog/datamap/PackageUpdateController.java    |  23 +-
 .../dialog/datamap/SuperclassUpdateController.java |  16 +-
 .../modeler/dialog/objentity/ClassNameUpdater.java |  68 +----
 .../dialog/objentity/ClassNameUpdaterView.java     |   8 -
 .../apache/cayenne/modeler/editor/DataMapView.java | 147 +----------
 .../cayenne/modeler/editor/ObjEntityTab.java       |  93 +------
 .../editor/cgen/ClassGenerationValidator.java      |  15 +-
 .../modeler/editor/cgen/ClientModeController.java  |  49 ----
 .../editor/cgen/CodeGeneratorController.java       |   6 +-
 .../modeler/editor/cgen/CustomModeController.java  |  61 +----
 .../modeler/editor/cgen/CustomModePanel.java       |  21 +-
 .../editor/cgen/GeneratorTabController.java        |   8 +-
 .../editor/cgen/StandardModeController.java        |   1 -
 .../editor/cgen/domain/CgenTabController.java      |   2 +-
 .../cayenne/modeler/pref/DataMapDefaults.java      |   5 +-
 .../apache/cayenne/wocompat/EOModelProcessor.java  |   7 +-
 67 files changed, 114 insertions(+), 2746 deletions(-)

diff --git a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
index 121b2871f..9970ad902 100644
--- a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
+++ b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
@@ -29,7 +29,6 @@ import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClassGenerationActionFactory;
-import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.types.Path;
@@ -55,7 +54,6 @@ public class CayenneGeneratorTask extends CayenneTask {
 
     protected File map;
     protected File additionalMaps[];
-    protected Boolean client;
     protected File destDir;
     protected String encoding;
     protected Boolean makepairs;
@@ -131,7 +129,6 @@ public class CayenneGeneratorTask extends CayenneTask {
 
             CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
             filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(logger, null, excludeEmbeddablesPattern));
-            filterEntityAction.setClient(generatorAction.getCgenConfiguration().isClient());
             generatorAction.setLogger(logger);
             if(force) {
                 // will (re-)generate all files
@@ -160,7 +157,7 @@ public class CayenneGeneratorTask extends CayenneTask {
     }
 
     private boolean hasConfig() {
-        return destDir != null || encoding != null || client != null || excludeEntitiesPattern != null || excludeEmbeddablesPattern != null || includeEntitiesPattern != null ||
+        return destDir != null || encoding != null || excludeEntitiesPattern != null || excludeEmbeddablesPattern != null || includeEntitiesPattern != null ||
                 makepairs != null || mode != null || outputPattern != null || overwrite != null || superpkg != null ||
                 supertemplate != null || template != null || embeddabletemplate != null || embeddablesupertemplate != null ||
                 usepkgpath != null || createpropertynames != null || querytemplate != null ||
@@ -178,14 +175,14 @@ public class CayenneGeneratorTask extends CayenneTask {
             return cgenConfiguration;
         } else {
             logger.info("Using default cgen config.");
-            cgenConfiguration = new CgenConfiguration(false);
+            cgenConfiguration = new CgenConfiguration();
             cgenConfiguration.setDataMap(dataMap);
             return cgenConfiguration;
         }
     }
 
     private CgenConfiguration cgenConfigFromPom(DataMap dataMap){
-        CgenConfiguration cgenConfiguration = new CgenConfiguration(client != null ? client : false);
+        CgenConfiguration cgenConfiguration = new CgenConfiguration();
         cgenConfiguration.setDataMap(dataMap);
         cgenConfiguration.setRelPath(destDir != null ? destDir.toPath() : cgenConfiguration.getRelPath());
         cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
@@ -209,13 +206,13 @@ public class CayenneGeneratorTask extends CayenneTask {
         cgenConfiguration.setExternalToolConfig(externaltoolconfig != null ? externaltoolconfig : cgenConfiguration.getExternalToolConfig());
         if(!cgenConfiguration.isMakePairs()) {
             if(template == null) {
-                cgenConfiguration.setTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+                cgenConfiguration.setTemplate(ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
             }
             if(embeddabletemplate == null) {
                 cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
             }
             if(querytemplate == null) {
-                cgenConfiguration.setQueryTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+                cgenConfiguration.setQueryTemplate(ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
             }
         }
         return cgenConfiguration;
@@ -324,13 +321,6 @@ public class CayenneGeneratorTask extends CayenneTask {
         this.superpkg = superpkg;
     }
 
-    /**
-     * Sets <code>client</code> property.
-     */
-    public void setClient(boolean client) {
-        this.client = client;
-    }
-
     /**
      * Sets <code>encoding</code> property that allows to generate files using non-default
      * encoding.
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
index 76bad4afa..9f39edc8f 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
@@ -22,7 +22,11 @@ package org.apache.cayenne.gen;
 import java.io.Serializable;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
@@ -77,15 +81,13 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
      */
     private boolean createPKProperties;
 
-    private boolean client;
-
     /**
      * @since 4.2
      */
     private String externalToolConfig;
 
-    public CgenConfiguration(boolean client) {
-        /**
+    public CgenConfiguration() {
+        /*
          * {@link #isDefault()} method should be in sync with the following values
          */
         this.outputPattern = "*.java";
@@ -101,19 +103,11 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
         this.excludeEmbeddableArtifacts = new ArrayList<>();
         this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
 
-        this.client = client;
+        this.template = ClassGenerationAction.SUBCLASS_TEMPLATE;
+        this.superTemplate = ClassGenerationAction.SUPERCLASS_TEMPLATE;
+        this.queryTemplate = ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE;
+        this.querySuperTemplate = ClassGenerationAction.DATAMAP_SUPERCLASS_TEMPLATE;
 
-        if (!client) {
-            this.template = ClassGenerationAction.SUBCLASS_TEMPLATE;
-            this.superTemplate = ClassGenerationAction.SUPERCLASS_TEMPLATE;
-            this.queryTemplate = ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE;
-            this.querySuperTemplate = ClassGenerationAction.DATAMAP_SUPERCLASS_TEMPLATE;
-        } else {
-            this.template = ClientClassGenerationAction.SUBCLASS_TEMPLATE;
-            this.superTemplate = ClientClassGenerationAction.SUPERCLASS_TEMPLATE;
-            this.queryTemplate = ClientClassGenerationAction.DMAP_SUBCLASS_TEMPLATE;
-            this.querySuperTemplate = ClientClassGenerationAction.DMAP_SUPERCLASS_TEMPLATE;
-        }
         this.embeddableTemplate = ClassGenerationAction.EMBEDDABLE_SUBCLASS_TEMPLATE;
         this.embeddableSuperTemplate = ClassGenerationAction.EMBEDDABLE_SUPERCLASS_TEMPLATE;
     }
@@ -178,7 +172,7 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
         if (rootPath != null) {
 
             if (!rootPath.isAbsolute()) {
-                throw new ValidationException("Root path : " + '"' + rootPath.toString() + '"' + "should be absolute");
+                throw new ValidationException("Root path : " + '"' + rootPath + '"' + "should be absolute");
             }
 
             if (path.isAbsolute() && rootPath.getRoot().equals(path.getRoot())) {
@@ -324,14 +318,6 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
         return embeddableArtifacts;
     }
 
-    public boolean isClient() {
-        return client;
-    }
-
-    public void setClient(boolean client) {
-        this.client = client;
-    }
-
     public String getExternalToolConfig() {
         return externalToolConfig;
     }
@@ -429,7 +415,6 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
                 .simpleTag("createPropertyNames", Boolean.toString(this.createPropertyNames))
                 .simpleTag("superPkg", separatorsToUnix(this.superPkg))
                 .simpleTag("createPKProperties", Boolean.toString(this.createPKProperties))
-                .simpleTag("client", Boolean.toString(client))
                 .simpleTag("externalToolConfig", this.externalToolConfig)
                 .end();
     }
@@ -445,14 +430,10 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
                 && !createPKProperties
                 && !createPropertyNames
                 && "*.java".equals(outputPattern)
-                && (template.equals(ClassGenerationAction.SUBCLASS_TEMPLATE)
-                || template.equals(ClientClassGenerationAction.SUBCLASS_TEMPLATE))
-                && (superTemplate.equals(ClassGenerationAction.SUPERCLASS_TEMPLATE)
-                || superTemplate.equals(ClientClassGenerationAction.SUPERCLASS_TEMPLATE))
-                && (superPkg == null
-                || superPkg.isEmpty())
-                && (externalToolConfig == null
-                || externalToolConfig.isEmpty());
+                && template.equals(ClassGenerationAction.SUBCLASS_TEMPLATE)
+                && superTemplate.equals(ClassGenerationAction.SUPERCLASS_TEMPLATE)
+                && (superPkg == null || superPkg.isEmpty())
+                && (externalToolConfig == null || externalToolConfig.isEmpty());
     }
 
     private String separatorsToUnix (String path){
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
deleted file mode 100644
index 886383d7d..000000000
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
+++ /dev/null
@@ -1,108 +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
- *
- *    https://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.gen;
-
-import java.util.Collection;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.QueryDescriptor;
-
-/**
- * @since 3.0
- */
-public class ClientClassGenerationAction extends ClassGenerationAction {
-
-    private static final String TEMPLATES_DIR_NAME = "templates/v4_1/";
-    public static final String SUBCLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-subclass.vm";
-    public static final String SUPERCLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-superclass.vm";
-    public static final String SINGLE_CLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-singleclass.vm";
-
-    public static final String DMAP_SUBCLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-datamap-subclass.vm";
-    public static final String DMAP_SUPERCLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-datamap-superclass.vm";
-    public static final String DATAMAP_SINGLE_CLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-datamap-singleclass.vm";
-
-    public static final String CLIENT_SUPERCLASS_PREFIX = "_Client";
-
-    public ClientClassGenerationAction(CgenConfiguration config) {
-        super(config);
-    }
-
-    @Override
-    public String defaultTemplateName(TemplateType type) {
-        switch (type) {
-            case ENTITY_SUBCLASS:
-                return SUBCLASS_TEMPLATE;
-            case ENTITY_SUPERCLASS:
-                return SUPERCLASS_TEMPLATE;
-            case ENTITY_SINGLE_CLASS:
-                return SINGLE_CLASS_TEMPLATE;
-
-            case EMBEDDABLE_SUBCLASS:
-                return ClassGenerationAction.EMBEDDABLE_SUBCLASS_TEMPLATE;
-            case EMBEDDABLE_SUPERCLASS:
-                return ClassGenerationAction.EMBEDDABLE_SUPERCLASS_TEMPLATE;
-            case EMBEDDABLE_SINGLE_CLASS:
-                return ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE;
-
-            case DATAMAP_SUPERCLASS:
-                return DMAP_SUPERCLASS_TEMPLATE;
-            case DATAMAP_SUBCLASS:
-                return DMAP_SUBCLASS_TEMPLATE;
-            case DATAMAP_SINGLE_CLASS:
-                return DATAMAP_SINGLE_CLASS_TEMPLATE;
-
-            default:
-                throw new IllegalArgumentException("Unsupported template type: " + type);
-        }
-    }
-
-    /**
-     * @since 4.0 throws exception
-     */
-    @Override
-    public void addEntities(Collection<ObjEntity> entities) {
-        if (!cgenConfiguration.getDataMap().isClientSupported()) {
-            throw new CayenneRuntimeException("Can't create client classes. Check client supported option on DataMap configuration.");
-        }
-        if (entities != null) {
-            for (ObjEntity entity : entities) {
-                if (!entity.isServerOnly()) {
-                    cgenConfiguration.addArtifact(new ClientEntityArtifact(entity));
-                }
-            }
-        }
-    }
-
-    @Override
-    public void addQueries(Collection<QueryDescriptor> queries) {
-        if (cgenConfiguration.getArtifactsGenerationMode().equals(ArtifactsGenerationMode.ALL.getLabel())) {
-            if (queries != null) {
-                cgenConfiguration.addArtifact(new ClientDataMapArtifact(cgenConfiguration.getDataMap(), queries));
-            }
-        }
-    }
-
-    public void setCgenConfiguration(CgenConfiguration cgenConfiguration) {
-        super.setCgenConfiguration(cgenConfiguration);
-        cgenConfiguration.setQueryTemplate(DMAP_SUBCLASS_TEMPLATE);
-        cgenConfiguration.setQuerySuperTemplate(DMAP_SUPERCLASS_TEMPLATE);
-    }
-}
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
deleted file mode 100644
index 25a59d92d..000000000
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientDataMapArtifact.java
+++ /dev/null
@@ -1,50 +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
- *
- *    https://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.gen;
-
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.QueryDescriptor;
-import org.apache.cayenne.util.Util;
-
-import java.util.Collection;
-
-public class ClientDataMapArtifact extends DataMapArtifact {
-
-    public ClientDataMapArtifact(DataMap dataMap, Collection<QueryDescriptor> queries) {
-        super(dataMap, queries);
-
-    }
-
-    @Override
-    public String getQualifiedBaseClassName() {
-
-        return dataMap.getDefaultClientSuperclass();
-    }
-
-    @Override
-    public String getQualifiedClassName() {
-        String clientPrefix = "";
-        if (Util.nullSafeEquals(dataMap.getDefaultClientPackage(), dataMap.getDefaultPackage())) {
-            clientPrefix = "Client_";
-        }
-
-        return dataMap.getNameWithDefaultClientPackage(Util.underscoredToJava(clientPrefix + dataMap.getName(), true));
-    }
-}
\ No newline at end of file
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientEntityArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientEntityArtifact.java
deleted file mode 100644
index f1feb37f9..000000000
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientEntityArtifact.java
+++ /dev/null
@@ -1,45 +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
- *
- *    https://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.gen;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.map.ObjEntity;
-
-/**
- * Client code generation artifact based on ObjEntity.
- * 
- * @since 3.0
- */
-public class ClientEntityArtifact extends EntityArtifact {
-
-    public ClientEntityArtifact(ObjEntity entity) {
-        super(entity);
-    }
-
-    @Override
-    public String getQualifiedBaseClassName() {
-        return (entity.getClientSuperClassName() != null) ? entity
-                .getClientSuperClassName() : PersistentObject.class.getName();
-    }
-
-    @Override
-    public String getQualifiedClassName() {
-        return entity.getClientClassName();
-    }
-}
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DefaultClassGenerationActionFactory.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DefaultClassGenerationActionFactory.java
index aa0be0990..c2be6ac3b 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DefaultClassGenerationActionFactory.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DefaultClassGenerationActionFactory.java
@@ -34,9 +34,7 @@ public class DefaultClassGenerationActionFactory implements ClassGenerationActio
 
     @Override
     public ClassGenerationAction createAction(CgenConfiguration cgenConfiguration) {
-        ClassGenerationAction classGenerationAction = cgenConfiguration.isClient() ?
-                new ClientClassGenerationAction(cgenConfiguration) :
-                new ClassGenerationAction(cgenConfiguration);
+        ClassGenerationAction classGenerationAction = new ClassGenerationAction(cgenConfiguration);
         classGenerationAction.setUtilsFactory(utilsFactory);
         classGenerationAction.setMetadataUtils(metadataUtils);
         return classGenerationAction;
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/PropertyUtils.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/PropertyUtils.java
index 8bd86b4d6..b09f38095 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/PropertyUtils.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/PropertyUtils.java
@@ -150,16 +150,9 @@ public class PropertyUtils {
     }
 
     public void addImport(ObjRelationship relationship) {
-        addImport(relationship, false);
-    }
-
-    public void addImport(ObjRelationship relationship, boolean client) {
         importUtils.addType(PropertyFactory.class.getName());
         if (relationship.getTargetEntity() != null) {
-            importUtils.addType(client
-                    ? relationship.getTargetEntity().getClientClassName()
-                    : relationship.getTargetEntity().getClassName())
-            ;
+            importUtils.addType(relationship.getTargetEntity().getClassName());
         } else {
             importUtils.addType(Persistent.class.getName());
         }
@@ -188,7 +181,7 @@ public class PropertyUtils {
         );
     }
 
-    public String propertyDefinition(ObjAttribute attribute, boolean client) throws ClassNotFoundException {
+    public String propertyDefinition(ObjAttribute attribute) throws ClassNotFoundException {
         StringUtils utils = StringUtils.getInstance();
         String attributeType = utils.stripGeneric(importUtils.formatJavaType(attribute.getType(), false));
         PropertyDescriptor propertyDescriptor = getPropertyDescriptor(attribute.getType());
@@ -213,10 +206,6 @@ public class PropertyUtils {
         return name;
     }
 
-    public String propertyDefinition(ObjAttribute attribute) throws ClassNotFoundException {
-        return propertyDefinition(attribute, false);
-    }
-
     public String propertyDefinition(EmbeddedAttribute attribute) throws ClassNotFoundException {
         StringUtils utils = StringUtils.getInstance();
         String attributeType = utils.stripGeneric(importUtils.formatJavaType(attribute.getType(), false));
@@ -256,33 +245,29 @@ public class PropertyUtils {
         return name;
     }
 
-    public String propertyDefinition(ObjRelationship relationship, boolean client) {
+    public String propertyDefinition(ObjRelationship relationship) {
         if (relationship.isToMany()) {
-            return toManyRelationshipDefinition(relationship, client);
+            return toManyRelationshipDefinition(relationship);
         } else {
-            return toOneRelationshipDefinition(relationship, client);
+            return toOneRelationshipDefinition(relationship);
         }
     }
 
-    public String propertyDefinition(ObjRelationship relationship) {
-        return propertyDefinition(relationship, false);
-    }
-
-    private String toManyRelationshipDefinition(ObjRelationship relationship, boolean client) {
+    private String toManyRelationshipDefinition(ObjRelationship relationship) {
         if (Map.class.getName().equals(relationship.getCollectionType())) {
-            return mapRelationshipDefinition(relationship, client);
+            return mapRelationshipDefinition(relationship);
         } else {
-            return collectionRelationshipDefinition(relationship, client);
+            return collectionRelationshipDefinition(relationship);
         }
     }
 
-    private String mapRelationshipDefinition(ObjRelationship relationship, boolean client) {
+    private String mapRelationshipDefinition(ObjRelationship relationship) {
         StringUtils utils = StringUtils.getInstance();
 
         String propertyType = getPropertyTypeForJavaClass(relationship);
         String propertyFactoryMethod = factoryMethodForPropertyType(propertyType);
         String mapKeyType = importUtils.formatJavaType(EntityUtils.getMapKeyTypeInternal(relationship));
-        String attributeType = getRelatedTypeName(relationship, client);
+        String attributeType = getRelatedTypeName(relationship);
 
         return String.format("public static final %s<%s, %s> %s = PropertyFactory.%s(\"%s\", %s.class, %s.class);",
                 importUtils.formatJavaType(propertyType),
@@ -296,12 +281,12 @@ public class PropertyUtils {
         );
     }
 
-    private String collectionRelationshipDefinition(ObjRelationship relationship, boolean client) {
+    private String collectionRelationshipDefinition(ObjRelationship relationship) {
         StringUtils utils = StringUtils.getInstance();
 
         String propertyType = getPropertyTypeForJavaClass(relationship);
         String propertyFactoryMethod = factoryMethodForPropertyType(propertyType);
-        String entityType = getRelatedTypeName(relationship, client);
+        String entityType = getRelatedTypeName(relationship);
 
         return String.format("public static final %s<%s> %s = PropertyFactory.%s(\"%s\", %s.class);",
                 importUtils.formatJavaType(propertyType),
@@ -313,22 +298,20 @@ public class PropertyUtils {
         );
     }
 
-    private String getRelatedTypeName(ObjRelationship relationship, boolean client) {
+    private String getRelatedTypeName(ObjRelationship relationship) {
         if(relationship.getTargetEntity() == null) {
             return Persistent.class.getSimpleName();
         }
 
-        return importUtils.formatJavaType(client
-                ? relationship.getTargetEntity().getClientClassName()
-                : relationship.getTargetEntity().getClassName());
+        return importUtils.formatJavaType(relationship.getTargetEntity().getClassName());
     }
 
-    private String toOneRelationshipDefinition(ObjRelationship relationship, boolean client) {
+    private String toOneRelationshipDefinition(ObjRelationship relationship) {
         StringUtils utils = StringUtils.getInstance();
 
         String propertyType = EntityProperty.class.getName();
         String propertyFactoryMethod = "createEntity";
-        String attributeType = getRelatedTypeName(relationship, client);
+        String attributeType = getRelatedTypeName(relationship);
 
         return String.format("public static final %s<%s> %s = PropertyFactory.%s(\"%s\", %s.class);",
                 importUtils.formatJavaType(propertyType),
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
index aabbf2c57..a60f8faab 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
@@ -55,7 +55,6 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
     private static final String EXCLUDE_ENTITIES_TAG = "excludeEntities";
     private static final String EXCLUDE_EMBEDDABLES_TAG = "excludeEmbeddables";
     private static final String CREATE_PK_PROPERTIES = "createPKProperties";
-    private static final String CLIENT_TAG = "client";
     private static final String SUPER_PKG_TAG = "superPkg";
 
     public static final String TRUE = "true";
@@ -67,7 +66,7 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         super(parentHandler);
         this.metaData = metaData;
         this.targetNamespace = CgenExtension.NAMESPACE;
-        this.configuration = new CgenConfiguration(false);
+        this.configuration = new CgenConfiguration();
     }
 
     @Override
@@ -130,9 +129,6 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             case CREATE_PK_PROPERTIES:
                 createPkPropertiesTag(data);
                 break;
-            case CLIENT_TAG:
-                createClient(data);
-                break;
             case SUPER_PKG_TAG:
                 createSuperPkg(data);
                 break;
@@ -251,13 +247,6 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         configuration.setCreatePKProperties(data.equals(TRUE));
     }
 
-    private void createClient(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-        configuration.setClient(data.equals(TRUE));
-    }
-
     private void createSuperPkg(String data) {
         if(data.trim().length() == 0) {
             return;
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
index 3f6597a77..def2bbfe0 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
@@ -35,7 +35,6 @@ import java.util.Collection;
 class CayenneGeneratorEntityFilterAction {
 
     private NameFilter nameFilter;
-    private boolean client;
 
     Collection<ObjEntity> getFilteredEntities(DataMap mainDataMap)
             throws MalformedURLException {
@@ -43,15 +42,11 @@ class CayenneGeneratorEntityFilterAction {
         Collection<ObjEntity> entities = new ArrayList<>(mainDataMap.getObjEntities());
 
         // filter out excluded entities...
-        entities.removeIf(e -> e.isGeneric() || client && !e.isClientAllowed() || !nameFilter.isIncluded(e.getName()));
+        entities.removeIf(e -> e.isGeneric() || !nameFilter.isIncluded(e.getName()));
 
         return entities;
     }
 
-    void setClient(boolean client) {
-        this.client = client;
-    }
-
     public void setNameFilter(NameFilter nameFilter) {
         this.nameFilter = nameFilter;
     }
diff --git a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/BaseTemplatesGenerationTest.java b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/BaseTemplatesGenerationTest.java
index e3f7242dd..c3437615b 100644
--- a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/BaseTemplatesGenerationTest.java
+++ b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/BaseTemplatesGenerationTest.java
@@ -58,7 +58,7 @@ public class BaseTemplatesGenerationTest {
 
     @Before
     public void setUp() {
-        cgenConfiguration = new CgenConfiguration(false);
+        cgenConfiguration = new CgenConfiguration();
         action = new ClassGenerationAction(cgenConfiguration);
         dataMap = new DataMap();
         dataMap.setDefaultPackage("test");
diff --git a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/CgenConfigurationTest.java b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/CgenConfigurationTest.java
index fd5572cbf..30638d3eb 100644
--- a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/CgenConfigurationTest.java
+++ b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/CgenConfigurationTest.java
@@ -42,7 +42,7 @@ public class CgenConfigurationTest {
 
         @Before
         public void setUp() {
-            configuration = new CgenConfiguration(false);
+            configuration = new CgenConfiguration();
         }
 
         @Before
@@ -157,7 +157,7 @@ public class CgenConfigurationTest {
 
         @Before
         public void setUp() {
-            configuration = new CgenConfiguration(false);
+            configuration = new CgenConfiguration();
         }
 
         @Before
diff --git a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
index ef9d5e60d..296e15295 100644
--- a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
+++ b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
@@ -54,7 +54,7 @@ public class ClassGenerationActionTest extends CgenCase {
 	@Before
 	public void setUp() throws Exception {
 		writers = new ArrayList<>(3);
-		cgenConfiguration = new CgenConfiguration(false);
+		cgenConfiguration = new CgenConfiguration();
 		action = new TestClassGenerationAction(getUnitTestInjector().getInstance(ClassGenerationActionFactory.class)
 				.createAction(cgenConfiguration), writers);
 	}
@@ -163,15 +163,10 @@ public class ClassGenerationActionTest extends CgenCase {
 
 	@Test
 	public void testExecuteDataMapQueryNames() throws Exception {
-		runDataMapTest(false);
+		runDataMapTest();
 	}
 
-	@Test
-	public void testExecuteClientDataMapQueryNames() throws Exception {
-		runDataMapTest(true);
-	}
-
-	private void runDataMapTest(boolean client) throws Exception {
+	private void runDataMapTest() throws Exception {
 		QueryDescriptor descriptor = QueryDescriptor.selectQueryDescriptor();
 		descriptor.setName("TestQuery");
 
@@ -179,28 +174,18 @@ public class ClassGenerationActionTest extends CgenCase {
 		map.addQueryDescriptor(descriptor);
 		map.setName("testmap");
 		List<String> generated;
-		if (client) {
-			map.setDefaultClientPackage("testpackage");
-			generated = execute(new ClientDataMapArtifact(map, map.getQueryDescriptors()));
-		} else {
-			map.setDefaultPackage("testpackage");
-			generated = execute(new DataMapArtifact(map, map.getQueryDescriptors()));
-		}
+		map.setDefaultPackage("testpackage");
+		generated = execute(new DataMapArtifact(map, map.getQueryDescriptors()));
 		assertEquals(2, generated.size());
 		assertTrue(generated.get(0).contains("public static final String TEST_QUERY_QUERYNAME = \"TestQuery\""));
 	}
 
 	@Test
 	public void testCallbackMethodGeneration() throws Exception {
-		assertCallbacks(false);
-	}
-
-	@Test
-	public void testClientCallbackMethodGeneration() throws Exception {
-		assertCallbacks(true);
+		assertCallbacks();
 	}
 
-	private void assertCallbacks(boolean isClient) throws Exception {
+	private void assertCallbacks() throws Exception {
 		ObjEntity testEntity1 = new ObjEntity("TE1");
 		testEntity1.setClassName("org.example.TestClass1");
 		int i = 0;
@@ -208,13 +193,6 @@ public class ClassGenerationActionTest extends CgenCase {
 			cb.addCallbackMethod("cb" + i++);
 		}
 
-		if (isClient) {
-
-			cgenConfiguration.setClient(true);
-			action = new TestClassGenerationAction(getUnitTestInjector().getInstance(ClassGenerationActionFactory.class)
-					.createAction(cgenConfiguration), writers);
-		}
-
 		cgenConfiguration.setMakePairs(true);
 
 		List<String> generated = execute(new EntityArtifact(testEntity1));
diff --git a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClientSuperClassGenerationTest.java b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClientSuperClassGenerationTest.java
deleted file mode 100644
index a37d69b7c..000000000
--- a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClientSuperClassGenerationTest.java
+++ /dev/null
@@ -1,109 +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
- *
- *    https://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.gen;
-
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.velocity.VelocityContext;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-public class ClientSuperClassGenerationTest extends ClassGenerationCase {
-
-    Logger logger = LoggerFactory.getLogger(ClientSuperClassGenerationTest.class);
-
-    @Test
-    public void testNotContainsPropertyImport() throws Exception {
-        ObjEntity objEntity = new ObjEntity("TEST1");
-
-        VelocityContext context = new VelocityContext();
-        context.put(Artifact.OBJECT_KEY, objEntity);
-
-        String res = renderTemplate(ClientClassGenerationAction.SUPERCLASS_TEMPLATE, context);
-        assertFalse(res.contains("org.apache.cayenne.exp.property."));
-    }
-
-    @Test
-    public void testContainsPropertyImportForAttributes() throws Exception {
-        ObjEntity objEntity = new ObjEntity("TEST1");
-        ObjAttribute attr = new ObjAttribute("attr");
-        attr.setType("int");
-        objEntity.addAttribute(attr);
-
-        VelocityContext context = new VelocityContext();
-        ImportUtils importUtils = new ImportUtils();
-        context.put(Artifact.OBJECT_KEY, objEntity);
-        context.put(Artifact.IMPORT_UTILS_KEY, importUtils);
-        context.put(Artifact.STRING_UTILS_KEY, StringUtils.getInstance());
-        context.put(Artifact.PROPERTY_UTILS_KEY,
-                getInjector().getInstance(ToolsUtilsFactory.class)
-                        .createPropertyUtils(logger, importUtils));
-
-        String res = renderTemplate(ClientClassGenerationAction.SUPERCLASS_TEMPLATE, context);
-        assertTrue(res.contains("org.apache.cayenne.exp.property.NumericProperty"));
-    }
-
-    @Test
-    public void testContainsPropertyImportForRelationships() throws Exception {
-        ObjEntity objEntity = new ObjEntity("TEST1");
-        ObjRelationship rel = new ObjRelationship("rel");
-        objEntity.addRelationship(rel);
-
-        VelocityContext context = new VelocityContext();
-        ImportUtils importUtils = new ImportUtils();
-        context.put(Artifact.OBJECT_KEY, objEntity);
-        context.put(Artifact.IMPORT_UTILS_KEY, importUtils);
-        context.put(Artifact.STRING_UTILS_KEY, StringUtils.getInstance());
-        context.put(Artifact.PROPERTY_UTILS_KEY, new PropertyUtils(importUtils));
-
-        String res = renderTemplate(ClientClassGenerationAction.SUPERCLASS_TEMPLATE, context);
-        assertTrue(res.contains("org.apache.cayenne.exp.property.EntityProperty"));
-    }
-
-    @Test
-    public void testContainsPropertyImport() throws Exception {
-        ObjEntity objEntity = new ObjEntity("TEST1");
-        ObjAttribute attr = new ObjAttribute("attr");
-        attr.setType("int");
-        ObjRelationship rel = new ObjRelationship("rel");
-
-        objEntity.addAttribute(attr);
-        objEntity.addRelationship(rel);
-
-        VelocityContext context = new VelocityContext();
-        ImportUtils importUtils = new ImportUtils();
-        context.put(Artifact.OBJECT_KEY, objEntity);
-        context.put(Artifact.IMPORT_UTILS_KEY, importUtils);
-        context.put(Artifact.STRING_UTILS_KEY, StringUtils.getInstance());
-        context.put(Artifact.PROPERTY_UTILS_KEY,
-                getInjector().getInstance(ToolsUtilsFactory.class)
-                        .createPropertyUtils(logger, importUtils));
-
-        String res = renderTemplate(ClientClassGenerationAction.SUPERCLASS_TEMPLATE, context);
-        assertTrue(res.contains("org.apache.cayenne.exp.property.NumericProperty"));
-        assertTrue(res.contains("org.apache.cayenne.exp.property.EntityProperty"));
-    }
-
-}
diff --git a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/TemplateLocationTest.java b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/TemplateLocationTest.java
index 18ab896ca..d6eb63c59 100644
--- a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/TemplateLocationTest.java
+++ b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/TemplateLocationTest.java
@@ -39,7 +39,7 @@ public class TemplateLocationTest {
 
     @Before
     public void setUp() {
-        cgenConfiguration = new CgenConfiguration(false);
+        cgenConfiguration = new CgenConfiguration();
         action = new ClassGenerationAction(cgenConfiguration);
         templateType = TemplateType.ENTITY_SUBCLASS;
     }
diff --git a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/xml/CgenSaverDelegateTest.java b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/xml/CgenSaverDelegateTest.java
index 78be02efd..ef05d1ce3 100644
--- a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/xml/CgenSaverDelegateTest.java
+++ b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/xml/CgenSaverDelegateTest.java
@@ -34,7 +34,7 @@ public class CgenSaverDelegateTest {
 
     @Test
     public void testExistingRootOverride() throws Exception {
-        CgenConfiguration config = new CgenConfiguration(false);
+        CgenConfiguration config = new CgenConfiguration();
 
         config.setRootPath(Paths.get("/tmp/src/main/java").toAbsolutePath());
         URL baseURL = Paths.get("/tmp/src/main/resources").toUri().toURL();
@@ -47,7 +47,7 @@ public class CgenSaverDelegateTest {
 
     @Test
     public void testExistingRootAndRelPath() throws Exception {
-        CgenConfiguration config = new CgenConfiguration(false);
+        CgenConfiguration config = new CgenConfiguration();
 
         config.setRootPath(Paths.get("/tmp/src/main/java").toAbsolutePath());
         config.setRelPath(Paths.get(""));
@@ -62,7 +62,7 @@ public class CgenSaverDelegateTest {
 
     @Test
     public void testEmptyRoot() throws Exception {
-        CgenConfiguration config = new CgenConfiguration(false);
+        CgenConfiguration config = new CgenConfiguration();
 
         URL baseURL = Paths.get("/tmp/src/main/resources").toUri().toURL();
 
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java
index 154d90d91..4ff8ba5b5 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModel.java
@@ -80,11 +80,6 @@ public class CreateTableToModel extends AbstractToModelToken.Entity {
         objEntity.setClassName(className);
         objEntity.setSuperClassName(map.getDefaultSuperclass());
 
-        if (map.isClientSupported()) {
-            objEntity.setClientClassName(map.getNameWithDefaultClientPackage(objEntity.getName()));
-            objEntity.setClientSuperClassName(map.getDefaultClientSuperclass());
-        }
-
         map.addObjEntity(objEntity);
 
         // presumably there are no other ObjEntities pointing to this DbEntity, so syncing just this one...
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModelIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModelIT.java
index 0d72f9a48..ea89cbaf4 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModelIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/model/CreateTableToModelIT.java
@@ -78,8 +78,6 @@ public class CreateTableToModelIT extends MergeCase {
 
 		assertEquals(objEntity.getClassName(), map.getDefaultPackage() + "." + objEntity.getName());
 		assertEquals(objEntity.getSuperClassName(), map.getDefaultSuperclass());
-		assertEquals(objEntity.getClientClassName(), map.getDefaultClientPackage() + "." + objEntity.getName());
-		assertEquals(objEntity.getClientSuperClassName(), map.getDefaultClientSuperclass());
 
 		assertEquals(1, objEntity.getAttributes().size());
 		assertEquals("java.lang.String", objEntity.getAttributes().iterator().next().getType());
diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
index 849d40b5a..7328662dd 100644
--- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
+++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
@@ -28,7 +28,6 @@ import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClassGenerationActionFactory;
-import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.gradle.api.Action;
 import org.gradle.api.GradleException;
@@ -49,10 +48,6 @@ public class CgenTask extends BaseCayenneTask {
 
     private File additionalMaps;
 
-    @Input
-    @Optional
-    private Boolean client;
-
     private File destDir;
 
     @Input
@@ -180,7 +175,6 @@ public class CgenTask extends BaseCayenneTask {
 
             CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
             filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(getLogger(), null, excludeEmbeddables));
-            filterEntityAction.setClient(generator.getCgenConfiguration().isClient());
             generator.setLogger(getLogger());
 
             if(this.force || getProject().hasProperty("force")) {
@@ -232,7 +226,7 @@ public class CgenTask extends BaseCayenneTask {
             return cgenConfiguration;
         } else {
             getLogger().info("Using default cgen config.");
-            cgenConfiguration = new CgenConfiguration(false);
+            cgenConfiguration = new CgenConfiguration();
             cgenConfiguration.setRelPath(getDestDirFile().getPath());
             cgenConfiguration.setDataMap(dataMap);
             return cgenConfiguration;
@@ -240,7 +234,7 @@ public class CgenTask extends BaseCayenneTask {
     }
 
     private CgenConfiguration cgenConfigFromPom(DataMap dataMap){
-        CgenConfiguration cgenConfiguration = new CgenConfiguration(client != null ? client : false);
+        CgenConfiguration cgenConfiguration = new CgenConfiguration();
         cgenConfiguration.setDataMap(dataMap);
         cgenConfiguration.setRelPath(getDestDirFile() != null ? getDestDirFile().toPath() : cgenConfiguration.getRelPath());
         cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
@@ -264,13 +258,13 @@ public class CgenTask extends BaseCayenneTask {
         cgenConfiguration.setExternalToolConfig(externalToolConfig != null ? externalToolConfig : cgenConfiguration.getExternalToolConfig());
         if(!cgenConfiguration.isMakePairs()) {
             if(template == null) {
-                cgenConfiguration.setTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+                cgenConfiguration.setTemplate(ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
             }
             if(embeddableTemplate == null) {
                 cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
             }
             if(queryTemplate == null) {
-                cgenConfiguration.setQueryTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+                cgenConfiguration.setQueryTemplate(ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
             }
         }
         return cgenConfiguration;
@@ -284,7 +278,7 @@ public class CgenTask extends BaseCayenneTask {
     }
 
     private boolean hasConfig() {
-        return destDir != null || destDirName != null || encoding != null || client != null || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
+        return destDir != null || destDirName != null || encoding != null || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
                 makePairs != null || mode != null || outputPattern != null || overwrite != null || superPkg != null ||
                 superTemplate != null || template != null || embeddableTemplate != null || embeddableSuperTemplate != null ||
                 usePkgPath != null || createPropertyNames != null || force || queryTemplate != null ||
@@ -375,18 +369,6 @@ public class CgenTask extends BaseCayenneTask {
         setAdditionalMaps(additionalMaps);
     }
 
-    public Boolean isClient() {
-        return client;
-    }
-
-    public void setClient(Boolean client) {
-        this.client = client;
-    }
-
-    public void client(boolean client) {
-        setClient(client);
-    }
-
     public String getEncoding() {
         return encoding;
     }
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
index 9269a65b7..53d1416d3 100644
--- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
+++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
@@ -46,7 +46,6 @@ public class CgenTaskTest {
     private CgenTask createCgenTaskMock() {
         CgenTask mock = mock(CgenTask.class);
 
-        doCallRealMethod().when(mock).setClient(anyBoolean());
         doCallRealMethod().when(mock).setAdditionalMaps(any(File.class));
         doCallRealMethod().when(mock).setCreatePropertyNames(anyBoolean());
         doCallRealMethod().when(mock).setEmbeddableSuperTemplate(anyString());
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
index 7c9d99805..8f4338e3e 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
@@ -25,8 +25,8 @@ import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
  * <p>DataMap XML file extension mechanics.</p>
  * <p>
  *     Can be used to enhance datamap.map.xml files with additional (really random) information.
- *     By default extensions not used by {@link org.apache.cayenne.configuration.server.ServerRuntime} or
- *     ClientRuntime so they can safely store big chunks of data.
+ *     By default extensions not used by {@link org.apache.cayenne.configuration.server.ServerRuntime}
+ *     so they can safely store big chunks of data.
  * </p>
  * <p>
  *     Extensions can be contributed by {@link org.apache.cayenne.project.ProjectModule#contributeExtensions(org.apache.cayenne.di.Binder)}.
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/ClientReturnDiffFilter.java b/cayenne-server/src/main/java/org/apache/cayenne/access/ClientReturnDiffFilter.java
deleted file mode 100644
index 335c15fbb..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/ClientReturnDiffFilter.java
+++ /dev/null
@@ -1,138 +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
- *
- *    https://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.access;
-
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.graph.ArcCreateOperation;
-import org.apache.cayenne.graph.ArcDeleteOperation;
-import org.apache.cayenne.graph.ArcId;
-import org.apache.cayenne.graph.CompoundDiff;
-import org.apache.cayenne.graph.GraphChangeHandler;
-import org.apache.cayenne.graph.GraphDiff;
-import org.apache.cayenne.graph.NodeCreateOperation;
-import org.apache.cayenne.graph.NodeDeleteOperation;
-import org.apache.cayenne.graph.NodeIdChangeOperation;
-import org.apache.cayenne.graph.NodePropertyChangeOperation;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Filters diffs before returning them to the client. Ensures that no server-only data
- * leaks to the client and also that all diff objects returned to the client are public
- * classes available on the client.
- * 
- * @since 3.0
- */
-// TODO: andrus, 2008/03/01 - integrate with GraphDiffCompressor.
-class ClientReturnDiffFilter implements GraphChangeHandler {
-
-    private List<GraphDiff> diffs;
-    private EntityResolver resolver;
-
-    ClientReturnDiffFilter(EntityResolver resolver) {
-        this.resolver = resolver;
-    }
-
-    GraphDiff filter(GraphDiff in) {
-        diffs = new ArrayList<>();
-        in.apply(this);
-        return new CompoundDiff(diffs);
-    }
-
-    @Override
-    public void arcCreated(Object nodeId, Object targetNodeId, ArcId arcId) {
-        if (isClientArc(nodeId, targetNodeId, arcId)) {
-            diffs.add(new ArcCreateOperation(nodeId, targetNodeId, arcId));
-        }
-    }
-
-    @Override
-    public void arcDeleted(Object nodeId, Object targetNodeId, ArcId arcId) {
-        if (isClientArc(nodeId, targetNodeId, arcId)) {
-            diffs.add(new ArcDeleteOperation(nodeId, targetNodeId, arcId));
-        }
-    }
-
-    @Override
-    public void nodeCreated(Object nodeId) {
-        if (isClientNode(nodeId)) {
-            diffs.add(new NodeCreateOperation(nodeId));
-        }
-    }
-
-    @Override
-    public void nodeIdChanged(Object nodeId, Object newId) {
-        if (isClientNode(nodeId)) {
-            diffs.add(new NodeIdChangeOperation(nodeId, newId));
-        }
-    }
-
-    @Override
-    public void nodePropertyChanged(
-            Object nodeId,
-            String property,
-            Object oldValue,
-            Object newValue) {
-
-        if (isClientNode(nodeId)) {
-            diffs.add(new NodePropertyChangeOperation(
-                    nodeId,
-                    property,
-                    oldValue,
-                    newValue));
-        }
-    }
-
-    @Override
-    public void nodeRemoved(Object nodeId) {
-        if (isClientNode(nodeId)) {
-            diffs.add(new NodeDeleteOperation(nodeId));
-        }
-    }
-
-    private boolean isClientNode(Object id) {
-        ObjectId oid = (ObjectId) id;
-        return resolver.getObjEntity(oid.getEntityName()).isClientAllowed();
-    }
-
-    private boolean isClientArc(Object id, Object targetId, Object arcId) {
-
-        ObjectId oid = (ObjectId) id;
-        ObjEntity entity = resolver.getObjEntity(oid.getEntityName());
-
-        if(!entity.isClientAllowed()) {
-            return false;
-        }
-        
-        if(entity.getRelationship(arcId.toString()).isRuntime()) {
-            return false;
-        }
-        
-        ObjectId targetOid = (ObjectId) targetId;
-        ObjEntity targetEntity = resolver.getObjEntity(targetOid.getEntityName());
-        if(!targetEntity.isClientAllowed()) {
-            return false;
-        }
-
-        return true;
-    }
-}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannel.java b/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannel.java
deleted file mode 100644
index 8e140d81e..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannel.java
+++ /dev/null
@@ -1,81 +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
- *
- *    https://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.access;
-
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.QueryResponse;
-import org.apache.cayenne.cache.QueryCache;
-import org.apache.cayenne.event.EventManager;
-import org.apache.cayenne.graph.GraphDiff;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.query.Query;
-
-/**
- * A DataChannel that provides a server-side end of the bridge between client and server
- * objects in a Remote Object Persistence stack.
- * 
- * @since 1.2
- */
-public class ClientServerChannel implements DataChannel {
-
-    protected DataContext serverContext;
-
-    /**
-     * Creates a ClientServerChannel that wraps a specified DataContext.
-     * 
-     * @since 3.0
-     */
-    public ClientServerChannel(DataContext serverContext) {
-        this.serverContext = serverContext;
-    }
-
-    public QueryResponse onQuery(ObjectContext context, Query query) {
-        return new ClientServerChannelQueryAction(this, query).execute();
-    }
-
-    QueryCache getQueryCache() {
-        return serverContext.getQueryCache();
-    }
-
-    /**
-     * @since 3.1
-     */
-    public DataChannel getParentChannel() {
-        return serverContext;
-    }
-
-    public EntityResolver getEntityResolver() {
-        return serverContext.getEntityResolver();
-    }
-
-    public EventManager getEventManager() {
-        return serverContext != null ? serverContext.getEventManager() : null;
-    }
-
-    public GraphDiff onSync(
-            ObjectContext originatingContext,
-            GraphDiff changes,
-            int syncType) {
-
-        GraphDiff diff = getParentChannel().onSync(null, changes, syncType);
-        return new ClientReturnDiffFilter(getEntityResolver()).filter(diff);
-    }
-}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java b/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
deleted file mode 100644
index 00d02ab71..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/ClientServerChannelQueryAction.java
+++ /dev/null
@@ -1,274 +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
- *
- *    https://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.access;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.Persistent;
-import org.apache.cayenne.QueryResponse;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.query.EntityResultSegment;
-import org.apache.cayenne.query.PrefetchTreeNode;
-import org.apache.cayenne.query.Query;
-import org.apache.cayenne.query.QueryMetadata;
-import org.apache.cayenne.reflect.ClassDescriptor;
-import org.apache.cayenne.util.GenericResponse;
-import org.apache.cayenne.util.IncrementalListResponse;
-import org.apache.cayenne.util.ListResponse;
-import org.apache.cayenne.util.ObjectDetachOperation;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A query handler used by ClientServerChannel.
- * 
- * @since 1.2
- */
-class ClientServerChannelQueryAction {
-
-    static final boolean DONE = true;
-
-    private final ClientServerChannel channel;
-    private Query serverQuery;
-    private QueryResponse response;
-    private final QueryMetadata serverMetadata;
-    private final EntityResolver serverResolver;
-
-    ClientServerChannelQueryAction(ClientServerChannel channel, Query query) {
-        this.channel = channel;
-        this.serverResolver = channel.getEntityResolver();
-        this.serverQuery = query;
-        this.serverMetadata = serverQuery.getMetaData(serverResolver);
-    }
-
-    QueryResponse execute() {
-
-        if (interceptSinglePageQuery() != DONE) {
-            runQuery();
-        }
-
-        if (interceptIncrementalListConversion() != DONE) {
-            interceptObjectConversion();
-        }
-
-        return response;
-    }
-
-    private boolean interceptSinglePageQuery() {
-
-        // retrieve range from the previously cached list
-        if (serverMetadata.getFetchOffset() >= 0
-                && serverMetadata.getFetchLimit() > 0
-                && serverMetadata.getCacheKey() != null) {
-
-            List cachedList = channel.getQueryCache().get(serverMetadata);
-            if (cachedList == null) {
-
-                // attempt to refetch... respawn the action...
-                Query originatingQuery = serverMetadata.getOriginatingQuery();
-                if (originatingQuery != null) {
-                    ClientServerChannelQueryAction subaction = new ClientServerChannelQueryAction(
-                            channel,
-                            originatingQuery);
-                    subaction.execute();
-
-                    cachedList = channel.getQueryCache().get(serverMetadata);
-                    if (cachedList == null) {
-                        throw new CayenneRuntimeException("No cached list for %s", serverMetadata.getCacheKey());
-                    }
-                } else {
-                    return !DONE;
-                }
-            }
-
-            int startIndex = serverMetadata.getFetchOffset();
-            int endIndex = startIndex + serverMetadata.getFetchLimit();
-
-            // send back just one page... query sender will figure out where it fits in
-            // the incremental list
-            this.response = new ListResponse(new ArrayList<>(cachedList.subList(
-                    startIndex,
-                    endIndex)));
-
-            return DONE;
-        }
-
-        return !DONE;
-    }
-
-    private void runQuery() {
-        this.response = channel.getParentChannel().onQuery(null, serverQuery);
-    }
-
-    private boolean interceptIncrementalListConversion() {
-        int pageSize = serverMetadata.getPageSize();
-        if (pageSize > 0 && serverMetadata.getCacheKey() != null) {
-
-            List list = response.firstList();
-            if (list.size() > pageSize && list instanceof IncrementalFaultList) {
-
-                // cache
-                channel.getQueryCache().put(serverMetadata, list);
-
-                // extract and convert first page
-
-                // TODO: andrus, 2008/03/05 - we no longer resolve the first page
-                // automatically on the server... probably should not do it for the client
-                // either... One rare case when this is completely undesirable is
-                // subaction execution from 'interceptSinglePageQuery', as it doesn't even
-                // care about the first page...
-
-                List sublist = list.subList(0, pageSize);
-
-                List firstPage = (serverMetadata.isFetchingDataRows()) ? new ArrayList(sublist) : toClientObjects(sublist);
-
-                this.response = new IncrementalListResponse(firstPage, list.size());
-                return DONE;
-            }
-        }
-
-        return !DONE;
-    }
-
-    private void interceptObjectConversion() {
-
-        if (!serverMetadata.isFetchingDataRows()) {
-
-            GenericResponse clientResponse = new GenericResponse();
-
-            for (response.reset(); response.next();) {
-                if (response.isList()) {
-                    List serverObjects = response.currentList();
-                    clientResponse.addResultList(toClientObjects(serverObjects));
-
-                }
-                else {
-                    clientResponse.addBatchUpdateCount(response.currentUpdateCount());
-                }
-            }
-
-            this.response = clientResponse;
-        }
-    }
-
-    private List toClientObjects(List serverObjects) {
-
-        if (!serverObjects.isEmpty()) {
-
-            List<Object> rsMapping = serverMetadata.getResultSetMapping();
-
-            if (rsMapping == null) {
-                return singleObjectConversion(serverObjects);
-            }
-            else {
-                if (rsMapping.size() == 1) {
-                    if (rsMapping.get(0) instanceof EntityResultSegment) {
-                        return singleObjectConversion(serverObjects);
-                    }
-                    else {
-                        // we can return a single scalar result unchanged (hmm... a scalar
-                        // Object[] can also be returned unchanged)...
-                        return serverObjects;
-                    }
-                }
-                else {
-                    return processMixedResult(serverObjects, rsMapping);
-                }
-            }
-        }
-
-        return new ArrayList<>(3);
-    }
-
-    private List<Object[]> processMixedResult(
-            List<Object[]> serverObjects,
-            List<Object> rsMapping) {
-
-        // must clone the list to ensure we do not mess up the server list that can be
-        // used elsewhere (e.g. it can be cached).
-        List<Object[]> clientObjects = new ArrayList<>(serverObjects.size());
-
-        ObjectDetachOperation op = new ObjectDetachOperation(serverResolver
-                .getClientEntityResolver());
-        int width = rsMapping.size();
-
-        for (Object[] serverObject : serverObjects) {
-
-            Object[] clientObject = new Object[width];
-
-            for (int i = 0; i < width; i++) {
-                if (rsMapping.get(i) instanceof EntityResultSegment) {
-
-                    clientObject[i] = convertSingleObject(serverMetadata
-                            .getPrefetchTree(), op, serverObject[i]);
-                }
-                else {
-                    clientObject[i] = serverObject[i];
-                }
-            }
-
-            clientObjects.add(clientObject);
-        }
-
-        return clientObjects;
-    }
-
-    private List<?> singleObjectConversion(List<?> serverObjects) {
-
-        // must clone the list to ensure we do not mess up the server list that can be
-        // used elsewhere (e.g. it can be cached).
-        List<Object> clientObjects = new ArrayList<>(serverObjects.size());
-
-        ObjectDetachOperation op = new ObjectDetachOperation(serverResolver
-                .getClientEntityResolver());
-
-        PrefetchTreeNode prefetchTree = serverMetadata.getPrefetchTree();
-
-        for (Object serverObject : serverObjects) {
-            clientObjects.add(convertSingleObject(prefetchTree, op, serverObject));
-        }
-
-        return clientObjects;
-    }
-
-    private Object convertSingleObject(
-            PrefetchTreeNode prefetchTree,
-            ObjectDetachOperation op,
-            Object serverObject) {
-
-        Persistent object = (Persistent) serverObject;
-        ObjectId id = object.getObjectId();
-
-        // sanity check
-        if (id == null) {
-            throw new CayenneRuntimeException("Server returned an object without an id: %s", object);
-        }
-
-        // have to resolve descriptor here for every object, as
-        // often a query will not have any info indicating the
-        // entity type
-        ClassDescriptor serverDescriptor = serverResolver.getClassDescriptor(id
-                .getEntityName());
-
-        return op.detach(object, serverDescriptor, prefetchTree);
-    }
-
-}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/Constants.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/Constants.java
index 2d707d986..14f1035d3 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/Constants.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/Constants.java
@@ -86,12 +86,6 @@ public interface Constants {
      */
     String SERVER_RESOURCE_LOCATOR = "cayenne.server.resource_locator";
 
-    /**
-     * A server-side DI container key for the Map&lt;String, String&gt; storing
-     * event bridge properties passed to the ROP client on bootstrap.
-     */
-    String SERVER_ROP_EVENT_BRIDGE_PROPERTIES_MAP = "cayenne.server.rop_event_bridge_properties";
-
     // Runtime properties
 
     String JDBC_DRIVER_PROPERTY = "cayenne.jdbc.driver";
@@ -156,15 +150,6 @@ public interface Constants {
      */
     String SERVER_EXTERNAL_TX_PROPERTY = "cayenne.server.external_tx";
 
-    /**
-     * The name of the {@link org.apache.cayenne.event.EventBridgeFactory} that
-     * is passed from the ROP server to the client. Client would instantiate the
-     * factory to receive events from the server. Note that this property is
-     * stored in {@link #SERVER_ROP_EVENT_BRIDGE_PROPERTIES_MAP}, not
-     * {@link #PROPERTIES_MAP}.
-     */
-    String SERVER_ROP_EVENT_BRIDGE_FACTORY_PROPERTY = "cayenne.server.rop_event_bridge_factory";
-
     /**
      * A property that defines a maximum number of ID qualifiers in where clause
      * of queries that are generated for example in
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/ObjEntityHandler.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/ObjEntityHandler.java
index 2cfc67994..c75b19194 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/ObjEntityHandler.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/ObjEntityHandler.java
@@ -124,10 +124,8 @@ public class ObjEntityHandler extends NamespaceAwareNestedTagHandler {
     private void createObjEntity(Attributes attributes) {
         entity = new ObjEntity(attributes.getValue("name"));
         entity.setClassName(attributes.getValue("className"));
-        entity.setClientClassName(attributes.getValue("clientClassName"));
         entity.setAbstract(DataMapHandler.TRUE.equalsIgnoreCase(attributes.getValue("abstract")));
         entity.setReadOnly(DataMapHandler.TRUE.equalsIgnoreCase(attributes.getValue("readOnly")));
-        entity.setServerOnly(DataMapHandler.TRUE.equalsIgnoreCase(attributes.getValue("serverOnly")));
         if ("optimistic".equals(attributes.getValue("", "lock-type"))) {
             entity.setDeclaredLockType(ObjEntity.LOCK_TYPE_OPTIMISTIC);
         }
@@ -137,7 +135,6 @@ public class ObjEntityHandler extends NamespaceAwareNestedTagHandler {
             entity.setSuperEntityName(superEntityName);
         } else {
             entity.setSuperClassName(attributes.getValue("superClassName"));
-            entity.setClientSuperClassName(attributes.getValue("clientSuperClassName"));
         }
         entity.setDbEntityName(attributes.getValue("dbEntityName"));
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ClientEntityResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ClientEntityResolver.java
deleted file mode 100644
index 2cc823e1b..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ClientEntityResolver.java
+++ /dev/null
@@ -1,64 +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
- *
- *    https://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.map;
-
-import org.apache.cayenne.reflect.ClassDescriptorFactory;
-import org.apache.cayenne.reflect.ClassDescriptorMap;
-import org.apache.cayenne.reflect.valueholder.ValueHolderDescriptorFactory;
-
-/**
- * An EntityResolver subclass that uses a different default {@link ClassDescriptorFactory}
- * that handles ValueHolder to-one relationships.
- * 
- * @since 3.0
- */
-class ClientEntityResolver extends EntityResolver {
-
-    ClientEntityResolver() {
-    }
-
-    @Override
-    public EntityResolver getClientEntityResolver() {
-        return this;
-    }
-
-    @Override
-    public ClassDescriptorMap getClassDescriptorMap() {
-
-        if (classDescriptorMap == null) {
-            ClassDescriptorMap classDescriptorMap = new ClassDescriptorMap(this);
-
-            classDescriptorMap.addFactory(new ValueHolderDescriptorFactory(
-                    classDescriptorMap));
-
-            // since ClassDescriptorMap is not synchronized, we need to prefill it with
-            // entity proxies here.
-            for (DataMap map : maps) {
-                for (String entityName : map.getObjEntityMap().keySet()) {
-                    classDescriptorMap.getDescriptor(entityName);
-                }
-            }
-
-            this.classDescriptorMap = classDescriptorMap;
-        }
-
-        return classDescriptorMap;
-
-    }
-}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjAttribute.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjAttribute.java
deleted file mode 100644
index e7e1a9861..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjAttribute.java
+++ /dev/null
@@ -1,70 +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
- *
- *    https://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.map;
-
-/**
- * A client version of ObjAttribute that has some properties from DbAttribute that the
- * client may want.
- * 
- * @since 3.0
- */
-class ClientObjAttribute extends ObjAttribute {
-
-    boolean mandatory;
-    int maxLength = -1;
-    private boolean primaryKey;
-
-    ClientObjAttribute(String name) {
-        super(name);
-    }
-    
-    @Override
-    public boolean isPrimaryKey() {
-        return primaryKey;
-    }
-
-    /**
-     * @see DbAttribute#isMandatory()
-     */
-    @Override
-    public boolean isMandatory() {
-        return mandatory;
-    }
-
-    public void setMandatory(boolean mandatory) {
-        this.mandatory = mandatory;
-    }
-
-    /**
-     * @see DbAttribute#getMaxLength()
-     */
-    @Override
-    public int getMaxLength() {
-        return maxLength;
-    }
-
-    public void setMaxLength(int maxLength) {
-        this.maxLength = maxLength;
-    }
-
-    
-    public void setPrimaryKey(boolean primaryKey) {
-        this.primaryKey = primaryKey;
-    }
-}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjEntity.java
deleted file mode 100644
index ad070ca88..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjEntity.java
+++ /dev/null
@@ -1,58 +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
- *
- *    https://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.map;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * A client version of ObjEntity that overrides server entity algorithms for accessing
- * some pieces of information
- * 
- * @since 3.0
- */
-class ClientObjEntity extends ObjEntity {
-
-    private Collection<ObjAttribute> primaryKeys;
-
-    ClientObjEntity(String name) {
-        super(name);
-        this.primaryKeys = Collections.emptyList();
-    }
-
-    @Override
-    public Collection<String> getPrimaryKeyNames() {
-        Collection<String> names = new ArrayList<>(primaryKeys.size());
-        for (ObjAttribute attribute : primaryKeys) {
-            names.add(attribute.getDbAttributePath());
-        }
-        return Collections.unmodifiableCollection(names);
-    }
-
-    @Override
-    public Collection<ObjAttribute> getPrimaryKeys() {
-        return Collections.unmodifiableCollection(primaryKeys);
-    }
-
-    void setPrimaryKeys(Collection<ObjAttribute> primaryKeys) {
-        this.primaryKeys = primaryKeys;
-    }
-}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjRelationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjRelationship.java
deleted file mode 100644
index 81cd83bb2..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ClientObjRelationship.java
+++ /dev/null
@@ -1,74 +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
- *
- *    https://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.map;
-
-/**
- * A read-only ObjRelationship relationship that caches some information that is
- * dynamically calculated in a superclass.
- * 
- * @since 1.2
- */
-class ClientObjRelationship extends ObjRelationship {
-
-    String reverseRelationshipName;
-
-    // note that field names are different from the ones defined by super for the same
-    // property... This is needed so that Hessian sreialization mechanism could work.
-    boolean clientReadOnly;
-    boolean clientToMany;
-
-    ClientObjRelationship(String name, String reverseRelationshipName, boolean toMany,
-            boolean readOnly) {
-
-        super(name);
-        this.clientToMany = toMany;
-        this.clientReadOnly = readOnly;
-        this.reverseRelationshipName = reverseRelationshipName;
-    }
-
-    @Override
-    public boolean isToMany() {
-        return clientToMany;
-    }
-
-    @Override
-    public boolean isReadOnly() {
-        return clientReadOnly;
-    }
-
-    @Override
-    public String getReverseRelationshipName() {
-        return reverseRelationshipName;
-    }
-
-    @Override
-    public ObjRelationship getReverseRelationship() {
-        if (reverseRelationshipName == null) {
-            return null;
-        }
-
-        ObjEntity target = getTargetEntity();
-        if (target == null) {
-            return null;
-        }
-
-        return target.getRelationship(reverseRelationshipName);
-    }
-}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
index 7ea152123..add212596 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DataMap.java
@@ -55,27 +55,6 @@ public class DataMap implements Serializable, ConfigurationNode, XMLSerializable
 
 	private static final long serialVersionUID = 4851901426473991657L;
 
-	/**
-	 * Defines whether a DataMap supports client entities.
-	 * 
-	 * @since 1.2
-	 */
-	public static final String CLIENT_SUPPORTED_PROPERTY = "clientSupported";
-
-	/**
-	 * Defines the name of the property for default client Java class package.
-	 * 
-	 * @since 1.2
-	 */
-	public static final String DEFAULT_CLIENT_PACKAGE_PROPERTY = "defaultClientPackage";
-
-	/**
-	 * Defines the name of the property for default client Java superclass.
-	 * 
-	 * @since 3.0
-	 */
-	public static final String DEFAULT_CLIENT_SUPERCLASS_PROPERTY = "defaultClientSuperclass";
-
 	/**
 	 * Defines the name of the property for default DB catalog.
 	 * 
@@ -133,10 +112,6 @@ public class DataMap implements Serializable, ConfigurationNode, XMLSerializable
 	protected String defaultSuperclass;
 	protected int defaultLockType;
 
-	protected boolean clientSupported;
-	protected String defaultClientPackage;
-	protected String defaultClientSuperclass;
-
 	private Map<String, Embeddable> embeddablesMap;
     private Map<String, ObjEntity> objEntityMap;
     private Map<String, DbEntity> dbEntityMap;
@@ -247,9 +222,6 @@ public class DataMap implements Serializable, ConfigurationNode, XMLSerializable
 		Object catalog = properties.get(DEFAULT_CATALOG_PROPERTY);
 		Object schema = properties.get(DEFAULT_SCHEMA_PROPERTY);
 		Object superclass = properties.get(DEFAULT_SUPERCLASS_PROPERTY);
-		Object clientEntities = properties.get(CLIENT_SUPPORTED_PROPERTY);
-		Object clientPackageName = properties.get(DEFAULT_CLIENT_PACKAGE_PROPERTY);
-		Object clientSuperclass = properties.get(DEFAULT_CLIENT_SUPERCLASS_PROPERTY);
 		Object quoteSqlIdentifier = properties.get(DEFAULT_QUOTE_SQL_IDENTIFIERS_PROPERTY);
 
 		this.defaultLockType = "optimistic".equals(lockType) ? ObjEntity.LOCK_TYPE_OPTIMISTIC
@@ -260,39 +232,6 @@ public class DataMap implements Serializable, ConfigurationNode, XMLSerializable
 		this.defaultSchema = (schema != null) ? schema.toString() : null;
 		this.defaultCatalog = (catalog != null) ? catalog.toString() : null;
 		this.defaultSuperclass = (superclass != null) ? superclass.toString() : null;
-		this.clientSupported = (clientEntities != null) && "true".equalsIgnoreCase(clientEntities.toString());
-		this.defaultClientPackage = (clientPackageName != null) ? clientPackageName.toString() : null;
-		this.defaultClientSuperclass = (clientSuperclass != null) ? clientSuperclass.toString() : null;
-	}
-
-	/**
-	 * Returns a DataMap stripped of any server-side information, such as
-	 * DbEntity mapping, or ObjEntities that are not allowed in the client tier.
-	 * Returns null if this DataMap as a whole does not support client tier
-	 * persistence.
-	 * 
-	 * @since 1.2
-	 */
-	public DataMap getClientDataMap(EntityResolver serverResolver) {
-		if (!isClientSupported()) {
-			return null;
-		}
-
-		DataMap clientMap = new DataMap(getName());
-
-		// create client entities for entities
-		for (ObjEntity entity : getObjEntities()) {
-			if (entity.isClientAllowed()) {
-				clientMap.addObjEntity(entity.getClientEntity());
-			}
-		}
-
-		// create proxies for named queries
-		for (QueryDescriptor q : getQueryDescriptors()) {
-			clientMap.addQueryDescriptor(q);
-		}
-
-		return clientMap;
 	}
 
 	/**
@@ -313,9 +252,6 @@ public class DataMap implements Serializable, ConfigurationNode, XMLSerializable
 				.property(DEFAULT_SCHEMA_PROPERTY, defaultSchema)
 				.property(DEFAULT_SUPERCLASS_PROPERTY, defaultSuperclass)
 				.property(DEFAULT_QUOTE_SQL_IDENTIFIERS_PROPERTY, quotingSQLIdentifiers)
-				.property(CLIENT_SUPPORTED_PROPERTY, clientSupported)
-				.property(DEFAULT_CLIENT_PACKAGE_PROPERTY, defaultClientPackage)
-				.property(DEFAULT_CLIENT_SUPERCLASS_PROPERTY, defaultClientSuperclass)
 				// elements
 				.nested(new TreeMap<>(getEmbeddableMap()), delegate)
 				.nested(new TreeMap<>(getProcedureMap()), delegate)
@@ -984,52 +920,6 @@ public class DataMap implements Serializable, ConfigurationNode, XMLSerializable
 		this.defaultLockType = defaultLockType;
 	}
 
-	/**
-	 * @since 1.2
-	 */
-	public boolean isClientSupported() {
-		return clientSupported;
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public void setClientSupported(boolean clientSupport) {
-		this.clientSupported = clientSupport;
-	}
-
-	/**
-	 * Returns default client package.
-	 * 
-	 * @since 1.2
-	 */
-	public String getDefaultClientPackage() {
-		return defaultClientPackage;
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public void setDefaultClientPackage(String defaultClientPackage) {
-		this.defaultClientPackage = defaultClientPackage;
-	}
-
-	/**
-	 * Returns default client superclass.
-	 * 
-	 * @since 3.0
-	 */
-	public String getDefaultClientSuperclass() {
-		return defaultClientSuperclass;
-	}
-
-	/**
-	 * @since 3.0
-	 */
-	public void setDefaultClientSuperclass(String defaultClientSuperclass) {
-		this.defaultClientSuperclass = defaultClientSuperclass;
-	}
-
 	/**
 	 * @since 1.1
 	 */
@@ -1254,16 +1144,6 @@ public class DataMap implements Serializable, ConfigurationNode, XMLSerializable
         }
     }
 
-    /**
-     *
-     * @return package + "." + name when it is possible otherwise just name
-     *
-     * @since 4.0
-     */
-    public String getNameWithDefaultClientPackage(String name) {
-        return getNameWithPackage(defaultClientPackage, name);
-    }
-
     public Map<String, ObjEntity> getSubclassesForObjEntity(ObjEntity superEntity) {
         Map<String, ObjEntity> subObjectEntities = new HashMap<>(5);
         for (ObjEntity objectEntity : objEntityMap.values()) {
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
index ad0fd28a2..09d31b12e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
@@ -84,7 +84,6 @@ public class EntityResolver implements MappingNamespace, Serializable {
 
     protected Collection<DataMap> maps;
     protected transient MappingNamespace mappingCache;
-    protected EntityResolver clientEntityResolver;
 
     // must be transient, as resolver may get deserialized in another VM, and
     // descriptor recompilation will be desired.
@@ -224,39 +223,6 @@ public class EntityResolver implements MappingNamespace, Serializable {
         this.callbackRegistry = callbackRegistry;
     }
 
-    /**
-     * Returns ClientEntityResolver with mapping information that only includes
-     * entities available on CWS Client Tier.
-     *
-     * @since 1.2
-     */
-    public EntityResolver getClientEntityResolver() {
-
-        if (clientEntityResolver == null) {
-
-            synchronized (this) {
-
-                if (clientEntityResolver == null) {
-
-                    EntityResolver resolver = new ClientEntityResolver();
-
-                    // translate to client DataMaps
-                    for (DataMap map : getDataMaps()) {
-                        DataMap clientMap = map.getClientDataMap(this);
-
-                        if (clientMap != null) {
-                            resolver.addDataMap(clientMap);
-                        }
-                    }
-
-                    clientEntityResolver = resolver;
-                }
-            }
-        }
-
-        return clientEntityResolver;
-    }
-
     /**
      * Returns all DbEntities.
      */
@@ -430,8 +396,6 @@ public class EntityResolver implements MappingNamespace, Serializable {
                 return new MappingCache(maps);
             }
         };
-
-        clientEntityResolver = null;
     }
 
     /**
@@ -508,37 +472,6 @@ public class EntityResolver implements MappingNamespace, Serializable {
         return result;
     }
 
-    /**
-     * <p>
-     * Looks in the DataMap's that this object was created with for the
-     * ObjEntity that maps to the services the specified class, with option to
-     * fallback to search by name with client resolver in case entity not found.
-     * </p>
-     * <p>
-     * This method can be used where entity class can be received from client.
-     * </p>
-     *
-     * @param entityClass entity class to search
-     * @param lookupClientResolver flag to fallback to client resolver
-     * @return the required ObjEntity or null if there is none that matches the
-     *         specifier
-     *
-     * @since 4.0
-     */
-    public ObjEntity getObjEntity(Class<?> entityClass, boolean lookupClientResolver) {
-        ObjEntity entity = getObjEntity(entityClass);
-        if(entity != null || !lookupClientResolver) {
-            return entity;
-        }
-
-        EntityResolver clientResolver = getClientEntityResolver();
-        if (clientResolver != this) {
-            ObjEntity clientEntity = clientResolver.getObjEntity(entityClass);
-            entity = clientEntity == null ? null : getObjEntity(clientEntity.getName());
-        }
-        return entity;
-    }
-
     public ObjEntity getObjEntity(Persistent object) {
         checkMappingCache();
         return mappingCache.getObjEntity(object);
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjAttribute.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjAttribute.java
index 4bc07780b..e614d306b 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjAttribute.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjAttribute.java
@@ -329,35 +329,6 @@ public class ObjAttribute extends Attribute implements ConfigurationNode {
         return dbAttribute == null ? -1 : dbAttribute.getMaxLength();
     }
 
-    /**
-     * Returns an ObjAttribute stripped of any server-side information, such as
-     * DbAttribute mapping.
-     * 
-     * @since 1.2
-     */
-    public ObjAttribute getClientAttribute() {
-        ClientObjAttribute attribute = new ClientObjAttribute(getName());
-        attribute.setType(getType());
-
-        DbAttribute dbAttribute = getDbAttribute();
-        if (dbAttribute != null) {
-
-            // expose PK attribute names - the client may need those to build
-            // ObjectIds
-            if (dbAttribute.isPrimaryKey()) {
-                attribute.setDbAttributePath(dbAttribute.getName());
-                attribute.setPrimaryKey(true);
-            }
-
-            attribute.setMandatory(isMandatory());
-            attribute.setMaxLength(getMaxLength());
-        }
-
-        // TODO: will likely need "userForLocking" property as well.
-
-        return attribute;
-    }
-
     /**
      * Updates DbAttributePath for this ObjAttribute
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
index 2ffaabf1c..b12e27390 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjEntity.java
@@ -78,9 +78,6 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
     protected int lockType;
 
     protected boolean _abstract;
-    protected boolean serverOnly;
-    protected String clientClassName;
-    protected String clientSuperClassName;
 
     protected CallbackMap callbacks;
 
@@ -120,9 +117,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
         }
 
         encoder.attribute("abstract", isAbstract())
-                .attribute("serverOnly", isServerOnly())
                 .attribute("className", getClassName())
-                .attribute("clientClassName", getClientClassName())
                 .attribute("readOnly", isReadOnly());
 
         if (getDeclaredLockType() == LOCK_TYPE_OPTIMISTIC) {
@@ -141,10 +136,6 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
             encoder.attribute("superClassName", getSuperClassName());
         }
 
-        if (getSuperEntityName() == null && getClientSuperClassName() != null) {
-            encoder.attribute("clientSuperClassName", getClientSuperClassName());
-        }
-
         if (qualifier != null) {
             encoder.start("qualifier").nested(qualifier, delegate).end();
         }
@@ -166,67 +157,6 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
         encoder.end();
     }
 
-    /**
-     * Returns an ObjEntity stripped of any server-side information, such as
-     * DbEntity mapping. "clientClassName" property of this entity is used to
-     * initialize "className" property of returned entity.
-     * 
-     * @since 1.2
-     */
-    public ObjEntity getClientEntity() {
-
-        ClientObjEntity entity = new ClientObjEntity(getName());
-        entity.setClassName(getClientClassName());
-        entity.setSuperClassName(getClientSuperClassName());
-        entity.setSuperEntityName(getSuperEntityName());
-        entity.setDeclaredQualifier(getDeclaredQualifier());
-
-        // TODO: should we also copy lock type?
-
-        Collection<ObjAttribute> primaryKeys = getMutablePrimaryKeys();
-        Collection<ObjAttribute> clientPK = new ArrayList<>(primaryKeys.size());
-
-        for (ObjAttribute attribute : getDeclaredAttributes()) {
-            ObjAttribute clientAttribute = attribute.getClientAttribute();
-            entity.addAttribute(clientAttribute);
-
-            if (primaryKeys.remove(attribute)) {
-                clientPK.add(clientAttribute);
-            }
-        }
-
-        // after all meaningful pks got removed, here we only have synthetic pks
-        // left...
-        for (ObjAttribute attribute : primaryKeys) {
-            ObjAttribute clientAttribute = attribute.getClientAttribute();
-            clientPK.add(clientAttribute);
-        }
-
-        entity.setPrimaryKeys(clientPK);
-
-        // copy relationships; skip runtime generated relationships
-        for (ObjRelationship relationship : getDeclaredRelationships()) {
-            if (relationship.isRuntime()) {
-                continue;
-            }
-
-            ObjEntity targetEntity = relationship.getTargetEntity();
-            // note that 'isClientAllowed' also checks parent DataMap client
-            // policy
-            // that can be handy in case of cross-map relationships
-            if (targetEntity == null || !targetEntity.isClientAllowed()) {
-                continue;
-            }
-
-            entity.addRelationship(relationship.getClientRelationship());
-        }
-
-        // TODO: andrus 2/5/2007 - copy embeddables
-        // TODO: andrus 2/5/2007 - copy callback methods
-
-        return entity;
-    }
-
     /**
      * Returns a non-null class name. For generic entities with no class
      * specified explicitly, default DataMap superclass is used, and if it is
@@ -331,17 +261,6 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
                 || (getDataMap() != null && className.equals(getDataMap().getDefaultSuperclass()));
     }
 
-    /**
-     * Returns true if this entity is allowed to be used on the client. Checks
-     * that parent DataMap allows client entities and also that this entity is
-     * not explicitly disabled for the client use.
-     * 
-     * @since 1.2
-     */
-    public boolean isClientAllowed() {
-        return getDataMap() != null && !isServerOnly() && getDataMap().isClientSupported();
-    }
-
     public boolean isAbstract() {
         return _abstract;
     }
@@ -353,24 +272,6 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
         this._abstract = isAbstract;
     }
 
-    /**
-     * Returns true if this entity is not available on the client.
-     * 
-     * @since 1.2
-     */
-    public boolean isServerOnly() {
-        return serverOnly;
-    }
-
-    /**
-     * Sets whether this entity is available on the client.
-     * 
-     * @since 1.2
-     */
-    public void setServerOnly(boolean serverOnly) {
-        this.serverOnly = serverOnly;
-    }
-
     /**
      * Returns a qualifier that imposes a restriction on what objects belong to
      * this entity. Returned qualifier is the one declared in this entity, and
@@ -424,24 +325,6 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
         this.className = className;
     }
 
-    /**
-     * Returns the name of ClientDataObject class described by this entity.
-     * 
-     * @since 1.2
-     */
-    public String getClientClassName() {
-        return clientClassName;
-    }
-
-    /**
-     * Sets the name of the ClientDataObject class described by this entity.
-     * 
-     * @since 1.2
-     */
-    public void setClientClassName(String clientClassName) {
-        this.clientClassName = clientClassName;
-    }
-
     /**
      * Returns a fully-qualified name of the super class of the DataObject
      * class. This value is used as a hint for class generation. If the entity
@@ -464,34 +347,6 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
         this.superClassName = superClassName;
     }
 
-    /**
-     * Returns a fully-qualified name of the client-side super class of the
-     * DataObject class. This value is used as a hint for class generation. If
-     * the entity inherits from another entity, a superclass is the class of
-     * that entity.
-     * 
-     * @since 1.2
-     */
-    public String getClientSuperClassName() {
-        ObjEntity superEntity = getSuperEntity();
-        return (superEntity != null) ? superEntity.getClientClassName() : clientSuperClassName;
-    }
-
-    /**
-     * Sets a fully-qualified name of the client-side super class of the
-     * ClientDataObject class. This value is used as a hint for class
-     * generation.
-     * <p>
-     * <i>An attempt to set superclass on an inherited entity has no effect,
-     * since a class of the super entity is always used as a superclass. </i>
-     * </p>
-     * 
-     * @since 1.2
-     */
-    public void setClientSuperClassName(String clientSuperClassName) {
-        this.clientSuperClassName = clientSuperClassName;
-    }
-
     /**
      * Returns a "super" entity in the entity inheritance hierarchy.
      * 
@@ -916,7 +771,7 @@ public class ObjEntity extends Entity implements ObjEntityListener, Configuratio
             return true;
         }
 
-        return (superEntity != null) ? superEntity.isSubentityOf(entity) : false;
+        return superEntity != null && superEntity.isSubentityOf(entity);
     }
 
     /**
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjRelationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjRelationship.java
index ed4ecd18f..fd6d19c19 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/ObjRelationship.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/ObjRelationship.java
@@ -721,27 +721,6 @@ public class ObjRelationship extends Relationship implements ConfigurationNode {
                 .append("dbRelationshipPath", getDbRelationshipPath()).toString();
     }
 
-    /**
-     * Returns an ObjAttribute stripped of any server-side information, such as
-     * DbAttribute mapping.
-     * 
-     * @since 1.2
-     */
-    public ObjRelationship getClientRelationship() {
-        ObjRelationship reverse = getReverseRelationship();
-        String reverseName = reverse != null ? reverse.getName() : null;
-
-        ObjRelationship relationship = new ClientObjRelationship(getName(), reverseName, isToMany(), isReadOnly());
-
-        relationship.setTargetEntityName(getTargetEntityName());
-        relationship.setDeleteRule(getDeleteRule());
-        relationship.setCollectionType(getCollectionType());
-
-        // TODO: copy locking flag...
-
-        return relationship;
-    }
-
     /**
      * Returns the interface of collection mapped by a to-many relationship.
      * Returns null for to-one relationships. Default for to-many is
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/SyntheticPKObjAttribute.java b/cayenne-server/src/main/java/org/apache/cayenne/map/SyntheticPKObjAttribute.java
index f4bf881a4..b68ca3cd8 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/SyntheticPKObjAttribute.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/SyntheticPKObjAttribute.java
@@ -29,25 +29,6 @@ class SyntheticPKObjAttribute extends ObjAttribute {
     SyntheticPKObjAttribute(String name) {
         super(name);
     }
-
-    @Override
-    public ObjAttribute getClientAttribute() {
-        ClientObjAttribute attribute = new ClientObjAttribute(getName());
-        attribute.setType(getType());
-
-        // unconditionally expose DbAttribute path and configure as mandatory.
-        attribute.setDbAttributePath(dbAttributePath);
-        attribute.setMandatory(true);
-
-        DbAttribute dbAttribute = getDbAttribute();
-        if (dbAttribute != null) {
-            attribute.setMaxLength(dbAttribute.getMaxLength());
-        }
-
-        // TODO: will likely need "userForLocking" property as well.
-
-        return attribute;
-    }
     
     @Override
     public boolean isPrimaryKey() {
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
index 576ba8877..4c594a923 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/BaseQueryMetadata.java
@@ -102,7 +102,7 @@ class BaseQueryMetadata implements QueryMetadata, Serializable {
 
 			if (root != null) {
 				if (root instanceof Class<?>) {
-					entity = resolver.getObjEntity((Class<?>) root, true);
+					entity = resolver.getObjEntity((Class<?>) root);
 					if (entity != null) {
 						this.dbEntity = entity.getDbEntity();
 						this.dataMap = entity.getDataMap();
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
index 0fe1e4d8e..1659ea8d4 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectById.java
@@ -465,7 +465,7 @@ public class SelectById<T> extends IndirectQuery implements Select<T> {
 
 		@Override
 		public ObjEntity resolve(EntityResolver resolver) {
-			return resolver.getObjEntity(entityType, true);
+			return resolver.getObjEntity(entityType);
 		}
 	}
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ToCacheKeyTraversalHandler.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ToCacheKeyTraversalHandler.java
index add2be4f4..546e4d462 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ToCacheKeyTraversalHandler.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ToCacheKeyTraversalHandler.java
@@ -92,8 +92,6 @@ class ToCacheKeyTraversalHandler implements TraversalHandler {
         } else {
             ValueObjectType<Object, ?> valueObjectType;
             if (registry == null || (valueObjectType = registry.getValueType(leaf.getClass())) == null) {
-                // Registry will be null in cayenne-client context.
-                // Maybe we shouldn't create cache key at all in that case...
                 out.append(leaf);
             } else {
                 out.append(valueObjectType.toCacheKey(leaf));
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java b/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java
deleted file mode 100644
index 8884e0420..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/ObjectDetachOperation.java
+++ /dev/null
@@ -1,205 +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
- *
- *    https://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.util;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.Persistent;
-import org.apache.cayenne.access.AttributeFault;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.query.PrefetchTreeNode;
-import org.apache.cayenne.reflect.*;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * An operation that creates a subgraph of detached objects, using the PrefetchTree to
- * delineate the graph boundaries. Target objects can be described by a different set of
- * descriptors, thus allowing server-to-client conversion to happen in the process.
- * 
- * @since 1.2
- */
-public class ObjectDetachOperation {
-
-    protected EntityResolver targetResolver;
-    protected Map<ObjectId, Persistent> seen;
-
-    public ObjectDetachOperation(EntityResolver targetResolver) {
-        this.targetResolver = targetResolver;
-        this.seen = new HashMap<>();
-    }
-
-    public void reset() {
-        seen.clear();
-    }
-
-    /**
-     * "Detaches" an object from its context by creating an unattached copy. The copy is
-     * created using target descriptor of this operation that may be different from the
-     * object descriptor passed to this method.
-     */
-    public Object detach(
-            Object object,
-            ClassDescriptor descriptor,
-            final PrefetchTreeNode prefetchTree) {
-        if (!(object instanceof Persistent)) {
-            throw new CayenneRuntimeException("Expected Persistent, got: %s", object);
-        }
-
-        final Persistent source = (Persistent) object;
-        ObjectId id = source.getObjectId();
-
-        // sanity check
-        if (id == null) {
-            throw new CayenneRuntimeException("Server returned an object without an id: %s", source);
-        }
-
-        Object seenTarget = seen.get(id);
-        if (seenTarget != null) {
-            return seenTarget;
-        }
-
-        descriptor = descriptor.getSubclassDescriptor(source.getClass());
-
-        // presumably id's entity name should be of the right subclass.
-        final ClassDescriptor targetDescriptor = targetResolver.getClassDescriptor(id
-                .getEntityName());
-
-        final Persistent target = (Persistent) targetDescriptor.createObject();
-        target.setObjectId(id);
-        seen.put(id, target);
-
-        descriptor.visitProperties(new PropertyVisitor() {
-
-            private void fillReverseRelationship(Object destinationTarget, ArcProperty property) {
-                ArcProperty clientProperty = (ArcProperty) targetDescriptor.getProperty(property.getName());
-                if (clientProperty != null) {
-                    ArcProperty clientReverse = clientProperty.getComplimentaryReverseArc();
-
-                    if (clientReverse instanceof ToOneProperty) {
-                        clientReverse.writeProperty(destinationTarget, null, target);
-                    }
-                }
-            }
-
-            public boolean visitToOne(ToOneProperty property) {
-                if (prefetchTree != null) {
-
-                    PrefetchTreeNode child = prefetchTree.getNode(property.getName());
-
-                    if (child != null) {
-                        Object destinationSource = property.readProperty(source);
-
-                        Object destinationTarget = destinationSource != null ? detach(
-                                destinationSource,
-                                property.getTargetDescriptor(),
-                                child) : null;
-                                
-                        if (destinationTarget != null) {
-                            fillReverseRelationship(destinationTarget, property);
-                        }
-
-                        ToOneProperty targetProperty = (ToOneProperty) targetDescriptor
-                                .getProperty(property.getName());
-                        Object oldTarget = targetProperty.isFault(target)
-                                ? null
-                                : targetProperty.readProperty(target);
-                        targetProperty
-                                .writeProperty(target, oldTarget, destinationTarget);
-                    }
-                }
-
-                return true;
-            }
-
-            public boolean visitToMany(ToManyProperty property) {
-                if (prefetchTree != null) {
-                    PrefetchTreeNode child = prefetchTree.getNode(property.getName());
-
-                    if (child != null) {
-                        Object value = property.readProperty(source);
-                        Object targetValue; 
-                        
-                        if (property instanceof ToManyMapProperty) {
-                            Map<?, ?> map = (Map) value;
-                            Map targetMap = new HashMap();
-                            
-                            for (Entry entry : map.entrySet()) {
-                                Object destinationSource = entry.getValue();
-                                Object destinationTarget = destinationSource != null
-                                    ? detach(destinationSource, property
-                                        .getTargetDescriptor(), child)
-                                        : null;
-                                
-                                if (destinationTarget != null) {
-                                    fillReverseRelationship(destinationTarget, property);
-                                }
-
-                                targetMap.put(entry.getKey(), destinationTarget);
-                            }
-                            targetValue = targetMap;
-                        }
-                        else {
-                            Collection collection = (Collection) value;
-                            Collection targetCollection = new ArrayList(collection.size());
-    
-                            for (Object destinationSource : collection) {
-                                Object destinationTarget = destinationSource != null
-                                        ? detach(destinationSource, property
-                                                .getTargetDescriptor(), child)
-                                        : null;
-                                        
-                                if (destinationTarget != null) {
-                                  	fillReverseRelationship(destinationTarget, property);
-                                }
-                                
-                                targetCollection.add(destinationTarget);
-                            }
-                            targetValue = targetCollection;
-                        }
-
-                        ToManyProperty targetProperty = (ToManyProperty) targetDescriptor
-                                .getProperty(property.getName());
-                        targetProperty.writeProperty(target, null, targetValue);
-                    }
-                }
-
-                return true;
-            }
-
-            public boolean visitAttribute(AttributeProperty property) {
-                PropertyDescriptor targetProperty = targetDescriptor
-                        .getProperty(property.getName());
-                if (!property.getAttribute().isLazy()) {
-                    targetProperty.writeProperty(target, null, property.readProperty(source));
-                } else {
-                    targetProperty.writeProperty(target, null, new AttributeFault(property));
-                }
-                return true;
-            }
-        });
-
-        return target;
-    }
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjEntityHandlerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjEntityHandlerTest.java
index ce8f40965..113c40331 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjEntityHandlerTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/ObjEntityHandlerTest.java
@@ -37,28 +37,19 @@ public class ObjEntityHandlerTest extends BaseHandlerTest {
         final DataMap map = new DataMap();
         assertEquals(0, map.getObjEntities().size());
 
-        parse("obj-entity", new HandlerFactory() {
-            @Override
-            public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent) {
-                return new ObjEntityHandler(parent, map);
-            }
-        });
+        parse("obj-entity", parent -> new ObjEntityHandler(parent, map));
 
         assertEquals(1, map.getObjEntities().size());
         ObjEntity entity = map.getObjEntity("ArtistCallback");
         assertNotNull(entity);
         assertTrue(entity.isAbstract());
         assertTrue(entity.isReadOnly());
-        assertTrue(entity.isServerOnly());
-        assertFalse(entity.isClientAllowed());
         assertEquals(3, entity.getAttributes().size());
         assertEquals(8, entity.getCallbackMethods().size());
         assertEquals(ObjEntity.LOCK_TYPE_OPTIMISTIC, entity.getDeclaredLockType());
         assertEquals("org.apache.cayenne.testdo.testmap.ArtistCallback", entity.getClassName());
         assertNull("super.class should be suppressed by super entity", entity.getSuperClassName());
         assertEquals("Artist", entity.getSuperEntityName());
-        assertEquals("client.class", entity.getClientClassName());
-        assertNull("client.super.class should be suppressed by super entity", entity.getClientSuperClassName());
         assertEquals("ARTIST_CT", entity.getDbEntityName());
 
         ObjAttribute attribute = entity.getAttribute("artistName");
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataMapLoaderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataMapLoaderTest.java
index 2b0b200b1..2c4ae7f21 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataMapLoaderTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/xml/XMLDataMapLoaderTest.java
@@ -89,7 +89,6 @@ public class XMLDataMapLoaderTest {
         assertNull(map.getDefaultCatalog());
         assertNull(map.getDefaultSchema());
         assertNull(map.getDefaultPackage());
-        assertFalse(map.isClientSupported());
     }
 
     @Test
@@ -109,7 +108,6 @@ public class XMLDataMapLoaderTest {
         assertEquals("TEST_CATALOG", map.getDefaultCatalog());
         assertNull(map.getDefaultSchema());
         assertEquals("org.apache.cayenne.testdo.testmap", map.getDefaultPackage());
-        assertTrue(map.isClientSupported());
 
         // check some loaded content
         assertEquals("org.apache.cayenne.testdo.testmap.Artist",
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/ClientEntityResolverIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/ClientEntityResolverIT.java
deleted file mode 100644
index 9d0d68d8c..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/ClientEntityResolverIT.java
+++ /dev/null
@@ -1,103 +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
- *
- *    https://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.map;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.MtTable1;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.fail;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class ClientEntityResolverIT extends ServerCase {
-
-    @Inject
-    private EntityResolver serverResolver;
-
-    @Test
-    public void testGetClientEntityResolver() {
-
-        EntityResolver clientResolver = serverResolver.getClientEntityResolver();
-        assertNotNull(clientResolver);
-
-        // make sure that client entities got translated properly...
-
-        try {
-            assertNotNull(clientResolver.getObjEntity("MtTable1"));
-        } catch (CayenneRuntimeException e) {
-            fail("'MtTable1' entity is not mapped. All entities: " + clientResolver.getObjEntities());
-        }
-
-        assertNotNull(clientResolver.getObjEntity(ClientMtTable1.class));
-        assertNull(clientResolver.getObjEntity(MtTable1.class));
-    }
-
-    @Test
-    public void testConstructor() {
-        ObjEntity entity = new ObjEntity("test_entity");
-        entity.setClassName("java.lang.String");
-        DataMap dataMap = new DataMap("test");
-        dataMap.addObjEntity(entity);
-        Collection<DataMap> maps = Collections.singleton(dataMap);
-        EntityResolver resolver = new EntityResolver(maps);
-
-        assertSame(entity, resolver.getObjEntity(entity.getName()));
-        assertNotNull(resolver.getObjEntity(entity.getName()));
-    }
-
-    @Test
-    public void testInheritance() {
-        ObjEntity superEntity = new ObjEntity("super_entity");
-        superEntity.setClassName("java.lang.Object");
-
-        ObjEntity subEntity = new ObjEntity("sub_entity");
-        subEntity.setClassName("java.lang.String");
-
-        subEntity.setSuperEntityName(superEntity.getName());
-
-        try {
-            subEntity.getSuperEntity();
-            fail("hmm... superentity can't possibly be resolved at this point.");
-        } catch (CayenneRuntimeException e) {
-            // expected
-        }
-
-        DataMap dataMap = new DataMap("test");
-        dataMap.addObjEntity(superEntity);
-        dataMap.addObjEntity(subEntity);
-        Collection<DataMap> maps = Collections.singleton(dataMap);
-        new EntityResolver(maps);
-
-        // after registration with resolver super entity should resolve just
-        // fine
-        assertSame(superEntity, subEntity.getSuperEntity());
-    }
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/ClientObjectRelationshipTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/ClientObjectRelationshipTest.java
deleted file mode 100644
index 6a424263f..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/ClientObjectRelationshipTest.java
+++ /dev/null
@@ -1,48 +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
- *
- *    https://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.map;
-
-import org.apache.cayenne.util.Util;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-public class ClientObjectRelationshipTest {
-
-    @Test
-    public void testSerializability() throws Exception {
-
-        ClientObjRelationship r1 = new ClientObjRelationship("r1", "rr1", true, true);
-        ClientObjRelationship r2 = (ClientObjRelationship) Util.cloneViaSerialization(r1);
-        assertEquals(r1.getName(), r2.getName());
-        assertEquals(r1.getReverseRelationship(), r2.getReverseRelationship());
-        assertEquals(r1.isToMany(), r2.isToMany());
-        assertEquals(r1.isReadOnly(), r2.isReadOnly());
-
-        ClientObjRelationship r3 = new ClientObjRelationship("r3", null, false, false);
-        ClientObjRelationship r4 = (ClientObjRelationship) Util.cloneViaSerialization(r3);
-        assertEquals(r3.getName(), r4.getName());
-        assertNull(r4.getReverseRelationship());
-        assertEquals(r3.isToMany(), r4.isToMany());
-        assertEquals(r3.isReadOnly(), r4.isReadOnly());
-    }
-
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
index b759da467..573e1c1c0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/DataMapTest.java
@@ -57,21 +57,6 @@ public class DataMapTest {
         assertNotNull(d2.getObjEntity(oe1.getName()));
     }
 
-    @Test
-    public void testInitWithProperties() {
-        Map<String, Object> properties = new HashMap<>();
-        properties.put(DataMap.CLIENT_SUPPORTED_PROPERTY, "true");
-        properties.put(DataMap.DEFAULT_CLIENT_PACKAGE_PROPERTY, "aaaaa");
-
-        DataMap map = new DataMap();
-        map.initWithProperties(properties);
-
-        assertTrue(map.isClientSupported());
-        assertEquals("aaaaa", map.getDefaultClientPackage());
-
-        // TODO: test other defaults
-    }
-
     @Test
     public void testDefaultSchema() {
         DataMap map = new DataMap();
@@ -84,30 +69,6 @@ public class DataMapTest {
         assertNull(map.getDefaultSchema());
     }
 
-    @Test
-    public void testDefaultClientPackage() {
-        DataMap map = new DataMap();
-        String tstPackage = "tst.pkg";
-        assertNull(map.getDefaultClientPackage());
-        map.setDefaultClientPackage(tstPackage);
-        assertEquals(tstPackage, map.getDefaultClientPackage());
-
-        map.setDefaultClientPackage(null);
-        assertNull(map.getDefaultClientPackage());
-    }
-
-    @Test
-    public void testDefaultClientSuperclass() {
-        DataMap map = new DataMap();
-        String tstSuperclass = "tst_superclass";
-        assertNull(map.getDefaultClientSuperclass());
-        map.setDefaultClientSuperclass(tstSuperclass);
-        assertEquals(tstSuperclass, map.getDefaultClientSuperclass());
-
-        map.setDefaultClientSuperclass(null);
-        assertNull(map.getDefaultClientSuperclass());
-    }
-
     @Test
     public void testDefaultPackage() {
         DataMap map = new DataMap();
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjAttributeTest.java b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjAttributeTest.java
index 4d23b79a5..701fd41d0 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjAttributeTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjAttributeTest.java
@@ -67,17 +67,6 @@ public class ObjAttributeTest {
         assertEquals(a1.getName(), a2.getName());
     }
 
-    @Test
-    public void testGetClientAttribute() {
-        ObjAttribute a1 = new ObjAttribute("a1");
-        a1.setType("x.y.z");
-
-        ObjAttribute a2 = a1.getClientAttribute();
-        assertNotNull(a2);
-        assertEquals(a1.getName(), a2.getName());
-        assertEquals(a1.getType(), a2.getType());
-    }
-
     @Test
     public void testGetJavaClass() throws Exception {
 
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityIT.java
index cad6e08e7..dee3ddf9d 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjEntityIT.java
@@ -102,30 +102,12 @@ public class ObjEntityIT extends ServerCase {
         assertNull(pk.getEntity());
         assertFalse(artistE.getAttributes().contains(pk));
 
-        ObjEntity clientArtistE = artistE.getClientEntity();
-        Collection<ObjAttribute> clientpks = clientArtistE.getPrimaryKeys();
-        assertEquals(1, clientpks.size());
-        ObjAttribute clientPk = clientpks.iterator().next();
-        assertEquals("java.lang.Long", clientPk.getType());
-        assertEquals("ARTIST_ID", clientPk.getDbAttributePath());
-        assertEquals("artistId", clientPk.getName());
-        assertNull(clientPk.getEntity());
-        assertFalse(clientArtistE.getAttributes().contains(pk));
-
         ObjEntity meaningfulPKE = runtime.getDataDomain().getEntityResolver().getObjEntity("MeaningfulGeneratedColumnTestEntity");
         Collection<ObjAttribute> mpks = meaningfulPKE.getPrimaryKeys();
         assertEquals(1, mpks.size());
 
         ObjAttribute mpk = mpks.iterator().next();
         assertTrue(meaningfulPKE.getAttributes().contains(mpk));
-
-        ObjEntity clientMeaningfulPKE = meaningfulPKE.getClientEntity();
-        Collection<ObjAttribute> clientmpks = clientMeaningfulPKE.getPrimaryKeys();
-        assertEquals(1, clientmpks.size());
-
-        ObjAttribute clientmpk = clientmpks.iterator().next();
-        assertEquals("java.lang.Integer", clientmpk.getType());
-        assertTrue(clientMeaningfulPKE.getAttributes().contains(clientmpk));
     }
 
     @Test
@@ -186,33 +168,6 @@ public class ObjEntityIT extends ServerCase {
         assertTrue(e1.isGeneric());
     }
 
-    @Test
-    public void testServerOnly() {
-        ObjEntity e1 = new ObjEntity("e1");
-
-        assertFalse(e1.isServerOnly());
-        e1.setServerOnly(true);
-        assertTrue(e1.isServerOnly());
-    }
-
-    @Test
-    public void testClientAllowed() {
-        ObjEntity e1 = new ObjEntity("e1");
-
-        assertFalse("No parent DataMap should have automatically disabled client.", e1.isClientAllowed());
-
-        DataMap map = new DataMap("m1");
-        e1.setDataMap(map);
-
-        assertFalse(e1.isClientAllowed());
-
-        map.setClientSupported(true);
-        assertTrue(e1.isClientAllowed());
-
-        e1.setServerOnly(true);
-        assertFalse(e1.isClientAllowed());
-    }
-
     @Test
     public void testGetPrimaryKeyNames() {
         ObjEntity entity = new ObjEntity("entity");
@@ -249,44 +204,6 @@ public class ObjEntityIT extends ServerCase {
         assertTrue(entity.getPrimaryKeyNames().contains(pk2.getName()));
     }
 
-    @Test
-    public void testGetClientEntity() {
-
-        DataMap map = new DataMap();
-        map.setClientSupported(true);
-
-        final ObjEntity target = new ObjEntity("te1");
-        map.addObjEntity(target);
-
-        ObjEntity e1 = new ObjEntity("entity");
-        e1.setClassName("x.y.z");
-        e1.setClientClassName("a.b.c");
-        e1.addAttribute(new ObjAttribute("A1"));
-        e1.addAttribute(new ObjAttribute("A2"));
-        map.addObjEntity(e1);
-
-        DbEntity dbentity = new DbEntity("dbe");
-        map.addDbEntity(dbentity);
-        e1.setDbEntity(dbentity);
-
-        ObjRelationship r1 = new ObjRelationship("r1") {
-
-            @Override
-            public ObjEntity getTargetEntity() {
-                return target;
-            }
-        };
-
-        e1.addRelationship(r1);
-
-        ObjEntity e2 = e1.getClientEntity();
-        assertNotNull(e2);
-        assertEquals(e1.getName(), e2.getName());
-        assertEquals(e1.getClientClassName(), e2.getClassName());
-        assertEquals(e1.getAttributes().size(), e2.getAttributes().size());
-        assertEquals(e1.getRelationships().size(), e2.getRelationships().size());
-    }
-
     @Test
     public void testSerializability() throws Exception {
         ObjEntity entity = new ObjEntity("entity");
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
index 40a28c3c8..7c1b8ef05 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/ObjRelationshipIT.java
@@ -113,27 +113,6 @@ public class ObjRelationshipIT extends ServerCase {
         assertEquals(r1.getDbRelationshipPath(), r2.getDbRelationshipPath());
     }
 
-    @Test
-    public void testGetClientRelationship() {
-        final ObjEntity target = new ObjEntity("te1");
-        ObjRelationship r1 = new ObjRelationship("r1") {
-
-            @Override
-            public ObjEntity getTargetEntity() {
-                return target;
-            }
-        };
-
-        r1.setDeleteRule(DeleteRule.DENY);
-        r1.setTargetEntityName("te1");
-
-        ObjRelationship r2 = r1.getClientRelationship();
-        assertNotNull(r2);
-        assertEquals(r1.getName(), r2.getName());
-        assertEquals(r1.getTargetEntityName(), r2.getTargetEntityName());
-        assertEquals(r1.getDeleteRule(), r2.getDeleteRule());
-    }
-
     @Test
     public void testGetReverseDbRelationshipPath() {
         ObjEntity artistObjEnt = runtime.getDataDomain().getEntityResolver().getObjEntity("Artist");
diff --git a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
index 9ac93291a..03eac5a66 100644
--- a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
+++ b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
@@ -29,7 +29,6 @@ import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClassGenerationActionFactory;
-import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -57,13 +56,6 @@ public class CayenneGeneratorMojo extends AbstractMojo {
     @Parameter
 	private File additionalMaps;
 
-	/**
-	 * Whether we are generating classes for the client tier in a Remote Object
-	 * Persistence application. Default is <code>false</code>.
-	 */
-	@Parameter
-	private Boolean client;
-
 	/**
 	 * Default destination directory for Java classes (ignoring their package names).
 	 */
@@ -260,7 +252,6 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 
 			CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
 			filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(logger, null, excludeEmbeddables));
-			filterEntityAction.setClient(generator.getCgenConfiguration().isClient());
 			generator.setLogger(logger);
 
 			if(force) {
@@ -300,7 +291,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	}
 
 	private boolean hasConfig() {
-		return destDir != null || encoding != null || client != null || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
+		return destDir != null || encoding != null || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
 				makePairs != null || mode != null || outputPattern != null || overwrite != null || superPkg != null ||
 				superTemplate != null || template != null || embeddableTemplate != null || embeddableSuperTemplate != null ||
 				usePkgPath != null || createPropertyNames != null || force || queryTemplate != null ||
@@ -327,7 +318,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 			return cgenConfiguration;
 		} else {
 			logger.info("Using default cgen config.");
-			cgenConfiguration = new CgenConfiguration(false);
+			cgenConfiguration = new CgenConfiguration();
 			cgenConfiguration.setDataMap(dataMap);
 			cgenConfiguration.setRelPath(defaultDir.getPath());
 			return cgenConfiguration;
@@ -335,7 +326,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	}
 
 	private CgenConfiguration cgenConfigFromPom(DataMap dataMap){
-		CgenConfiguration cgenConfiguration = new CgenConfiguration(client != null ? client : false);
+		CgenConfiguration cgenConfiguration = new CgenConfiguration();
 		cgenConfiguration.setDataMap(dataMap);
 		cgenConfiguration.setRelPath(destDir != null ? destDir.getPath() : defaultDir.getPath());
 		cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
@@ -359,13 +350,13 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		cgenConfiguration.setExternalToolConfig(externalToolConfig != null ? externalToolConfig : cgenConfiguration.getExternalToolConfig());
 		if(!cgenConfiguration.isMakePairs()) {
 			if(template == null) {
-				cgenConfiguration.setTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+				cgenConfiguration.setTemplate(ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
 			}
 			if(embeddableTemplate == null) {
 				cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
 			}
 			if(queryTemplate == null) {
-				cgenConfiguration.setQueryTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+				cgenConfiguration.setQueryTemplate(ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
 			}
 		}
 		return cgenConfiguration;
diff --git a/maven-plugins/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java b/maven-plugins/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
index 7dad7f11e..c098b51bc 100644
--- a/maven-plugins/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
+++ b/maven-plugins/cayenne-tools-itest/src/test/java/org/apache/cayenne/tools/CayenneGeneratorIntegrationTest.java
@@ -106,16 +106,6 @@ public class CayenneGeneratorIntegrationTest {
                 "org.apache.cayenne.testdo.testmap.superart", "BaseDataObject");
     }
 
-    @Test
-    public void testPairs1_client() throws Exception {
-        startTest("pairs1-client");
-
-        assertContents("org/apache/cayenne/testdo/testmap/client/Artist.java", "Artist", "org.apache.cayenne.testdo.testmap.client",
-                "_Artist");
-        assertContents("org/apache/cayenne/testdo/testmap/client/superart/_Artist.java", "_Artist",
-                "org.apache.cayenne.testdo.testmap.client.superart", "PersistentObject");
-    }
-
     @Test
     public void testPairsEmbeddable3() throws Exception {
         startTest("pairs-embeddables3");
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
index ca1484aee..798975d05 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java
@@ -30,7 +30,6 @@ import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
 
 import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.resource.Resource;
 import org.slf4j.Logger;
@@ -44,8 +43,6 @@ public class CodeTemplateManager {
 	public static final String STANDARD_SERVER_SUPERCLASS = "Standard Server Superclass";
 	public static final String STANDARD_SERVER_SUBCLASS = "Standard Server Subclass";
 	public static final String SINGLE_SERVER_CLASS = "Single Server Class";
-	static final String STANDARD_CLIENT_SUPERCLASS = "Standard Client Superclass";
-	static final String STANDARD_CLIENT_SUBCLASS = "Standard Client Subclass";
 
 	private static final String STANDARD_EMBEDDABLE_SUPERCLASS = "Standard Embeddable Superclass";
 	private static final String STANDARD_EMBEDDABLE_SUBCLASS = "Standard Embeddable Subclass";
@@ -53,16 +50,12 @@ public class CodeTemplateManager {
 
 	private static final String STANDARD_SERVER_DATAMAP_SUPERCLASS = "Standard Server DataMap Superclass";
 	private static final String STANDARD_SERVER_DATAMAP_SUBCLASS = "Standard Server DataMap Subclass";
-	private static final String STANDARD_CLIENT_DATAMAP_SUPERCLASS = "Standard Client DataMap Superclass";
-	private static final String STANDARD_CLIENT_DATAMAP_SUBCLASS = "Standard Client DataMap Subclass";
 	private static final String SINGLE_DATAMAP_CLASS = "Single DataMap Class";
 
 	public static final String NODE_NAME = "codeTemplateManager";
 
 	private List<String> defaultSubclassTemplates;
 	private List<String> defaultSuperclassTemplates;
-	private List<String> defaultClientSubclassTemplates;
-	private List<String> defaultClientSuperclassTemplates;
 	private Map<String, String> customTemplates;
 	private Map<String, String> reverseCustomTemplate;
 	private Map<String, String> defaultTemplates;
@@ -72,8 +65,6 @@ public class CodeTemplateManager {
 
 	private List<String> defaultServerDataMapTemplates;
 	private List<String> defaultServerDataMapSuperclassTemplates;
-	private List<String> defaultClientDataMapTemplates;
-	private List<String> defaultClientDataMapSuperclassTemplates;
 
 	private Map<String, String> reverseDefaultsTemplates;
 
@@ -92,16 +83,10 @@ public class CodeTemplateManager {
 		defaultSuperclassTemplates = new ArrayList<>(2);
 		defaultSuperclassTemplates.add(STANDARD_SERVER_SUPERCLASS);
 
-		defaultClientSuperclassTemplates = new ArrayList<>();
-		defaultClientSuperclassTemplates.add(STANDARD_CLIENT_SUPERCLASS);
-
 		defaultSubclassTemplates = new ArrayList<>(2);
 		defaultSubclassTemplates.add(SINGLE_SERVER_CLASS);
 		defaultSubclassTemplates.add(STANDARD_SERVER_SUBCLASS);
 
-		defaultClientSubclassTemplates = new ArrayList<>();
-		defaultClientSubclassTemplates.add(STANDARD_CLIENT_SUBCLASS);
-
 		defaultEmbeddableTemplates = new ArrayList<>();
 		defaultEmbeddableTemplates.add(STANDARD_EMBEDDABLE_SUBCLASS);
 		defaultEmbeddableTemplates.add(SINGLE_EMBEDDABLE_CLASS);
@@ -115,12 +100,6 @@ public class CodeTemplateManager {
 
 		defaultServerDataMapSuperclassTemplates = new ArrayList<>();
 		defaultServerDataMapSuperclassTemplates.add(STANDARD_SERVER_DATAMAP_SUPERCLASS);
-		
-		defaultClientDataMapTemplates = new ArrayList<>();
-		defaultClientDataMapTemplates.add(STANDARD_CLIENT_DATAMAP_SUBCLASS);
-		
-		defaultClientDataMapSuperclassTemplates = new ArrayList<>();
-		defaultClientDataMapSuperclassTemplates.add(STANDARD_CLIENT_DATAMAP_SUPERCLASS);
 
 		updateCustomTemplates(getTemplatePreferences(application));
 		reverseCustomTemplate = new HashMap<>();
@@ -130,9 +109,7 @@ public class CodeTemplateManager {
 
 		defaultTemplates = new HashMap<>();
 		defaultTemplates.put(STANDARD_SERVER_SUPERCLASS, ClassGenerationAction.SUPERCLASS_TEMPLATE);
-		defaultTemplates.put(STANDARD_CLIENT_SUPERCLASS, ClientClassGenerationAction.SUPERCLASS_TEMPLATE);
 		defaultTemplates.put(STANDARD_SERVER_SUBCLASS, ClassGenerationAction.SUBCLASS_TEMPLATE);
-		defaultTemplates.put(STANDARD_CLIENT_SUBCLASS, ClientClassGenerationAction.SUBCLASS_TEMPLATE);
 		defaultTemplates.put(SINGLE_SERVER_CLASS, ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
 
 		defaultTemplates.put(STANDARD_EMBEDDABLE_SUPERCLASS, ClassGenerationAction.EMBEDDABLE_SUPERCLASS_TEMPLATE);
@@ -140,10 +117,8 @@ public class CodeTemplateManager {
 		defaultTemplates.put(SINGLE_EMBEDDABLE_CLASS, ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
 
 		defaultTemplates.put(STANDARD_SERVER_DATAMAP_SUBCLASS, ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE);
-		defaultTemplates.put(STANDARD_CLIENT_DATAMAP_SUBCLASS, ClientClassGenerationAction.DMAP_SUBCLASS_TEMPLATE);
 		defaultTemplates.put(SINGLE_DATAMAP_CLASS, ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
 		defaultTemplates.put(STANDARD_SERVER_DATAMAP_SUPERCLASS, ClassGenerationAction.DATAMAP_SUPERCLASS_TEMPLATE);
-		defaultTemplates.put(STANDARD_CLIENT_DATAMAP_SUPERCLASS, ClientClassGenerationAction.DMAP_SUPERCLASS_TEMPLATE);
 
 		reverseDefaultsTemplates = new HashMap<>();
 		for(Map.Entry<String, String> entry : defaultTemplates.entrySet()){
@@ -242,18 +217,10 @@ public class CodeTemplateManager {
 		return defaultSubclassTemplates;
 	}
 
-	public List<String> getDefaultClientSubclassTemplates() {
-		return defaultClientSubclassTemplates;
-	}
-
 	public List<String> getDefaultSuperclassTemplates() {
 		return defaultSuperclassTemplates;
 	}
 
-	public List<String> getDefaultClientSuperclassTemplates() {
-		return defaultClientSuperclassTemplates;
-	}
-
 	public List<String> getDefaultEmbeddableTemplates() {
 		return defaultEmbeddableTemplates;
 	}
@@ -269,12 +236,4 @@ public class CodeTemplateManager {
 	public List<String> getDefaultDataMapSuperclassTemplates() {
 		return defaultServerDataMapSuperclassTemplates;
 	}
-	
-	public List<String> getDefaultClientDataMapTemplates() {
-		return defaultClientDataMapTemplates;
-	}
-	
-	public List<String> getDefaultClientDataMapSuperclassTemplates() {
-		return defaultClientDataMapSuperclassTemplates;
-	}
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
index d7753242b..b21410f6d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
@@ -103,11 +103,6 @@ public class CreateObjEntityAction extends CayenneAction {
 
         entity.setClassName(dataMap.getNameWithDefaultPackage(entity.getName()));
 
-        if (dataMap.isClientSupported()) {
-            entity.setClientClassName(dataMap.getNameWithDefaultClientPackage(entity.getName()));
-            entity.setClientSuperClassName(dataMap.getDefaultClientSuperclass());
-        }
-
         dataMap.addObjEntity(entity);
 
         // TODO: Modeler-controlled defaults for all the hardcoded boolean flags here.
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/PackageUpdateController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/PackageUpdateController.java
index 0b2474acb..e02073ab5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/PackageUpdateController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/PackageUpdateController.java
@@ -48,15 +48,11 @@ public class PackageUpdateController extends DefaultsPreferencesController {
     public static final String ALL_CONTROL = 
             "Set/update package for all ObjEntities and Embeddables (create default class names if missing)";
     public static final String UNINIT_CONTROL = "Do not override class names with packages";
-
-    protected boolean clientUpdate;
     
     protected DefaultsPreferencesView view;
 
-    public PackageUpdateController(ProjectController mediator, DataMap dataMap,
-            boolean clientUpdate) {
+    public PackageUpdateController(ProjectController mediator, DataMap dataMap) {
         super(mediator, dataMap);
-        this.clientUpdate = clientUpdate;
     }
 
     /**
@@ -140,27 +136,16 @@ public class PackageUpdateController extends DefaultsPreferencesController {
     }
 
     protected String getNameWithDefaultPackage(String name) {
-        if (clientUpdate) {
-            return dataMap.getNameWithDefaultClientPackage(name);
-        } else {
-            return dataMap.getNameWithDefaultPackage(name);
-        }
+        return dataMap.getNameWithDefaultPackage(name);
     }
 
     protected String getClassName(ObjEntity entity) {
-        return clientUpdate ? entity.getClientClassName() : entity.getClassName();
+        return entity.getClassName();
     }
 
     protected void setClassName(ObjEntity entity, String newName) {
         if (!Util.nullSafeEquals(newName, getClassName(entity))) {
-
-            if (clientUpdate) {
-                entity.setClientClassName(newName);
-            }
-            else {
-                entity.setClassName(newName);
-            }
-
+            entity.setClassName(newName);
             mediator.fireObjEntityEvent(new EntityEvent(this, entity));
         }
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/SuperclassUpdateController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/SuperclassUpdateController.java
index 64468c980..00387f7ea 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/SuperclassUpdateController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/datamap/SuperclassUpdateController.java
@@ -35,14 +35,11 @@ public class SuperclassUpdateController extends DefaultsPreferencesController {
 
     public static final String ALL_CONTROL = "Set/update superclass for all ObjEntities";
     public static final String UNINIT_CONTROL = "Do not override existing non-empty superclasses";
-
-    protected boolean clientUpdate;
     
     protected DefaultsPreferencesView view;
 
-    public SuperclassUpdateController(ProjectController mediator, DataMap dataMap, boolean clientUpdate) {
+    public SuperclassUpdateController(ProjectController mediator, DataMap dataMap) {
         super(mediator, dataMap);
-        this.clientUpdate = clientUpdate;
     }
 
     /**
@@ -91,19 +88,14 @@ public class SuperclassUpdateController extends DefaultsPreferencesController {
     }
 
     protected String getSuperclass() {
-        return clientUpdate ? dataMap.getDefaultClientSuperclass() : dataMap.getDefaultSuperclass();
+        return dataMap.getDefaultSuperclass();
     }
 
     protected String getSuperClassName(ObjEntity entity) {
-        return clientUpdate ? entity.getClientSuperClassName() : entity.getSuperClassName();
+        return entity.getSuperClassName();
     }
 
     protected void setSuperClassName(ObjEntity entity, String superClassName) {
-        if (clientUpdate) {
-            entity.setClientSuperClassName(superClassName);
-        }
-        else {
-            entity.setSuperClassName(superClassName);
-        }
+        entity.setSuperClassName(superClassName);
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdater.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdater.java
index 778dcbb66..67f2b8e96 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdater.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdater.java
@@ -43,15 +43,13 @@ public class ClassNameUpdater extends CayenneController {
     }
 
     /**
-     * Executes entity class and client class name update. Returns true if entity was
-     * changed, false otherwise.
+     * Executes entity class name update. Returns true if entity was changed, false otherwise.
      */
     public boolean doNameUpdate() {
         this.view = null;
         this.updatePerformed = false;
 
         boolean askForServerUpdate = true;
-        boolean askForClientUpdate = true;
 
         String oldServerName = entity.getClassName();
         String suggestedServerName = suggestedServerClassName();
@@ -59,54 +57,23 @@ public class ClassNameUpdater extends CayenneController {
         if (oldServerName == null || oldServerName.length() == 0) {
             // generic entity...
             askForServerUpdate = false;
-        }
-        else if (suggestedServerName == null || suggestedServerName.equals(oldServerName)) {
+        } else if (suggestedServerName == null || suggestedServerName.equals(oldServerName)) {
             askForServerUpdate = false;
-        }
-        else if (oldServerName.contains("UntitledObjEntity")) {
-
+        } else if (oldServerName.contains("UntitledObjEntity")) {
             // update without user interaction
             entity.setClassName(suggestedServerName);
-
             updatePerformed = true;
             askForServerUpdate = false;
         }
 
-        String suggestedClientName = suggestedClientClassName();
-        String oldClientName = entity.getClientClassName();
-        if (suggestedClientName == null || suggestedClientName.equals(oldClientName)) {
-            askForClientUpdate = false;
-        }
-        else if (oldClientName == null
-                || oldClientName.length() == 0
-                || oldClientName.contains("UntitledObjEntity")) {
-
-            // update without user interaction
-            entity.setClientClassName(suggestedClientName);
-
-            updatePerformed = true;
-            askForClientUpdate = false;
-        }
-
-        if (askForClientUpdate || askForServerUpdate) {
+        if (askForServerUpdate) {
             // start dialog
             view = new ClassNameUpdaterView();
+            view.getServerClass().setVisible(true);
+            view.getServerClass().setSelected(true);
+            view.getServerClass().setText("Change Class Name to '" + suggestedServerName + "'");
 
-            if (askForServerUpdate) {
-                view.getServerClass().setVisible(true);
-                view.getServerClass().setSelected(true);
-                view.getServerClass().setText(
-                        "Change Class Name to '" + suggestedServerName + "'");
-            }
-
-            if (askForClientUpdate) {
-                view.getClientClass().setVisible(true);
-                view.getClientClass().setSelected(true);
-                view.getClientClass().setText(
-                        "Change Client Class Name to '" + suggestedClientName + "'");
-            }
-
-            initBindings(suggestedServerName, suggestedClientName);
+            initBindings(suggestedServerName);
 
             view.pack();
             view.setModal(true);
@@ -123,16 +90,6 @@ public class ClassNameUpdater extends CayenneController {
         return suggestedClassName(entity.getName(), pkg, entity.getClassName());
     }
 
-    private String suggestedClientClassName() {
-        // do not updated client class name if it is not allowed
-        if (!entity.isClientAllowed()) {
-            return null;
-        }
-
-        String pkg = entity.getDataMap() == null ? null : entity.getDataMap().getDefaultClientPackage();
-        return suggestedClassName(entity.getName(), pkg, entity.getClientClassName());
-    }
-
     /**
      * Suggests a new class name based on new entity name and current selections.
      */
@@ -157,16 +114,9 @@ public class ClassNameUpdater extends CayenneController {
         return DataMap.getNameWithPackage(pkg, entityName);
     }
 
-    protected void initBindings(
-            final String suggestedServerName,
-            final String suggestedClientName) {
+    protected void initBindings(final String suggestedServerName) {
 
         view.getUpdateButton().addActionListener(e -> {
-            if (view.getClientClass().isSelected()) {
-                entity.setClientClassName(suggestedClientName);
-                updatePerformed = true;
-            }
-
             if (view.getServerClass().isSelected()) {
                 entity.setClassName(suggestedServerName);
                 updatePerformed = true;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdaterView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdaterView.java
index 33ee17a31..07b3d3a72 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdaterView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdaterView.java
@@ -33,7 +33,6 @@ import java.awt.FlowLayout;
 
 public class ClassNameUpdaterView extends JDialog {
 
-    protected JCheckBox clientClass;
     protected JCheckBox serverClass;
 
     protected JButton updateButton;
@@ -42,11 +41,9 @@ public class ClassNameUpdaterView extends JDialog {
     public ClassNameUpdaterView() {
 
         serverClass = new JCheckBox();
-        clientClass = new JCheckBox();
 
         // make invisible by default
         serverClass.setVisible(false);
-        clientClass.setVisible(false);
 
         updateButton = new JButton("Update");
         cancelButton = new JButton("Cancel");
@@ -60,7 +57,6 @@ public class ClassNameUpdaterView extends JDialog {
 
         builder.append("Update class name to match current entity name?");
         builder.append(serverClass);
-        builder.append(clientClass);
 
         JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
         buttons.add(cancelButton);
@@ -74,10 +70,6 @@ public class ClassNameUpdaterView extends JDialog {
         setTitle("Update Entity Class Name");
     }
 
-    public JCheckBox getClientClass() {
-        return clientClass;
-    }
-
     public JCheckBox getServerClass() {
         return serverClass;
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapView.java
index 2bc3459a0..408f7d6c4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapView.java
@@ -79,16 +79,6 @@ public class DataMapView extends JPanel {
     protected JButton updateDefaultSuperclass;
     protected JButton updateDefaultLockType;
 
-    // client stuff
-    protected JCheckBox clientSupport;
-
-    protected JLabel defaultClientPackageLabel;
-    protected JLabel defaultClientSuperclassLabel;
-    protected TextAdapter defaultClientPackage;
-    protected TextAdapter defaultClientSuperclass;
-    protected JButton updateDefaultClientPackage;
-    protected JButton updateDefaultClientSuperclass;
-
     public DataMapView(ProjectController eventController) {
         this.eventController = eventController;
 
@@ -153,23 +143,6 @@ public class DataMapView extends JPanel {
         updateDefaultLockType = new JButton("Update...");
         defaultLockType = new JCayenneCheckBox();
 
-        clientSupport = new JCayenneCheckBox();
-        updateDefaultClientPackage = new JButton("Update...");
-        defaultClientPackage = new TextAdapter(new JTextField()) {
-
-            protected void updateModel(String text) {
-                setDefaultClientPackage(text);
-            }
-        };
-
-        updateDefaultClientSuperclass = new JButton("Update...");
-        defaultClientSuperclass = new TextAdapter(new JTextField()) {
-
-            protected void updateModel(String text) {
-                setDefaultClientSuperclass(text);
-            }
-        };
-
         // assemble
         FormLayout layout = new FormLayout(
                 "right:70dlu, 3dlu, fill:180dlu, 3dlu, fill:120",
@@ -197,17 +170,6 @@ public class DataMapView extends JPanel {
                 updateDefaultSuperclass);
         builder.append("Optimistic Locking:", defaultLockType, updateDefaultLockType);
 
-        builder.appendSeparator("Client Class Defaults");
-        builder.append("Allow Client Entities:", clientSupport, new JPanel());
-        defaultClientPackageLabel = builder.append(
-                "Client Java Package:",
-                defaultClientPackage.getComponent(),
-                updateDefaultClientPackage);
-        defaultClientSuperclassLabel = builder.append(
-                "Custom Superclass:",
-                defaultClientSuperclass.getComponent(),
-                updateDefaultClientSuperclass);
-
         this.setLayout(new BorderLayout());
         add(builder.getPanel(), BorderLayout.CENTER);
     }
@@ -225,9 +187,6 @@ public class DataMapView extends JPanel {
         defaultLockType.addItemListener(e -> setDefaultLockType(defaultLockType.isSelected()
                 ? ObjEntity.LOCK_TYPE_OPTIMISTIC
                 : ObjEntity.LOCK_TYPE_NONE));
-        clientSupport.addItemListener(e -> setClientSupport(clientSupport.isSelected()));
-        updateDefaultClientPackage.addActionListener(e -> updateDefaultClientPackage());
-        updateDefaultClientSuperclass.addActionListener(e -> updateDefaultClientSuperclass());
         updateDefaultCatalog.addActionListener(e -> updateDefaultCatalog());
         updateDefaultSchema.addActionListener(e -> updateDefaultSchema());
         updateDefaultPackage.addActionListener(e -> updateDefaultPackage());
@@ -277,22 +236,6 @@ public class DataMapView extends JPanel {
         defaultCatalog.setText(map.getDefaultCatalog());
         defaultSchema.setText(map.getDefaultSchema());
         defaultSuperclass.setText(map.getDefaultSuperclass());
-
-        // client defaults
-        clientSupport.setSelected(map.isClientSupported());
-        defaultClientPackage.setText(map.getDefaultClientPackage());
-        defaultClientSuperclass.setText(map.getDefaultClientSuperclass());
-        toggleClientProperties(map.isClientSupported());
-    }
-
-    private void toggleClientProperties(boolean enabled) {
-        defaultClientPackage.getComponent().setEnabled(enabled);
-        updateDefaultClientPackage.setEnabled(enabled);
-        defaultClientPackageLabel.setEnabled(enabled);
-
-        defaultClientSuperclassLabel.setEnabled(enabled);
-        defaultClientSuperclass.getComponent().setEnabled(enabled);
-        updateDefaultClientSuperclass.setEnabled(enabled);
     }
 
     void setDefaultLockType(int lockType) {
@@ -311,21 +254,6 @@ public class DataMapView extends JPanel {
         eventController.fireDataMapEvent(new DataMapEvent(this, dataMap));
     }
 
-    void setClientSupport(boolean flag) {
-        DataMap dataMap = eventController.getCurrentDataMap();
-
-        if (dataMap == null) {
-            return;
-        }
-
-        if (dataMap.isClientSupported() != flag) {
-            dataMap.setClientSupported(flag);
-
-            toggleClientProperties(flag);
-            eventController.fireDataMapEvent(new DataMapEvent(this, dataMap));
-        }
-    }
-
     void setQuoteSQLIdentifiers(boolean flag) {
         DataMap dataMap = eventController.getCurrentDataMap();
 
@@ -366,53 +294,6 @@ public class DataMapView extends JPanel {
         eventController.fireDataMapEvent(new DataMapEvent(this, dataMap));
     }
 
-    void setDefaultClientPackage(String newDefaultPackage) {
-        DataMap dataMap = eventController.getCurrentDataMap();
-
-        if (dataMap == null) {
-            return;
-        }
-
-        if (newDefaultPackage != null && newDefaultPackage.trim().length() == 0) {
-            newDefaultPackage = null;
-        }
-
-        String oldPackage = dataMap.getDefaultClientPackage();
-        if (Util.nullSafeEquals(newDefaultPackage, oldPackage)) {
-            return;
-        }
-
-        dataMap.setDefaultClientPackage(newDefaultPackage);
-
-        // TODO: (andrus, 09/10/2005) - add the same logic for the client package
-        // update class generation preferences
-        // eventController.getDataMapPreferences().setSuperclassPackage(
-        // newDefaultPackage,
-        // DataMapDefaults.DEFAULT_SUPERCLASS_PACKAGE);
-
-        eventController.fireDataMapEvent(new DataMapEvent(this, dataMap));
-    }
-
-    void setDefaultClientSuperclass(String newSuperclass) {
-        DataMap dataMap = eventController.getCurrentDataMap();
-
-        if (dataMap == null) {
-            return;
-        }
-
-        if (newSuperclass != null && newSuperclass.trim().length() == 0) {
-            newSuperclass = null;
-        }
-
-        String oldSuperclass = dataMap.getDefaultClientSuperclass();
-        if (Util.nullSafeEquals(newSuperclass, oldSuperclass)) {
-            return;
-        }
-
-        dataMap.setDefaultClientSuperclass(newSuperclass);
-        eventController.fireDataMapEvent(new DataMapEvent(this, dataMap));
-    }
-
     void setDefaultCatalog(String newCatalog) {
         DataMap dataMap = eventController.getCurrentDataMap();
 
@@ -549,7 +430,7 @@ public class DataMapView extends JPanel {
         }
 
         if (dataMap.getObjEntities().size() > 0) {
-            new SuperclassUpdateController(eventController, dataMap, false).startupAction();
+            new SuperclassUpdateController(eventController, dataMap).startupAction();
         }
     }
 
@@ -561,31 +442,7 @@ public class DataMapView extends JPanel {
         }
 
         if (dataMap.getObjEntities().size() > 0 || dataMap.getEmbeddables().size() > 0) {
-            new PackageUpdateController(eventController, dataMap, false).startupAction();
-        }
-    }
-
-    void updateDefaultClientPackage() {
-        DataMap dataMap = eventController.getCurrentDataMap();
-
-        if (dataMap == null) {
-            return;
-        }
-
-        if (dataMap.getObjEntities().size() > 0) {
-            new PackageUpdateController(eventController, dataMap, true).startupAction();
-        }
-    }
-
-    void updateDefaultClientSuperclass() {
-        DataMap dataMap = eventController.getCurrentDataMap();
-
-        if (dataMap == null) {
-            return;
-        }
-
-        if (dataMap.getObjEntities().size() > 0) {
-            new SuperclassUpdateController(eventController, dataMap, true).startupAction();
+            new PackageUpdateController(eventController, dataMap).startupAction();
         }
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java
index 134128bbe..713b0bb69 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTab.java
@@ -33,7 +33,6 @@ import javax.swing.DefaultComboBoxModel;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
-import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
@@ -67,7 +66,6 @@ import org.apache.cayenne.modeler.util.ExpressionConvertor;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.modeler.util.combo.AutoCompletion;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
-import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
 
@@ -94,17 +92,10 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
     protected JCheckBox readOnly;
     protected JCheckBox optimisticLocking;
 
-    protected JComponent clientSeparator;
     protected JLabel isAbstractLabel;
-    protected JLabel serverOnlyLabel;
-    protected JLabel clientClassNameLabel;
-    protected JLabel clientSuperClassNameLabel;
 
-    protected JCheckBox serverOnly;
     protected JCheckBox isAbstract;
     protected TextAdapter comment;
-    protected TextAdapter clientClassName;
-    protected TextAdapter clientSuperClassName;
 
     public ObjEntityTab(ProjectController mediator) {
         this.mediator = mediator;
@@ -176,7 +167,6 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
 
 
         isAbstract = new JCayenneCheckBox();
-        serverOnly = new JCayenneCheckBox();
 
         comment = new TextAdapter(new JTextField()) {
             @Override
@@ -184,18 +174,6 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
                 setComment(text);
             }
         };
-        clientClassName = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setClientClassName(text);
-            }
-        };
-        clientSuperClassName = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setClientSuperClassName(text);
-            }
-        };
 
         // assemble
         FormLayout layout = new FormLayout("right:pref, 3dlu, fill:200dlu", "");
@@ -217,11 +195,6 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
         builder.append("Read-Only:", readOnly);
         builder.append("Optimistic Locking:", optimisticLocking);
 
-        clientSeparator = builder.appendSeparator("Java Client");
-        serverOnlyLabel = builder.append("Not for Client Use:", serverOnly);
-        clientClassNameLabel = builder.append("Client Java Class:", clientClassName.getComponent());
-        clientSuperClassNameLabel = builder.append("Client Superclass:", clientSuperClassName.getComponent());
-
         add(builder.getPanel(), BorderLayout.CENTER);
     }
 
@@ -286,7 +259,7 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
 
                 // if a super-entity selected, disable table selection
                 // and also update parent DbEntity selection...
-                toggleEnabled(name == null, !serverOnly.isSelected());
+                toggleEnabled(name == null);
                 dbEntityCombo.getModel().setSelectedItem(entity.getDbEntity());
                 superClassName.setText(entity.getSuperClassName());
 
@@ -328,15 +301,6 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
             }
         });
 
-        serverOnly.addItemListener(e -> {
-            ObjEntity entity = mediator.getCurrentObjEntity();
-            if (entity != null) {
-                entity.setServerOnly(serverOnly.isSelected());
-                toggleEnabled(dbEntityCombo.isEnabled(), !serverOnly.isSelected());
-                mediator.fireObjEntityEvent(new EntityEvent(this, entity));
-            }
-        });
-
         isAbstract.addItemListener(e -> {
             ObjEntity entity = mediator.getCurrentObjEntity();
             if (entity != null) {
@@ -363,9 +327,6 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
 
         isAbstract.setSelected(entity.isAbstract());
         comment.setText(getComment(entity));
-        serverOnly.setSelected(entity.isServerOnly());
-        clientClassName.setText(entity.getClientClassName());
-        clientSuperClassName.setText(entity.getClientSuperClassName());
 
         qualifier.setText(new ExpressionConvertor().valueAsString(entity.getDeclaredQualifier()));
 
@@ -389,8 +350,7 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
         dbEntityCombo.setEnabled(!isUsedInheritance);
 
         // toggle visibility and editability rules
-        toggleClientFieldsVisible(map.isClientSupported());
-        toggleEnabled(entity.getSuperEntityName() == null, !entity.isServerOnly());
+        toggleEnabled(entity.getSuperEntityName() == null);
 
         // do not show this entity or any of the subentities
         List<ObjEntity> objEntities = map.getObjEntities().stream()
@@ -433,34 +393,6 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
         }
     }
 
-    void setClientClassName(String className) {
-        if (className != null && className.trim().length() == 0) {
-            className = null;
-        }
-
-        ObjEntity entity = mediator.getCurrentObjEntity();
-
-        // "ent" may be null if we quit editing by changing tree selection
-        if (entity != null && !Util.nullSafeEquals(entity.getClientClassName(), className)) {
-            entity.setClientClassName(className);
-            mediator.fireObjEntityEvent(new EntityEvent(this, entity));
-        }
-    }
-
-    void setClientSuperClassName(String text) {
-
-        if (text != null && text.trim().length() == 0) {
-            text = null;
-        }
-
-        ObjEntity ent = mediator.getCurrentObjEntity();
-
-        if (ent != null && !Util.nullSafeEquals(ent.getClientSuperClassName(), text)) {
-            ent.setClientSuperClassName(text);
-            mediator.fireObjEntityEvent(new EntityEvent(this, ent));
-        }
-    }
-
     void setQualifier(String text) {
         if (text != null && text.trim().length() == 0) {
             text = null;
@@ -511,7 +443,6 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
 
             if (nameUpdater.doNameUpdate()) {
                 className.setText(entity.getClassName());
-                clientClassName.setText(entity.getClientClassName());
             }
         } else {
             // there is an entity with the same name
@@ -519,27 +450,9 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
         }
     }
 
-    void toggleClientFieldsVisible(boolean visible) {
-
-        clientSeparator.setVisible(visible);
-        clientSuperClassNameLabel.setVisible(visible);
-        clientClassNameLabel.setVisible(visible);
-        serverOnlyLabel.setVisible(visible);
-
-        clientClassName.getComponent().setVisible(visible);
-        clientSuperClassName.getComponent().setVisible(visible);
-        serverOnly.setVisible(visible);
-    }
-
-    void toggleEnabled(boolean directTableMapping, boolean clientFieldsEnabled) {
+    void toggleEnabled(boolean directTableMapping) {
         superClassName.getComponent().setEnabled(directTableMapping);
         superclassLabel.setEnabled(directTableMapping);
-
-        clientSuperClassName.getComponent().setEnabled(directTableMapping && clientFieldsEnabled);
-        clientSuperClassNameLabel.setEnabled(directTableMapping && clientFieldsEnabled);
-
-        clientClassNameLabel.setEnabled(clientFieldsEnabled);
-        clientClassName.getComponent().setEnabled(clientFieldsEnabled);
     }
 
     public void processExistingSelection(EventObject e) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassGenerationValidator.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassGenerationValidator.java
index 05b2c15f0..75102271c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassGenerationValidator.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassGenerationValidator.java
@@ -43,7 +43,7 @@ class ClassGenerationValidator {
         ValidationResult validationResult = new ValidationResult();
         for (Object classObj : classes) {
             if (classObj instanceof ObjEntity) {
-                validateEntity(validationResult, (ObjEntity) classObj, false);
+                validateEntity(validationResult, (ObjEntity) classObj);
             } else if (classObj instanceof Embeddable) {
                 validateEmbeddable(validationResult, (Embeddable) classObj);
             }
@@ -90,9 +90,9 @@ class ClassGenerationValidator {
         return BeanValidationFailure.validateJavaClassName(name, "className", embeddable.getClassName());
     }
 
-    private void validateEntity(ValidationResult validationBuffer, ObjEntity entity, boolean clientValidation) {
+    private void validateEntity(ValidationResult validationBuffer, ObjEntity entity) {
 
-        ValidationFailure entityFailure = validateEntity(clientValidation ? entity.getClientEntity() : entity);
+        ValidationFailure entityFailure = validateEntity(entity);
         if (entityFailure != null) {
             validationBuffer.addFailure(entityFailure);
             return;
@@ -119,7 +119,7 @@ class ClassGenerationValidator {
         }
 
         for (ObjRelationship rel : entity.getRelationships()) {
-            ValidationFailure failure = validateRelationship(rel, clientValidation);
+            ValidationFailure failure = validateRelationship(rel);
             if (failure != null) {
                 validationBuffer.addFailure(failure);
                 return;
@@ -184,7 +184,7 @@ class ClassGenerationValidator {
         return validateAttribute(name, attr, attribute.getType());
     }
 
-    private ValidationFailure validateRelationship(ObjRelationship relationship, boolean clientValidation) {
+    private ValidationFailure validateRelationship(ObjRelationship relationship) {
 
         String name = relationship.getSourceEntity().getName();
 
@@ -203,11 +203,6 @@ class ClassGenerationValidator {
         if (!relationship.isToMany()) {
 
             ObjEntity targetEntity = relationship.getTargetEntity();
-
-            if (clientValidation && targetEntity != null) {
-                targetEntity = targetEntity.getClientEntity();
-            }
-
             if (targetEntity == null) {
 
                 return new BeanValidationFailure(name, "relationship.targetEntity", "No target entity");
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
deleted file mode 100644
index 4cf77d786..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
+++ /dev/null
@@ -1,49 +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
- *
- *    https://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.modeler.editor.cgen;
-
-import org.apache.cayenne.gen.CgenConfiguration;
-import org.apache.cayenne.gen.ClientClassGenerationAction;
-
-/**
- * @since 4.1
- */
-public class ClientModeController extends StandardModeController {
-
-    public ClientModeController(CodeGeneratorController parent) {
-        super(parent);
-    }
-
-    protected void createView() {
-        this.view = new StandardModePanel(getParentController());
-    }
-
-    @Override
-    public StandardModePanel getView() {
-        return view;
-    }
-
-    @Override
-    public void updateConfiguration(CgenConfiguration cgenConfiguration) {
-        cgenConfiguration.setClient(true);
-        cgenConfiguration.setTemplate(ClientClassGenerationAction.SUBCLASS_TEMPLATE);
-        cgenConfiguration.setSuperTemplate(ClientClassGenerationAction.SUPERCLASS_TEMPLATE);
-    }
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
index 8b85e067c..2b336798c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
@@ -103,9 +103,7 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
         GeneratorController modeController = prevGeneratorController.get(dataMap);
         if (modeController == null) {
             if (cgenConfiguration.isDefault()) {
-                modeController = cgenConfiguration.isClient()
-                        ? generatorSelector.getClientGeneratorController()
-                        : generatorSelector.getStandartController();
+                modeController = generatorSelector.getStandartController();
             } else {
                 modeController = generatorSelector.getCustomModeController();
             }
@@ -214,7 +212,7 @@ public class CodeGeneratorController extends CayenneController implements ObjEnt
             return;
         }
 
-        cgenConfiguration = new CgenConfiguration(false);
+        cgenConfiguration = new CgenConfiguration();
         cgenConfiguration.setForce(true);
         cgenConfiguration.setDataMap(map);
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
index ab1e14a82..28d8f3c55 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
@@ -27,7 +27,6 @@ import javax.swing.DefaultComboBoxModel;
 
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.modeler.CodeTemplateManager;
 import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
 import org.apache.cayenne.swing.BindingBuilder;
@@ -62,33 +61,24 @@ public class CustomModeController extends GeneratorController {
     }
 
     protected void updateTemplates() {
-        boolean isClient = cgenConfiguration.isClient();
         CodeTemplateManager templateManager = getApplication().getCodeTemplateManager();
 
         List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
         Collections.sort(customTemplates);
 
-        List<String> superTemplates = isClient ?
-                new ArrayList<>(templateManager.getDefaultClientSuperclassTemplates()) :
-                new ArrayList<>(templateManager.getDefaultSuperclassTemplates());
+        List<String> superTemplates = new ArrayList<>(templateManager.getDefaultSuperclassTemplates());
         Collections.sort(superTemplates);
         superTemplates.addAll(customTemplates);
 
-        List<String> subTemplates = isClient ?
-                new ArrayList<>(templateManager.getDefaultClientSubclassTemplates()) :
-                new ArrayList<>(templateManager.getDefaultSubclassTemplates());
+        List<String> subTemplates = new ArrayList<>(templateManager.getDefaultSubclassTemplates());
         Collections.sort(subTemplates);
         subTemplates.addAll(customTemplates);
 
-        List<String> querySuperTemplates = isClient ?
-                new ArrayList<>(templateManager.getDefaultClientDataMapSuperclassTemplates()) :
-                new ArrayList<>(templateManager.getDefaultDataMapSuperclassTemplates());
+        List<String> querySuperTemplates = new ArrayList<>(templateManager.getDefaultDataMapSuperclassTemplates());
         Collections.sort(querySuperTemplates);
         querySuperTemplates.addAll(customTemplates);
 
-        List<String> queryTemplates = isClient ?
-                new ArrayList<>(templateManager.getDefaultClientDataMapTemplates()) :
-                new ArrayList<>(templateManager.getDefaultDataMapTemplates());
+        List<String> queryTemplates = new ArrayList<>(templateManager.getDefaultDataMapTemplates());
         Collections.sort(queryTemplates);
         queryTemplates.addAll(customTemplates);
 
@@ -180,54 +170,11 @@ public class CustomModeController extends GeneratorController {
             cgenConfiguration.setCreatePKProperties(view.getPkProperties().isSelected());
             getParentController().checkCgenConfigDirty();
         });
-
-        view.getClientMode().addActionListener(val -> {
-            boolean isSelected = view.getClientMode().isSelected();
-            cgenConfiguration.setClient(isSelected);
-            if (isSelected) {
-                cgenConfiguration.setTemplate(ClientClassGenerationAction.SUBCLASS_TEMPLATE);
-                cgenConfiguration.setSuperTemplate(ClientClassGenerationAction.SUPERCLASS_TEMPLATE);
-                cgenConfiguration.setQueryTemplate(ClientClassGenerationAction.DMAP_SUBCLASS_TEMPLATE);
-                cgenConfiguration.setQuerySuperTemplate(ClientClassGenerationAction.DMAP_SUPERCLASS_TEMPLATE);
-            } else {
-                cgenConfiguration.setTemplate(ClassGenerationAction.SUBCLASS_TEMPLATE);
-                cgenConfiguration.setSuperTemplate(ClassGenerationAction.SUPERCLASS_TEMPLATE);
-                cgenConfiguration.setQueryTemplate(ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE);
-                cgenConfiguration.setQuerySuperTemplate(ClassGenerationAction.DATAMAP_SUPERCLASS_TEMPLATE);
-            }
-            updateTemplates();
-            String templateName = getApplication().getCodeTemplateManager().getNameByPath(
-                    isSelected ?
-                            ClientClassGenerationAction.SUBCLASS_TEMPLATE :
-                            ClassGenerationAction.SUBCLASS_TEMPLATE,
-                    cgenConfiguration.getRootPath());
-            String superTemplateName = getApplication().getCodeTemplateManager().getNameByPath(
-                    isSelected ?
-                            ClientClassGenerationAction.SUBCLASS_TEMPLATE :
-                            ClassGenerationAction.SUBCLASS_TEMPLATE,
-                    cgenConfiguration.getRootPath());
-            String queryTemplateName = getApplication().getCodeTemplateManager().getNameByPath(
-                    isSelected ?
-                            ClientClassGenerationAction.DMAP_SUBCLASS_TEMPLATE :
-                            ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE,
-                    cgenConfiguration.getRootPath());
-            String querySuperTemplateName = getApplication().getCodeTemplateManager().getNameByPath(
-                    isSelected ?
-                            ClientClassGenerationAction.DMAP_SUPERCLASS_TEMPLATE :
-                            ClassGenerationAction.DATAMAP_SUPERCLASS_TEMPLATE,
-                    cgenConfiguration.getRootPath());
-            view.getSubclassTemplate().setItem(templateName);
-            view.getSuperclassTemplate().setItem(superTemplateName);
-            view.getQueryTemplate().setItem(queryTemplateName);
-            view.getQuerySuperTemplate().setItem(querySuperTemplateName);
-            getParentController().checkCgenConfigDirty();
-        });
     }
 
     @Override
     public void initForm(CgenConfiguration cgenConfiguration) {
         super.initForm(cgenConfiguration);
-        view.getClientMode().setSelected(cgenConfiguration.isClient());
         updateTemplates();
         view.getOutputPattern().setText(cgenConfiguration.getOutputPattern());
         view.getPairs().setSelected(cgenConfiguration.isMakePairs());
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
index 8b44b896e..32909ef5d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
@@ -54,7 +54,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
     private TextAdapter outputPattern;
     private JCheckBox createPropertyNames;
     private JCheckBox pkProperties;
-    private JCheckBox clientMode;
     private TextAdapter superPkg;
 
     private JButton manageTemplatesLink;
@@ -63,7 +62,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         super(projectController, codeGeneratorControllerBase);
         
         JComboBox<String> superclassField = new JComboBox<>();
-        this.superclassTemplate = new ComboBoxAdapter<String>(superclassField) {
+        this.superclassTemplate = new ComboBoxAdapter<>(superclassField) {
             @Override
             protected void updateModel(String item) throws ValidationException {
                 CgenConfiguration cgenConfiguration = getCgenConfig();
@@ -74,7 +73,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         };
 
         JComboBox<String> subclassField = new JComboBox<>();
-        this.subclassTemplate = new ComboBoxAdapter<String>(subclassField) {
+        this.subclassTemplate = new ComboBoxAdapter<>(subclassField) {
             @Override
             protected void updateModel(String item) throws ValidationException {
                 CgenConfiguration cgenConfiguration = getCgenConfig();
@@ -85,7 +84,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         };
         
         JComboBox<String> embeddableField = new JComboBox<>();
-        this.embeddableTemplate = new ComboBoxAdapter<String>(embeddableField) {
+        this.embeddableTemplate = new ComboBoxAdapter<>(embeddableField) {
         	@Override
         	protected void updateModel(String item) throws ValidationException {
         		CgenConfiguration cgenConfiguration = getCgenConfig();
@@ -96,7 +95,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         };
         
         JComboBox<String> embeddableSuperField = new JComboBox<>();
-        this.embeddableSuperTemplate = new ComboBoxAdapter<String>(embeddableSuperField) {
+        this.embeddableSuperTemplate = new ComboBoxAdapter<>(embeddableSuperField) {
         	@Override
         	protected void updateModel(String item) throws ValidationException {
         		CgenConfiguration cgenConfiguration = getCgenConfig();
@@ -107,7 +106,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         };
         
         JComboBox<String> queryField = new JComboBox<>();
-        this.queryTemplate = new ComboBoxAdapter<String>(queryField) {
+        this.queryTemplate = new ComboBoxAdapter<>(queryField) {
         	@Override
         	protected void updateModel(String item) throws ValidationException {
         		CgenConfiguration cgenConfiguration = getCgenConfig();
@@ -118,7 +117,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         };
         
         JComboBox<String> querySuperField = new JComboBox<>();
-        this.querySuperTemplate = new ComboBoxAdapter<String>(querySuperField) {
+        this.querySuperTemplate = new ComboBoxAdapter<>(querySuperField) {
         	@Override
         	protected void updateModel(String item) throws ValidationException {
         		CgenConfiguration cgenConfiguration = getCgenConfig();
@@ -151,7 +150,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
 
         this.createPropertyNames = new JCayenneCheckBox();
         this.pkProperties = new JCayenneCheckBox();
-        this.clientMode= new JCayenneCheckBox();
         this.manageTemplatesLink = new JButton("Customize Templates...");
         this.manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
 
@@ -205,9 +203,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
         builder.append("Create PK properties:", pkProperties);
         builder.nextLine();
 
-        builder.append("Client mode: ", clientMode);
-        builder.nextLine();
-
         builder.append("Superclass package:", superPkg.getComponent());
 
         setLayout(new BorderLayout());
@@ -276,10 +271,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return pkProperties;
     }
 
-    public JCheckBox getClientMode() {
-        return clientMode;
-    }
-
     public TextAdapter getSuperPkg() {
         return superPkg;
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
index 259cb2c1e..7f9b39dba 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
@@ -34,13 +34,12 @@ import java.util.Map;
 public class GeneratorTabController extends CayenneController {
 
     private static final String STANDARD_OBJECTS_MODE = "Standard Persistent Objects";
-    private static final String CLIENT_OBJECTS_MODE = "Client Persistent Objects";
     private static final String ADVANCED_MODE = "Advanced";
 
     public static final String GENERATOR_PROPERTY = "generator";
 
     private static final String[] GENERATION_MODES = new String[] {
-            STANDARD_OBJECTS_MODE, CLIENT_OBJECTS_MODE, ADVANCED_MODE
+            STANDARD_OBJECTS_MODE, ADVANCED_MODE
     };
 
     protected GeneratorTabPanel view;
@@ -51,7 +50,6 @@ public class GeneratorTabController extends CayenneController {
         super(parent);
         this.controllers = new HashMap<>(3);
         controllers.put(STANDARD_OBJECTS_MODE, new StandardModeController(parent));
-        controllers.put(CLIENT_OBJECTS_MODE, new ClientModeController(parent));
         controllers.put(ADVANCED_MODE, new CustomModeController(parent));
         Component[] modePanels = new Component[GENERATION_MODES.length];
         for (int i = 0; i < GENERATION_MODES.length; i++) {
@@ -105,8 +103,4 @@ public class GeneratorTabController extends CayenneController {
     GeneratorController getCustomModeController() {
         return controllers.get(ADVANCED_MODE);
     }
-
-    GeneratorController getClientGeneratorController() {
-        return controllers.get(CLIENT_OBJECTS_MODE);
-    }
 }
\ No newline at end of file
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
index b3156edc8..ebf444d88 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
@@ -45,7 +45,6 @@ public class StandardModeController extends GeneratorController {
 
     @Override
     public void updateConfiguration(CgenConfiguration cgenConfiguration) {
-        cgenConfiguration.setClient(false);
         cgenConfiguration.setTemplate(ClassGenerationAction.SUBCLASS_TEMPLATE);
         cgenConfiguration.setSuperTemplate(ClassGenerationAction.SUPERCLASS_TEMPLATE);
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
index fa36ac05e..b710aa4cf 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
@@ -85,7 +85,7 @@ public class CgenTabController extends GeneratorsTabController<CgenConfiguration
     }
 
     public CgenConfiguration createConfiguration(DataMap dataMap) {
-        CgenConfiguration cgenConfiguration = new CgenConfiguration(false);
+        CgenConfiguration cgenConfiguration = new CgenConfiguration();
         cgenConfiguration.setDataMap(dataMap);
         Path basePath = Paths.get(ModelerUtil.initOutputFolder());
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataMapDefaults.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataMapDefaults.java
index c3242a1bc..54bd11044 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataMapDefaults.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DataMapDefaults.java
@@ -49,13 +49,12 @@ public class DataMapDefaults extends RenamedPreferences {
     /**
      * Returns a superclass package tailored for a given DataMap.
      */
-    public void updateSuperclassPackage(DataMap dataMap, boolean isClient) {
+    public void updateSuperclassPackage(DataMap dataMap) {
 
         String storedPackage = getSuperclassPackage();
         if (Util.isEmptyString(storedPackage)
                 || DEFAULT_SUPERCLASS_PACKAGE_SUFFIX.equals(storedPackage)) {
-            String mapPackage = (isClient) ? dataMap.getDefaultClientPackage() : dataMap
-                    .getDefaultPackage();
+            String mapPackage = dataMap.getDefaultPackage();
             if (!Util.isEmptyString(mapPackage)) {
 
                 if (mapPackage.endsWith(".")) {
diff --git a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
index cb925f487..3947f5714 100644
--- a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
+++ b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOModelProcessor.java
@@ -328,7 +328,6 @@ public class EOModelProcessor {
 		// create ObjEntity
 		EOObjEntity objEntity = new EOObjEntity(name);
 		objEntity.setEoMap(entityPlist);
-		objEntity.setServerOnly(!generateClientClass);
 		String parent = (String) entityPlist.get("parent");
 		objEntity.setClassName(helper.entityClass(name, generateClientClass));
 
@@ -407,11 +406,7 @@ public class EOModelProcessor {
 		List primaryKeys = (List) entityPlistMap.get("primaryKeyAttributes");
 
 		List classProperties;
-		if (objEntity.isServerOnly()) {
-			classProperties = (List) entityPlistMap.get("classProperties");
-		} else {
-			classProperties = (List) entityPlistMap.get("clientClassProperties");
-		}
+		classProperties = (List) entityPlistMap.get("classProperties");
 
 		List attributes = (List) entityPlistMap.get("attributes");
 		DbEntity dbEntity = objEntity.getDbEntity();


[cayenne] 01/05: CAY-2744 Remove ROP support - delete ROP modules

Posted by nt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 984bbf22bd00d42c0b86c12c3542b8f1e735f952
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Jul 7 18:24:31 2022 +0300

    CAY-2744 Remove ROP support
     - delete ROP modules
---
 cayenne-client-jetty/pom.xml                       | 147 -----
 .../rop/client/ClientJettyHttp2Module.java         |  44 --
 .../rop/client/ClientJettyHttpModule.java          |  40 --
 .../rop/client/JettyClientModuleProvider.java      |  46 --
 .../rop/JettyHttp2ClientConnectionProvider.java    |  59 --
 .../rop/JettyHttpClientConnectionProvider.java     | 128 ----
 .../cayenne/rop/http/JettyHttpROPConnector.java    | 190 ------
 ...guration.rop.client.CayenneClientModuleProvider |  20 -
 .../rop/client/JettyModuleProviderTest.java        |  35 --
 .../cayenne/rop/http/JettyHttpROPConnectorIT.java  | 134 ----
 .../org/apache/cayenne/util/Http2TestServer.java   | 127 ----
 cayenne-client/pom.xml                             | 135 ----
 .../rop/client/CayenneClientModuleProvider.java    |  29 -
 .../rop/client/CayenneContextFactory.java          |  67 --
 .../rop/client/ClientChannelProvider.java          |  47 --
 .../configuration/rop/client/ClientConstants.java  |  50 --
 .../configuration/rop/client/ClientModule.java     |  69 ---
 .../configuration/rop/client/ClientRuntime.java    |  66 --
 .../rop/client/ClientRuntimeBuilder.java           | 147 -----
 .../client/LocalClientServerChannelProvider.java   |  51 --
 .../rop/client/LocalConnectionProvider.java        |  43 --
 .../client/MainCayenneClientModuleProvider.java    |  46 --
 .../org/apache/cayenne/remote/BaseConnection.java  | 125 ----
 .../org/apache/cayenne/remote/ClientChannel.java   | 314 ----------
 .../apache/cayenne/remote/ClientConnection.java    |  47 --
 .../remote/hessian/ClientSerializerFactory.java    |  75 ---
 .../remote/hessian/DataRowDeserializer.java        |  81 ---
 .../remote/hessian/service/HessianUtil.java        |  87 ---
 .../java/org/apache/cayenne/remote/package.html    |  24 -
 .../cayenne/remote/service/LocalConnection.java    | 144 -----
 .../apache/cayenne/rop/HttpClientConnection.java   | 134 ----
 .../cayenne/rop/HttpClientConnectionProvider.java  |  73 ---
 .../org/apache/cayenne/rop/ProxyRemoteService.java |  76 ---
 .../java/org/apache/cayenne/rop/ROPConnector.java  |  52 --
 .../main/java/org/apache/cayenne/rop/ROPUtil.java  | 151 -----
 .../ClientHessianSerializationServiceProvider.java |  39 --
 .../apache/cayenne/rop/http/HttpROPConnector.java  | 166 -----
 ...guration.rop.client.CayenneClientModuleProvider |  20 -
 .../apache/cayenne/CayenneContextCayenneIT.java    |  51 --
 .../CayenneContextClientChannelEventsIT.java       | 353 -----------
 .../cayenne/CayenneContextDeleteRulesIT.java       | 123 ----
 .../org/apache/cayenne/CayenneContextEJBQLIT.java  |  93 ---
 .../CayenneContextGraphDiffCompressorIT.java       | 103 ----
 .../java/org/apache/cayenne/CayenneContextIT.java  | 342 -----------
 .../cayenne/CayenneContextInheritanceIT.java       | 146 -----
 .../cayenne/CayenneContextMapRelationshipIT.java   | 119 ----
 .../cayenne/CayenneContextMeaningfulPKIT.java      |  71 ---
 .../cayenne/CayenneContextMergeHandlerIT.java      |  98 ---
 .../cayenne/CayenneContextNamedQueryCachingIT.java | 133 ----
 .../CayenneContextPaginatedListCachingIT.java      |  75 ---
 .../apache/cayenne/CayenneContextPrimitiveIT.java  | 134 ----
 .../apache/cayenne/CayenneContextReflexiveIT.java  |  94 ---
 .../cayenne/CayenneContextRefreshQueryIT.java      |  79 ---
 .../cayenne/CayenneContextRelationshipsIT.java     | 102 ----
 .../cayenne/CayenneContextSQLTemplateIT.java       |  50 --
 .../cayenne/CayenneContextServerDiffsIT.java       | 163 -----
 .../apache/cayenne/CayenneContextValidationIT.java |  86 ---
 .../cayenne/CayenneContextWithDataContextIT.java   | 465 --------------
 .../test/java/org/apache/cayenne/DataRowTest.java  |  51 --
 .../org/apache/cayenne/NestedCayenneContextIT.java | 680 ---------------------
 .../cayenne/NestedCayenneContextTooneIT.java       | 222 -------
 .../apache/cayenne/ObjectContextChangeLogTest.java |  48 --
 .../test/java/org/apache/cayenne/ObjectIdTest.java |  84 ---
 .../cayenne/PersistentObjectInContextIT.java       | 151 -----
 .../cayenne/access/ClientServerChannelIT.java      | 263 --------
 .../cayenne/access/ClientServerChannelQueryIT.java | 241 --------
 .../org/apache/cayenne/access/types/EnumTest.java  | 113 ----
 .../org/apache/cayenne/cay_2641/Cay2641IT.java     |  97 ---
 .../rop/client/ClientLocalRuntimeTest.java         |  84 ---
 .../configuration/rop/client/ClientModuleTest.java |  98 ---
 .../rop/client/ClientRuntimeBuilderTest.java       | 160 -----
 .../rop/client/ClientRuntimeTest.java              | 118 ----
 .../MainCayenneClientModuleProviderTest.java       |  35 --
 .../org/apache/cayenne/event/EventSubjectTest.java |  40 --
 .../org/apache/cayenne/graph/NodeDiffTest.java     |  58 --
 .../cayenne/map/ClientEntityResolverTest.java      |  66 --
 .../cayenne/map/ClientObjectRelationshipTest.java  |  48 --
 .../java/org/apache/cayenne/map/DataMapTest.java   |  42 --
 .../java/org/apache/cayenne/map/DbEntityTest.java  |  58 --
 .../java/org/apache/cayenne/map/EntityTest.java    |  65 --
 .../apache/cayenne/query/ClientExpressionIT.java   | 346 -----------
 .../apache/cayenne/query/ClientObjectSelectIT.java | 156 -----
 .../query/ClientSelectQueryExpressionIT.java       |  73 ---
 .../apache/cayenne/query/ObjectIdQueryTest.java    |  42 --
 .../apache/cayenne/query/PrefetchTreeNodeTest.java | 159 -----
 .../org/apache/cayenne/query/RefreshQueryTest.java |  40 --
 .../cayenne/query/RelationshipQueryTest.java       |  42 --
 .../org/apache/cayenne/query/SQLTemplateTest.java  |  51 --
 .../org/apache/cayenne/query/SelectById_IT.java    |  57 --
 .../cayenne/query/SelectQueryAbstractEntityIT.java | 113 ----
 .../cayenne/remote/CayenneContextDeletionIT.java   |  63 --
 .../cayenne/remote/ClientChannelServerDiffsIT.java | 281 ---------
 .../remote/ClientChannelServerDiffsListener1.java  |  37 --
 .../apache/cayenne/remote/ClientChannelTest.java   | 251 --------
 .../apache/cayenne/remote/LocalConnectionTest.java |  49 --
 .../cayenne/remote/MockClientConnection.java       |  68 ---
 .../cayenne/remote/NestedObjectContextLocalIT.java |  84 ---
 .../remote/NestedObjectContextParentEventsIT.java  |  80 ---
 .../remote/NestedObjectContextPeerEventsIT.java    | 168 -----
 .../remote/NestedObjectContextRollbackIT.java      |  98 ---
 .../cayenne/remote/ROPPrefetchToManyMapIT.java     |  81 ---
 .../cayenne/remote/RelationshipChangeIT.java       |  86 ---
 .../apache/cayenne/remote/RemoteCallbacksIT.java   | 142 -----
 .../apache/cayenne/remote/RemoteCayenneCase.java   |  66 --
 .../remote/RemoteIncrementalFaultListIT.java       | 273 ---------
 .../apache/cayenne/remote/RemoteRollbackIT.java    | 178 ------
 .../org/apache/cayenne/remote/SyncMessageTest.java |  85 ---
 .../org/apache/cayenne/remote/ValueInjectorIT.java | 100 ---
 .../rop/http/HessianROPSerializationServiceIT.java | 114 ----
 .../apache/cayenne/unit/UnitLocalConnection.java   |  63 --
 .../apache/cayenne/unit/di/client/ClientCase.java  |  59 --
 .../client/ClientCaseCayenneContextProvider.java   |  36 --
 .../client/ClientCaseClientConnectionProvider.java |  35 --
 .../unit/di/client/ClientCaseContextsSync.java     |  70 ---
 .../unit/di/client/ClientCaseLifecycleManager.java |  67 --
 .../cayenne/unit/di/client/ClientCaseModule.java   |  62 --
 .../di/client/ClientCaseObjectContextProvider.java |  35 --
 .../unit/di/client/ClientCaseProperties.java       |  36 --
 .../cayenne/unit/di/client/ClientCaseSelfIT.java   |  53 --
 .../unit/di/client/ClientRuntimeProperty.java      |  36 --
 .../unit/di/client/ClientRuntimeProvider.java      |  62 --
 .../client/ClientRuntimeProviderContextsSync.java  |  42 --
 .../di/client/ClientServerChannelProvider.java     |  42 --
 .../client/ClientServerDataChannelDecorator.java   |  90 ---
 .../client/ClientServerDataChannelInterceptor.java |  75 ---
 .../InterceptingClientServerChannelProvider.java   |  38 --
 .../apache/cayenne/util/GenericResponseTest.java   |  64 --
 .../org/apache/cayenne/util/ListResponseTest.java  |  42 --
 .../cayenne/util/ObjectDetachOperationIT.java      | 120 ----
 .../cayenne/util/PersistentObjectListTest.java     |  79 ---
 .../util/ShallowMergeOperation_ClientIT.java       | 214 -------
 cayenne-protostuff/pom.xml                         | 157 -----
 ...bjectContextChangeLogSubListMessageFactory.java |  38 --
 .../ProtostuffServerModuleProvider.java            |  49 --
 .../rop/client/ProtostuffClientModuleProvider.java |  46 --
 .../configuration/rop/client/ProtostuffModule.java |  48 --
 .../cayenne/query/PrefetchTreeNodeSchema.java      | 157 -----
 .../ProtostuffROPSerializationService.java         |  92 ---
 .../org/apache/cayenne/rop/protostuff/Wrapper.java |  40 --
 ...guration.rop.client.CayenneClientModuleProvider |  20 -
 ...onfiguration.server.CayenneServerModuleProvider |  20 -
 ...tContextChangeLogSubListMessageFactoryTest.java |  55 --
 .../rop/client/ProtostuffModuleProviderTest.java   |  42 --
 .../cayenne/query/PrefetchTreeNodeSchemaTest.java  |  61 --
 .../remote/service/ProtostuffLocalConnection.java  |  78 ---
 .../service/ProtostuffLocalConnectionProvider.java |  40 --
 .../ProtostuffPersistentObjectCollectionsTest.java | 211 -------
 .../rop/protostuff/ProtostuffProperties.java       |  32 -
 .../ProtostuffROPSerializationServiceIT.java       |  83 ---
 .../protostuff/ProtostuffROPSerializationTest.java | 136 -----
 .../apache/cayenne/rop/protostuff/RuntimeBase.java |  67 --
 .../rop/protostuff/persistent/ClientMtTable1.java  |  31 -
 .../rop/protostuff/persistent/ClientMtTable2.java  |  31 -
 .../rop/protostuff/persistent/MtTable1.java        |  28 -
 .../rop/protostuff/persistent/MtTable2.java        |  28 -
 .../persistent/auto/_ClientMtTable1.java           | 178 ------
 .../persistent/auto/_ClientMtTable2.java           |  62 --
 .../rop/protostuff/persistent/auto/_MtTable1.java  | 212 -------
 .../rop/protostuff/persistent/auto/_MtTable2.java  | 106 ----
 .../src/test/resources/cayenne-protostuff.xml      |  16 -
 .../src/test/resources/protostuff.map.xml          |  42 --
 cayenne-rop-server/pom.xml                         |  91 ---
 .../java/org/apache/cayenne/CayenneContext.java    | 381 ------------
 .../cayenne/CayenneContextChildDiffLoader.java     | 140 -----
 .../apache/cayenne/CayenneContextGraphManager.java | 386 ------------
 .../apache/cayenne/CayenneContextMergeHandler.java | 273 ---------
 .../apache/cayenne/CayenneContextQueryAction.java  | 186 ------
 .../configuration/rop/server/ROPServerModule.java  |  68 ---
 .../rop/server/ROPServerModuleProvider.java        |  48 --
 .../apache/cayenne/remote/BootstrapMessage.java    |  36 --
 .../org/apache/cayenne/remote/ClientMessage.java   |  31 -
 .../apache/cayenne/remote/IncrementalQuery.java    |  73 ---
 .../cayenne/remote/IncrementalSelectQuery.java     | 234 -------
 .../org/apache/cayenne/remote/QueryMessage.java    |  55 --
 .../java/org/apache/cayenne/remote/RangeQuery.java | 156 -----
 .../cayenne/remote/RemoteIncrementalFaultList.java | 669 --------------------
 .../org/apache/cayenne/remote/RemoteService.java   |  54 --
 .../org/apache/cayenne/remote/RemoteSession.java   | 154 -----
 .../org/apache/cayenne/remote/SyncMessage.java     |  91 ---
 .../remote/hessian/CayenneSerializerFactory.java   |  43 --
 .../cayenne/remote/hessian/HessianConfig.java      | 152 -----
 .../remote/hessian/service/HessianService.java     |  64 --
 .../hessian/service/ServerDataRowSerializer.java   |  56 --
 .../ServerPersistentObjectListSerializer.java      |  50 --
 .../hessian/service/ServerSerializerFactory.java   |  71 ---
 .../cayenne/remote/service/BaseRemoteService.java  | 197 ------
 .../cayenne/remote/service/DispatchHelper.java     |  49 --
 .../cayenne/remote/service/HttpRemoteService.java  | 134 ----
 .../remote/service/MissingSessionException.java    |  38 --
 .../cayenne/remote/service/ServerSession.java      |  49 --
 .../rop/HessianROPSerializationService.java        |  69 ---
 .../java/org/apache/cayenne/rop/ROPConstants.java  |  33 -
 .../org/apache/cayenne/rop/ROPRequestContext.java  | 107 ----
 .../cayenne/rop/ROPSerializationService.java       |  39 --
 .../java/org/apache/cayenne/rop/ROPServlet.java    | 136 -----
 .../ServerHessianSerializationServiceProvider.java |  59 --
 .../cayenne/rop/ServerHttpRemoteService.java       |  47 --
 ...onfiguration.server.CayenneServerModuleProvider |  20 -
 .../cayenne/CayenneContextGraphManagerTest.java    |  67 --
 .../configuration/rop/server/MockModule1.java      |  30 -
 .../configuration/rop/server/MockModule2.java      |  32 -
 .../rop/server/MockRequestHandler.java             |  35 --
 .../rop/server/ROPHessianServlet_ConfigModule.java |  38 --
 .../rop/server/ROPServerModuleProviderTest.java    |  34 --
 .../configuration/rop/server/ROPServletTest.java   | 194 ------
 .../apache/cayenne/remote/MockRemoteService.java   |  40 --
 .../apache/cayenne/remote/RemoteSessionTest.java   |  58 --
 .../cayenne/remote/hessian/HessianConfigTest.java  |  61 --
 .../hessian/MockAbstractSerializerFactory.java     |  51 --
 .../remote/hessian/service/HessianServiceTest.java |  73 ---
 .../remote/service/BaseRemoteServiceTest.java      | 142 -----
 .../cayenne/remote/service/DispatchHelperTest.java |  54 --
 .../service/MockUnserializableException.java       |  24 -
 pom.xml                                            |   4 -
 214 files changed, 21515 deletions(-)

diff --git a/cayenne-client-jetty/pom.xml b/cayenne-client-jetty/pom.xml
deleted file mode 100644
index 3ba80e052..000000000
--- a/cayenne-client-jetty/pom.xml
+++ /dev/null
@@ -1,147 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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 https://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. -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>cayenne-parent</artifactId>
-        <groupId>org.apache.cayenne</groupId>
-        <version>4.3.M1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>cayenne-client-jetty</artifactId>
-    <name>cayenne-client-jetty: Cayenne ROP Client (Jetty)</name>
-    <packaging>jar</packaging>
-
-    <properties>
-        <jetty.version>9.4.41.v20210516</jetty.version>
-    </properties>
-
-    <dependencyManagement>
-        <dependencies>
-            <!-- Jetty client -->
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-client</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty.http2</groupId>
-                <artifactId>http2-client</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty.http2</groupId>
-                <artifactId>http2-http-client-transport</artifactId>
-                <version>${jetty.version}</version>
-            </dependency>
-
-            <!-- Jetty server test dependencies -->
-            <dependency>
-                <groupId>org.eclipse.jetty.http2</groupId>
-                <artifactId>http2-server</artifactId>
-                <version>${jetty.version}</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-servlet</artifactId>
-                <version>${jetty.version}</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jetty</groupId>
-                <artifactId>jetty-servlets</artifactId>
-                <version>${jetty.version}</version>
-                <scope>test</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <dependencies>
-        <!-- Compile dependencies -->
-        <dependency>
-            <groupId>org.apache.cayenne</groupId>
-            <artifactId>cayenne-client</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-
-        <!-- Jetty client -->
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.http2</groupId>
-            <artifactId>http2-client</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.http2</groupId>
-            <artifactId>http2-http-client-transport</artifactId>
-        </dependency>
-
-        <!--Test dependencies-->
-        <dependency>
-            <groupId>org.apache.cayenne</groupId>
-            <artifactId>cayenne-server</artifactId>
-            <version>${project.version}</version>
-            <type>test-jar</type>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty.http2</groupId>
-            <artifactId>http2-server</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlet</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlets</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-simple</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <!-- This ensures LICENSE and NOTICE inclusion in all jars -->
-            <plugin>
-                <artifactId>maven-remote-resources-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>process</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
\ No newline at end of file
diff --git a/cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/ClientJettyHttp2Module.java b/cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/ClientJettyHttp2Module.java
deleted file mode 100644
index d8205a119..000000000
--- a/cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/ClientJettyHttp2Module.java
+++ /dev/null
@@ -1,44 +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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.configuration.rop.client;
-
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.rop.JettyHttp2ClientConnectionProvider;
-import org.apache.cayenne.rop.http.JettyHttpROPConnector;
-
-/**
- * This is HTTP/2 implementation of ROP Client.
- * <p>
- * This module uses {@link JettyHttpROPConnector} initialized by {@link JettyHttp2ClientConnectionProvider}
- * without ALPN by default.
- * <p>
- * In order to use it with ALPN you have to set {@link ClientConstants#ROP_SERVICE_USE_ALPN_PROPERTY} to true
- * and provide the alpn-boot-XXX.jar into the bootstrap classpath.
- */
-public class ClientJettyHttp2Module implements Module {
-
-    @Override
-    public void configure(Binder binder) {
-        binder.bind(ClientConnection.class).toProvider(JettyHttp2ClientConnectionProvider.class);
-    }
-
-}
diff --git a/cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/ClientJettyHttpModule.java b/cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/ClientJettyHttpModule.java
deleted file mode 100644
index 8ef81ba01..000000000
--- a/cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/ClientJettyHttpModule.java
+++ /dev/null
@@ -1,40 +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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.configuration.rop.client;
-
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.rop.JettyHttpClientConnectionProvider;
-import org.apache.cayenne.rop.http.JettyHttpROPConnector;
-
-/**
- * This is HTTP/1.1 implementation of ROP Client.
- * <p>
- * This module uses {@link JettyHttpROPConnector} initialized by {@link JettyHttpClientConnectionProvider}.
- */
-public class ClientJettyHttpModule implements Module {
-
-    @Override
-    public void configure(Binder binder) {
-        binder.bind(ClientConnection.class).toProvider(JettyHttpClientConnectionProvider.class);
-    }
-
-}
\ No newline at end of file
diff --git a/cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/JettyClientModuleProvider.java b/cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/JettyClientModuleProvider.java
deleted file mode 100644
index 9ec5d5ef6..000000000
--- a/cayenne-client-jetty/src/main/java/org/apache/cayenne/configuration/rop/client/JettyClientModuleProvider.java
+++ /dev/null
@@ -1,46 +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
- *
- *    https://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.configuration.rop.client;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.apache.cayenne.di.Module;
-
-/**
- * @since 4.0
- */
-public class JettyClientModuleProvider implements CayenneClientModuleProvider {
-
-    @Override
-    public Module module() {
-        return new ClientJettyHttpModule();
-    }
-
-    @Override
-    public Class<? extends Module> moduleType() {
-        return ClientJettyHttpModule.class;
-    }
-
-    @Override
-    public Collection<Class<? extends Module>> overrides() {
-        return Collections.singletonList(ClientModule.class);
-    }
-}
diff --git a/cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/JettyHttp2ClientConnectionProvider.java b/cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/JettyHttp2ClientConnectionProvider.java
deleted file mode 100644
index fb5328011..000000000
--- a/cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/JettyHttp2ClientConnectionProvider.java
+++ /dev/null
@@ -1,59 +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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.rop;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.configuration.rop.client.ClientConstants;
-import org.apache.cayenne.di.Provider;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.rop.http.JettyHttpROPConnector;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.http2.client.HTTP2Client;
-import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-/**
- * This {@link Provider} initializes HTTP/2 {@link ClientConnection} through {@link JettyHttpROPConnector} which uses
- * {@link org.eclipse.jetty.client.HttpClient} over {@link org.eclipse.jetty.http2.client.HTTP2Client}.
- * It works without ALPN by default.
- * <p>
- * In order to use it with ALPN you have to set {@link ClientConstants#ROP_SERVICE_USE_ALPN_PROPERTY} to true
- * and provide the alpn-boot-XXX.jar into the bootstrap classpath.
- */
-public class JettyHttp2ClientConnectionProvider extends JettyHttpClientConnectionProvider {
-
-    @Override
-    protected HttpClient initJettyHttpClient() {
-        try {
-            HttpClientTransportOverHTTP2 http2 = new HttpClientTransportOverHTTP2(new HTTP2Client());
-
-            boolean useALPN = runtimeProperties.getBoolean(ClientConstants.ROP_SERVICE_USE_ALPN_PROPERTY, false);
-            http2.setUseALPN(useALPN);
-
-            HttpClient httpClient = new HttpClient(http2, new SslContextFactory());
-            httpClient.start();
-
-            return httpClient;
-        } catch (Exception e) {
-            throw new CayenneRuntimeException("Exception while starting Jetty HttpClient over HTTP/2.", e);
-        }
-    }
-
-}
diff --git a/cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/JettyHttpClientConnectionProvider.java b/cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/JettyHttpClientConnectionProvider.java
deleted file mode 100644
index 62d0bbd23..000000000
--- a/cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/JettyHttpClientConnectionProvider.java
+++ /dev/null
@@ -1,128 +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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.rop;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.ConfigurationException;
-import org.apache.cayenne.configuration.RuntimeProperties;
-import org.apache.cayenne.configuration.rop.client.ClientConstants;
-import org.apache.cayenne.di.DIRuntimeException;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.Provider;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.rop.http.JettyHttpROPConnector;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.AuthenticationStore;
-import org.eclipse.jetty.client.util.BasicAuthentication;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-import java.net.URI;
-
-/**
- * This {@link Provider} initializes HTTP/1.1 {@link ClientConnection} through {@link JettyHttpROPConnector} which uses
- * {@link org.eclipse.jetty.client.HttpClient}.
- */
-public class JettyHttpClientConnectionProvider implements Provider<ClientConnection> {
-
-    private static final Logger logger = LoggerFactory.getLogger(JettyHttpROPConnector.class);
-
-    @Inject
-    protected RuntimeProperties runtimeProperties;
-
-    @Inject
-    protected ROPSerializationService serializationService;
-
-    @Override
-    public ClientConnection get() throws DIRuntimeException {
-        String sharedSession = runtimeProperties
-                .get(ClientConstants.ROP_SERVICE_SHARED_SESSION_PROPERTY);
-
-        JettyHttpROPConnector ropConnector = createJettyHttpRopConnector();
-        ProxyRemoteService remoteService = new ProxyRemoteService(serializationService, ropConnector);
-
-        HttpClientConnection clientConnection = new HttpClientConnection(remoteService, sharedSession);
-        ropConnector.setClientConnection(clientConnection);
-
-        return clientConnection;
-    }
-
-    protected JettyHttpROPConnector createJettyHttpRopConnector() {
-        String url = runtimeProperties.get(ClientConstants.ROP_SERVICE_URL_PROPERTY);
-        if (url == null) {
-            throw new ConfigurationException(
-                    "No property defined for '%s', can't initialize connection",
-                    ClientConstants.ROP_SERVICE_URL_PROPERTY);
-        }
-
-        String username = runtimeProperties.get(ClientConstants.ROP_SERVICE_USERNAME_PROPERTY);
-        long readTimeout = runtimeProperties.getLong(
-                ClientConstants.ROP_SERVICE_TIMEOUT_PROPERTY,
-                -1L);
-
-        HttpClient httpClient = initJettyHttpClient();
-
-        addBasicAuthentication(httpClient, url, username);
-
-        JettyHttpROPConnector result = new JettyHttpROPConnector(httpClient, url, username);
-
-        if (readTimeout > 0) {
-            result.setReadTimeout(readTimeout);
-        }
-
-        return result;
-    }
-
-    protected HttpClient initJettyHttpClient() {
-        try {
-            HttpClient httpClient = new HttpClient(new SslContextFactory());
-            httpClient.start();
-
-            return httpClient;
-        } catch (Exception e) {
-            throw new CayenneRuntimeException("Exception while starting Jetty HttpClient.", e);
-        }
-    }
-
-    protected void addBasicAuthentication(HttpClient httpClient, String url, String username) {
-        String password = runtimeProperties.get(ClientConstants.ROP_SERVICE_PASSWORD_PROPERTY);
-        String realm = runtimeProperties.get(ClientConstants.ROP_SERVICE_REALM_PROPERTY);
-
-        if (username != null && password != null) {
-            if (realm == null && logger.isWarnEnabled()) {
-                logger.warn("In order to use JettyClient with BASIC Authentication " +
-                        "you should provide Constants.ROP_SERVICE_REALM_PROPERTY.");
-                return;
-            }
-
-            if (logger.isInfoEnabled()) {
-                logger.info(
-                        "Adding authentication" +
-                                "\nUser: " + username +
-                                "\nRealm: " + realm);
-            }
-
-            AuthenticationStore auth = httpClient.getAuthenticationStore();
-            auth.addAuthentication(new BasicAuthentication(URI.create(url), realm, username, password));
-        }
-    }
-
-}
diff --git a/cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/http/JettyHttpROPConnector.java b/cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/http/JettyHttpROPConnector.java
deleted file mode 100644
index 77f11d764..000000000
--- a/cayenne-client-jetty/src/main/java/org/apache/cayenne/rop/http/JettyHttpROPConnector.java
+++ /dev/null
@@ -1,190 +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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.rop.http;
-
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.remote.RemoteSession;
-import org.apache.cayenne.rop.*;
-import org.slf4j.Logger;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.client.api.ContentResponse;
-import org.eclipse.jetty.client.api.Request;
-import org.eclipse.jetty.client.api.Response;
-import org.eclipse.jetty.client.util.BytesContentProvider;
-import org.eclipse.jetty.client.util.InputStreamResponseListener;
-import org.eclipse.jetty.http.HttpHeader;
-import org.eclipse.jetty.http.HttpMethod;
-import org.slf4j.LoggerFactory;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.concurrent.TimeUnit;
-
-/**
- * This implementation of ROPConnector uses Jetty HTTP Client.
- * Depends on {@link ClientConnection} provider it uses HTTP/1.1 or HTTP/2 protocol.
- * <p>
- * {@link JettyHttpClientConnectionProvider} for HTTP/1.1 protocol.
- * {@link JettyHttp2ClientConnectionProvider} for HTTP/2 protocol.
- */
-public class JettyHttpROPConnector implements ROPConnector {
-
-    private static final Logger logger = LoggerFactory.getLogger(JettyHttpROPConnector.class);
-
-    public static final String SESSION_COOKIE_NAME = "JSESSIONID";
-
-    protected HttpClient httpClient;
-    protected HttpClientConnection clientConnection;
-
-    protected String url;
-    protected String username;
-
-    protected Long readTimeout = 5l;
-
-    public JettyHttpROPConnector(HttpClient httpClient, String url, String username) {
-        if (httpClient == null) {
-            throw new IllegalArgumentException("org.eclipse.jetty.client.HttpClient should be provided " +
-                    "for this ROPConnector implementation.");
-        }
-
-        this.httpClient = httpClient;
-        this.url = url;
-        this.username = username;
-    }
-
-    public void setClientConnection(HttpClientConnection clientConnection) {
-        this.clientConnection = clientConnection;
-    }
-
-    public void setReadTimeout(Long readTimeout) {
-        this.readTimeout = readTimeout;
-    }
-
-    @Override
-    public InputStream establishSession() throws IOException {
-        if (logger.isInfoEnabled()) {
-            logger.info(ROPUtil.getLogConnect(url, username, true));
-        }
-
-        try {
-            ContentResponse response = httpClient.newRequest(url)
-                    .method(HttpMethod.POST)
-                    .param(ROPConstants.OPERATION_PARAMETER, ROPConstants.ESTABLISH_SESSION_OPERATION)
-                    .timeout(readTimeout, TimeUnit.SECONDS)
-                    .send();
-
-            return new ByteArrayInputStream(response.getContent());
-        } catch (Exception e) {
-            if (e instanceof InterruptedException) {
-                Thread.currentThread().interrupt();
-            }
-
-            throw new IOException("Exception while establishing session", e);
-        }
-    }
-
-    @Override
-    public InputStream establishSharedSession(String sharedSessionName) throws IOException {
-        if (logger.isInfoEnabled()) {
-            logger.info(ROPUtil.getLogConnect(url, username, true, sharedSessionName));
-        }
-
-        try {
-            ContentResponse response = httpClient.newRequest(url)
-                    .method(HttpMethod.POST)
-                    .param(ROPConstants.OPERATION_PARAMETER, ROPConstants.ESTABLISH_SHARED_SESSION_OPERATION)
-                    .param(ROPConstants.SESSION_NAME_PARAMETER, sharedSessionName)
-                    .timeout(readTimeout, TimeUnit.SECONDS)
-                    .send();
-
-            return new ByteArrayInputStream(response.getContent());
-        } catch (Exception e) {
-            if (e instanceof InterruptedException) {
-                Thread.currentThread().interrupt();
-            }
-
-            throw new IOException("Exception while establishing shared session: " + sharedSessionName, e);
-        }
-    }
-
-    @Override
-    public InputStream sendMessage(byte[] message) throws IOException {
-        try {
-            Request request = httpClient.newRequest(url)
-                    .method(HttpMethod.POST)
-                    .header(HttpHeader.CONTENT_TYPE, "application/octet-stream")
-                    .header(HttpHeader.ACCEPT_ENCODING, "gzip")
-                    .content(new BytesContentProvider(message));
-
-            addSessionCookie(request);
-
-            InputStreamResponseListener listener = new InputStreamResponseListener();
-            request.send(listener);
-
-            /**
-             * Waits for the given timeout for the response to be available, then returns it.
-             * The wait ends as soon as all the HTTP headers have been received, without waiting for the content.
-             */
-            Response response = listener.get(readTimeout, TimeUnit.SECONDS);
-
-            if (response.getStatus() >= 300) {
-                throw new IOException(
-                        "Did not receive successful HTTP response: status code = " + response.getStatus() +
-                                ", status message = [" + response.getReason() + "]");
-            }
-
-            return listener.getInputStream();
-        } catch (Exception e) {
-            if (e instanceof InterruptedException) {
-                Thread.currentThread().interrupt();
-            }
-
-            throw new IOException("Exception while sending message", e);
-        }
-    }
-
-    @Override
-    public void close() throws IOException {
-        if (httpClient != null) {
-            if (logger.isInfoEnabled()) {
-                logger.info(ROPUtil.getLogDisconnect(url, username, true));
-            }
-
-            try {
-                httpClient.stop();
-            } catch (Exception e) {
-                throw new IOException("Exception while stopping Jetty HttpClient", e);
-            }
-        }
-    }
-
-    protected void addSessionCookie(Request request) {
-        if (clientConnection != null) {
-            RemoteSession session = clientConnection.getSession();
-
-            if (session != null && session.getSessionId() != null) {
-                request.header(HttpHeader.COOKIE, SESSION_COOKIE_NAME
-                        + "="
-                        + session.getSessionId());
-            }
-        }
-    }
-}
diff --git a/cayenne-client-jetty/src/main/resources/META-INF/services/org.apache.cayenne.configuration.rop.client.CayenneClientModuleProvider b/cayenne-client-jetty/src/main/resources/META-INF/services/org.apache.cayenne.configuration.rop.client.CayenneClientModuleProvider
deleted file mode 100644
index 10de88867..000000000
--- a/cayenne-client-jetty/src/main/resources/META-INF/services/org.apache.cayenne.configuration.rop.client.CayenneClientModuleProvider
+++ /dev/null
@@ -1,20 +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
-#
-#    https://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.
-##################################################################
-
-org.apache.cayenne.configuration.rop.client.JettyClientModuleProvider
\ No newline at end of file
diff --git a/cayenne-client-jetty/src/test/java/org/apache/cayenne/configuration/rop/client/JettyModuleProviderTest.java b/cayenne-client-jetty/src/test/java/org/apache/cayenne/configuration/rop/client/JettyModuleProviderTest.java
deleted file mode 100644
index c142ba2de..000000000
--- a/cayenne-client-jetty/src/test/java/org/apache/cayenne/configuration/rop/client/JettyModuleProviderTest.java
+++ /dev/null
@@ -1,35 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.unit.util.ModuleProviderChecker;
-import org.junit.Test;
-
-/**
- * @since 4.0
- */
-public class JettyModuleProviderTest {
-
-    @Test
-    public void testClientAutoLoadable() {
-        ModuleProviderChecker.testProviderPresent(JettyClientModuleProvider.class, CayenneClientModuleProvider.class);
-    }
-
-}
diff --git a/cayenne-client-jetty/src/test/java/org/apache/cayenne/rop/http/JettyHttpROPConnectorIT.java b/cayenne-client-jetty/src/test/java/org/apache/cayenne/rop/http/JettyHttpROPConnectorIT.java
deleted file mode 100644
index 28f6b4ac9..000000000
--- a/cayenne-client-jetty/src/test/java/org/apache/cayenne/rop/http/JettyHttpROPConnectorIT.java
+++ /dev/null
@@ -1,134 +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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.rop.http;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.rop.ROPConstants;
-import org.apache.cayenne.util.Http2TestServer;
-import org.eclipse.jetty.client.HttpClient;
-import org.eclipse.jetty.http2.client.HTTP2Client;
-import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.*;
-import java.util.stream.Collectors;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-public class JettyHttpROPConnectorIT {
-
-    private static final String MESSAGE = "test message";
-    private static final String SEND_MESSAGE_SESSION = "send message session";
-
-    private static JettyHttpROPConnector ropConnector;
-    private static Http2TestServer server;
-
-    @BeforeClass
-    public static void setUpClass() throws Exception {
-        // Start the test server
-        class TestServlet extends HttpServlet {
-            @Override
-            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-                String sharedSessionName = req.getParameter(ROPConstants.SESSION_NAME_PARAMETER);
-
-                if (sharedSessionName == null) {
-                    resp.getOutputStream().write(MESSAGE.getBytes());
-                } else if (sharedSessionName.equals(SEND_MESSAGE_SESSION)) {
-                    resp.getOutputStream().write(toByteArray(req.getInputStream()));
-                } else {
-                    resp.getOutputStream().write((MESSAGE + " " + sharedSessionName).getBytes());
-                }
-            }
-        }
-
-        server = Http2TestServer.servlet(new TestServlet()).start();
-
-        ropConnector = new JettyHttpROPConnector(initJettyHttp2Client(), server.getBasePath(), null);
-    }
-
-    protected static HttpClient initJettyHttp2Client() {
-        try {
-            HttpClientTransportOverHTTP2 http2 = new HttpClientTransportOverHTTP2(new HTTP2Client());
-            http2.setUseALPN(false);
-
-            HttpClient httpClient = new HttpClient(http2, new SslContextFactory());
-            httpClient.start();
-
-            return httpClient;
-        } catch (Exception e) {
-            throw new CayenneRuntimeException("Exception while starting Jetty HttpClient over HTTP/2.", e);
-        }
-    }
-
-    @AfterClass
-    public static void tearDownClass() throws Exception {
-        server.stop();
-        ropConnector.close();
-    }
-
-    @Test
-    public void testEstablishSession() throws Exception {
-        String message = read(ropConnector.establishSession());
-        assertEquals(MESSAGE, message);
-    }
-
-    @Test
-    public void testEstablishSharedSession() throws Exception {
-        String sharedSessionName = "test session";
-        String message = read(ropConnector.establishSharedSession(sharedSessionName));
-        assertEquals(MESSAGE + " " + sharedSessionName, message);
-    }
-
-    @Test
-    public void sendMessage() throws Exception {
-        ropConnector.establishSharedSession(SEND_MESSAGE_SESSION);
-
-        byte[] message = toByteArray(ropConnector.sendMessage(MESSAGE.getBytes()));
-        assertArrayEquals(MESSAGE.getBytes(), message);
-    }
-
-    private static String read(InputStream input) throws IOException {
-        try (BufferedReader buffer = new BufferedReader(new InputStreamReader(input))) {
-            return buffer.lines().collect(Collectors.joining("\n"));
-        }
-    }
-
-    private static byte[] toByteArray(InputStream inputStream) throws IOException {
-        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
-
-            int reads = inputStream.read();
-            while (reads != -1) {
-                baos.write(reads);
-                reads = inputStream.read();
-            }
-
-            return baos.toByteArray();
-        }
-    }
-
-}
diff --git a/cayenne-client-jetty/src/test/java/org/apache/cayenne/util/Http2TestServer.java b/cayenne-client-jetty/src/test/java/org/apache/cayenne/util/Http2TestServer.java
deleted file mode 100644
index d12bb1c89..000000000
--- a/cayenne-client-jetty/src/test/java/org/apache/cayenne/util/Http2TestServer.java
+++ /dev/null
@@ -1,127 +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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.util;
-
-import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.function.BiConsumer;
-
-public class Http2TestServer {
-
-    private final String path;
-    private final Server server;
-    private final ServerConnector connector;
-
-    public static TestServerBuilder servlet(HttpServlet servlet) {
-        return new TestServerBuilder(servlet, "/", 0);
-    }
-
-    public static TestServerBuilder handler(BiConsumer<HttpServletRequest, HttpServletResponse> handler) {
-
-        HttpServlet servlet = new HttpServlet() {
-            private static final long serialVersionUID = -7741340028518626628L;
-
-            @Override
-            protected void service(HttpServletRequest req, HttpServletResponse resp) {
-                handler.accept(req, resp);
-            }
-        };
-
-        return servlet(servlet);
-    }
-
-
-    public Http2TestServer(HttpServlet servlet, String path, int port) {
-        this.path = path;
-
-        QueuedThreadPool serverExecutor = new QueuedThreadPool();
-        serverExecutor.setName("server");
-
-        server = new Server(serverExecutor);
-        connector = new ServerConnector(server, 1, 1, new HTTP2ServerConnectionFactory(new HttpConfiguration()));
-        connector.setPort(port);
-        server.addConnector(connector);
-
-        ServletContextHandler context = new ServletContextHandler(server, "/", true, false);
-        context.addServlet(new ServletHolder(servlet), path);
-    }
-
-    void start() {
-        try {
-            server.start();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public void stop() {
-        try {
-            server.stop();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public int getLocalPort() {
-        return connector.getLocalPort();
-    }
-
-
-    public String getBasePath() {
-        return "http://localhost:" + getLocalPort() + path;
-    }
-
-
-    public static class TestServerBuilder {
-        private final HttpServlet servlet;
-        private final String path;
-        private final int port;
-
-        private TestServerBuilder(HttpServlet servlet, String path, int port) {
-            this.servlet = servlet;
-            this.path = path;
-            this.port = port;
-        }
-
-        public TestServerBuilder path(String path) {
-            return new TestServerBuilder(this.servlet, path, this.port);
-        }
-
-        public TestServerBuilder port(int port) {
-            return new TestServerBuilder(this.servlet, this.path, port);
-        }
-
-
-        public Http2TestServer start() {
-            Http2TestServer http2Server = new Http2TestServer(servlet, path, port);
-            http2Server.start();
-            return http2Server;
-        }
-    }
-}
diff --git a/cayenne-client/pom.xml b/cayenne-client/pom.xml
deleted file mode 100644
index 08fdd6e13..000000000
--- a/cayenne-client/pom.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- 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 https://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. -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.cayenne</groupId>
-		<artifactId>cayenne-parent</artifactId>
-		<version>4.3.M1-SNAPSHOT</version>
-	</parent>
-	<artifactId>cayenne-client</artifactId>
-	<packaging>jar</packaging>
-	<name>cayenne-client: Cayenne ROP Client</name>
-	<dependencies>
-
-		<!-- Compile dependencies -->
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <scope>compile</scope>
-        </dependency>
-		<dependency>
-			<groupId>org.apache.cayenne</groupId>
-			<artifactId>cayenne-di</artifactId>
-			<version>${project.version}</version>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.cayenne</groupId>
-			<artifactId>cayenne-server</artifactId>
-			<version>${project.version}</version>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>com.caucho</groupId>
-            <artifactId>hessian</artifactId>
-			<scope>compile</scope>
-		</dependency>
-        <dependency>
-            <groupId>org.apache.cayenne</groupId>
-            <artifactId>cayenne-rop-server</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-		<!-- Test dependencies -->
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.mockito</groupId>
-			<artifactId>mockito-core</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.cayenne.build-tools</groupId>
-			<artifactId>cayenne-test-utilities</artifactId>
-			<version>${project.version}</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.cayenne</groupId>
-			<artifactId>cayenne-server</artifactId>
-			<version>${project.version}</version>
-			<type>test-jar</type>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-    		<groupId>org.slf4j</groupId>
-    		<artifactId>slf4j-simple</artifactId>
-    		<scope>test</scope>
-		</dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>testcontainers</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>mysql</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>mariadb</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>postgresql</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>oracle-xe</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>mssqlserver</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>db2</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-	<build>
-		<plugins>
-			<!-- This ensures LICENSE and NOTICE inclusion in all jars -->
-            <plugin>
-                <artifactId>maven-remote-resources-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>process</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/CayenneClientModuleProvider.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/CayenneClientModuleProvider.java
deleted file mode 100644
index b01dfa656..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/CayenneClientModuleProvider.java
+++ /dev/null
@@ -1,29 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.di.spi.ModuleProvider;
-
-/**
- * This interface implementations will be used by {@link ClientRuntimeBuilder} to auto-load client modules.
- * @since 4.0
- */
-public interface CayenneClientModuleProvider extends ModuleProvider {
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/CayenneContextFactory.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/CayenneContextFactory.java
deleted file mode 100644
index e8e8d05f2..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/CayenneContextFactory.java
+++ /dev/null
@@ -1,67 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.CayenneContext;
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.cache.NestedQueryCache;
-import org.apache.cayenne.cache.QueryCache;
-import org.apache.cayenne.configuration.Constants;
-import org.apache.cayenne.configuration.ObjectContextFactory;
-import org.apache.cayenne.configuration.RuntimeProperties;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.Injector;
-
-public class CayenneContextFactory implements ObjectContextFactory {
-
-    @Inject
-    protected DataChannel dataChannel;
-
-    @Inject
-    protected RuntimeProperties properties;
-    
-    @Inject
-    protected QueryCache queryCache;
-
-    @Inject
-    protected Injector injector;
-
-    public ObjectContext createContext() {
-        return createContext(dataChannel);
-    }
-
-    public ObjectContext createContext(DataChannel parent) {
-        boolean changeEvents = properties.getBoolean(
-                ClientConstants.ROP_CONTEXT_CHANGE_EVENTS_PROPERTY,
-                false);
-
-        boolean lifecycleEvents = properties.getBoolean(
-                ClientConstants.ROP_CONTEXT_LIFECYCLE_EVENTS_PROPERTY,
-                false);
-
-        CayenneContext context = newInstance(parent, changeEvents, lifecycleEvents);
-        context.setQueryCache(new NestedQueryCache(queryCache));
-        return context;
-    }
-    
-    protected CayenneContext newInstance(DataChannel parent, boolean changeEventsEnabled, boolean lifecycleEventsEnabled) {
-        return new CayenneContext(parent, changeEventsEnabled, lifecycleEventsEnabled);
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientChannelProvider.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientChannelProvider.java
deleted file mode 100644
index 1ea7e5b11..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientChannelProvider.java
+++ /dev/null
@@ -1,47 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.ConfigurationException;
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.configuration.RuntimeProperties;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.Provider;
-import org.apache.cayenne.event.EventManager;
-import org.apache.cayenne.remote.ClientChannel;
-import org.apache.cayenne.remote.ClientConnection;
-
-public class ClientChannelProvider implements Provider<DataChannel> {
-
-    @Inject
-    protected ClientConnection connection;
-
-    @Inject
-    protected EventManager eventManager;
-
-    @Inject
-    protected RuntimeProperties properties;
-
-    public DataChannel get() throws ConfigurationException {
-
-        boolean channelEvents = properties.getBoolean(ClientConstants.ROP_CHANNEL_EVENTS_PROPERTY, false);
-
-        return new ClientChannel(connection, channelEvents, eventManager, channelEvents);
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientConstants.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientConstants.java
deleted file mode 100644
index 69e024e7e..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientConstants.java
+++ /dev/null
@@ -1,50 +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
- *
- *      https://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.configuration.rop.client;
-
-/**
- * Defines the names of runtime properties and named collections used in DI modules related to ROP client.
- *
- * @since 4.0
- */
-public class ClientConstants {
-
-    public static final String ROP_SERVICE_URL_PROPERTY = "cayenne.rop.service_url";
-
-    public static final String ROP_SERVICE_USERNAME_PROPERTY = "cayenne.rop.service_username";
-
-    public static final String ROP_SERVICE_PASSWORD_PROPERTY = "cayenne.rop.service_password";
-
-    public static final String ROP_SERVICE_REALM_PROPERTY = "cayenne.rop.service_realm";
-
-    /**
-     * A boolean property that defines whether ALPN should be used. Possible values are "true" or "false".
-     */
-    public static final String ROP_SERVICE_USE_ALPN_PROPERTY = "cayenne.rop.service_use_alpn";
-
-    public static final String ROP_SERVICE_SHARED_SESSION_PROPERTY = "cayenne.rop.shared_session_name";
-
-    public static final String ROP_SERVICE_TIMEOUT_PROPERTY = "cayenne.rop.service_timeout";
-
-    public static final String ROP_CHANNEL_EVENTS_PROPERTY = "cayenne.rop.channel_events";
-
-    public static final String ROP_CONTEXT_CHANGE_EVENTS_PROPERTY = "cayenne.rop.context_change_events";
-
-    public static final String ROP_CONTEXT_LIFECYCLE_EVENTS_PROPERTY = "cayenne.rop.context_lifecycle_events";
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java
deleted file mode 100644
index ade6f722d..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java
+++ /dev/null
@@ -1,69 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.cache.MapQueryCacheProvider;
-import org.apache.cayenne.cache.QueryCache;
-import org.apache.cayenne.configuration.DefaultRuntimeProperties;
-import org.apache.cayenne.configuration.ObjectContextFactory;
-import org.apache.cayenne.configuration.RuntimeProperties;
-import org.apache.cayenne.configuration.server.ServerModule;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.event.EventManager;
-import org.apache.cayenne.event.EventManagerProvider;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.remote.RemoteService;
-import org.apache.cayenne.rop.HttpClientConnectionProvider;
-import org.apache.cayenne.rop.ProxyRemoteService;
-import org.apache.cayenne.rop.ROPSerializationService;
-import org.apache.cayenne.rop.http.ClientHessianSerializationServiceProvider;
-
-/**
- * A DI module containing all Cayenne ROP client runtime configurations.
- * 
- * @since 3.1
- * @since 4.0 this module is auto-loaded by {@link ClientRuntimeBuilder}
- */
-public class ClientModule implements Module {
-
-    /**
-     * @since 4.0
-     */
-    public ClientModule() {
-    }
-
-    @SuppressWarnings("deprecation")
-    public void configure(Binder binder) {
-
-        // Contribute always to create binding
-        ServerModule.contributeProperties(binder);
-
-        binder.bind(ObjectContextFactory.class).to(CayenneContextFactory.class);
-        binder.bind(ROPSerializationService.class).toProvider(ClientHessianSerializationServiceProvider.class);
-        binder.bind(RemoteService.class).to(ProxyRemoteService.class);
-        binder.bind(ClientConnection.class).toProvider(HttpClientConnectionProvider.class);
-        binder.bind(EventManager.class).toProvider(EventManagerProvider.class);
-        binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
-        binder.bind(DataChannel.class).toProvider(ClientChannelProvider.class);
-        binder.bind(QueryCache.class).toProvider(MapQueryCacheProvider.class);
-    }
-
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientRuntime.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientRuntime.java
deleted file mode 100644
index b59673feb..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientRuntime.java
+++ /dev/null
@@ -1,66 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.configuration.CayenneRuntime;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.remote.ClientConnection;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-
-import static java.util.Arrays.asList;
-
-/**
- * A user application entry point to Cayenne stack on the ROP client.
- * 
- * @since 3.1
- * @since 4.0 preferred way to create this class is with {@link ClientRuntime#builder()} method.
- */
-public class ClientRuntime extends CayenneRuntime {
-
-	/**
-	 * @since 4.0 moved from deprecated ClientLocalRuntime class
-	 */
-	public static final String CLIENT_SERVER_CHANNEL_KEY = "client-server-channel";
-
-	/**
-	 * Creates new builder of client runtime
-	 * @return client runtime builder
-	 *
-	 * @since 4.0
-	 */
-	public static ClientRuntimeBuilder builder() {
-		return new ClientRuntimeBuilder();
-	}
-
-	/**
-	 * @since 4.0
-	 */
-	protected ClientRuntime(Collection<Module> modules) {
-		super(modules);
-	}
-
-	public ClientConnection getConnection() {
-		return injector.getInstance(ClientConnection.class);
-	}
-
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeBuilder.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeBuilder.java
deleted file mode 100644
index caf6def2e..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeBuilder.java
+++ /dev/null
@@ -1,147 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.configuration.server.ServerModule;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.di.Key;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.di.spi.ModuleLoader;
-import org.apache.cayenne.remote.ClientConnection;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-
-/**
- * <p>
- * A convenience class to assemble custom ClientRuntime.
- * It allows to easily configure custom modules and create local runtime.
- * </p>
- * <p>
- * To create this builder use {@link ClientRuntime#builder()} method.
- * </p>
- *
- * @since 4.0
- */
-public class ClientRuntimeBuilder {
-
-    private List<Module> modules;
-    private boolean autoLoadModules;
-    private boolean local;
-    Injector serverInjector;
-    private Map<String, String> properties;
-
-    ClientRuntimeBuilder() {
-        modules = new ArrayList<>();
-        autoLoadModules = true;
-        local = false;
-        properties = null;
-    }
-
-    /**
-     * Disables DI module auto-loading. By default auto-loading is enabled based on
-     * {@link CayenneClientModuleProvider} service provider interface.
-     * If you decide to disable auto-loading, make sure you provide all the modules that you need.
-     *
-     * @return this builder instance.
-     */
-    public ClientRuntimeBuilder disableModulesAutoLoading() {
-        this.autoLoadModules = false;
-        return this;
-    }
-
-    public ClientRuntimeBuilder addModule(Module module) {
-        modules.add(module);
-        return this;
-    }
-
-    public ClientRuntimeBuilder addModules(Collection<Module> modules) {
-        this.modules.addAll(modules);
-        return this;
-    }
-
-    /**
-     * @param properties contributed to {@link ServerModule}
-     * @return this builder
-     */
-    public ClientRuntimeBuilder properties(Map<String, String> properties) {
-        this.properties = properties;
-        return this;
-    }
-
-    /**
-     * Create {@link ClientRuntime} that provides an ROP stack based on a local
-     * connection on top of a server stack.
-     *
-     * @param serverInjector server injector
-     * @return this builder
-     */
-    public ClientRuntimeBuilder local(Injector serverInjector) {
-        this.local = true;
-        this.serverInjector = serverInjector;
-        return this;
-    }
-
-    public ClientRuntime build() {
-        Collection<Module> allModules = new ArrayList<>();
-
-        // first load default or auto-loaded modules...
-        allModules.addAll(autoLoadModules ? autoLoadedModules() : defaultModules());
-
-        // custom modules override default and auto-loaded ...
-        allModules.addAll(modules);
-
-        // builder modules override default, auto-loaded and custom modules...
-        allModules.addAll(builderModules());
-
-        return new ClientRuntime(allModules);
-    }
-
-    private Collection<? extends Module> autoLoadedModules() {
-        return new ModuleLoader().load(CayenneClientModuleProvider.class);
-    }
-
-    private Collection<? extends Module> defaultModules() {
-        return Collections.singleton(new ClientModule());
-    }
-
-    private Collection<? extends Module> builderModules() {
-        Collection<Module> modules = new ArrayList<>();
-
-        if(properties != null) {
-            modules.add(binder -> ServerModule.contributeProperties(binder).putAll(properties));
-        }
-
-        if(local) {
-            modules.add(binder -> {
-                binder.bind(Key.get(DataChannel.class, ClientRuntime.CLIENT_SERVER_CHANNEL_KEY))
-                        .toProviderInstance(new LocalClientServerChannelProvider(serverInjector));
-                binder.bind(ClientConnection.class).toProviderInstance(new LocalConnectionProvider());
-            });
-        }
-
-        return modules;
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/LocalClientServerChannelProvider.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/LocalClientServerChannelProvider.java
deleted file mode 100644
index d7ece3821..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/LocalClientServerChannelProvider.java
+++ /dev/null
@@ -1,51 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.ConfigurationException;
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.access.ClientServerChannel;
-import org.apache.cayenne.access.DataContext;
-import org.apache.cayenne.configuration.ObjectContextFactory;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.di.Provider;
-import org.apache.cayenne.remote.service.LocalConnection;
-
-/**
- * Creates a {@link ClientServerChannel} for the {@link LocalConnection}.
- * 
- * @since 3.1
- */
-public class LocalClientServerChannelProvider implements Provider<DataChannel> {
-
-    protected Injector serverInjector;
-
-    public LocalClientServerChannelProvider(Injector serverInjector) {
-        this.serverInjector = serverInjector;
-    }
-
-    public DataChannel get() throws ConfigurationException {
-        ObjectContextFactory factory = serverInjector
-                .getInstance(ObjectContextFactory.class);
-
-        // TODO: ugly cast
-        DataContext serverContext = (DataContext) factory.createContext();
-        return new ClientServerChannel(serverContext);
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/LocalConnectionProvider.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/LocalConnectionProvider.java
deleted file mode 100644
index e9ccc1cb5..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/LocalConnectionProvider.java
+++ /dev/null
@@ -1,43 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.ConfigurationException;
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.Provider;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.remote.service.LocalConnection;
-
-/**
- * @since 3.1
- */
-public class LocalConnectionProvider implements Provider<ClientConnection> {
-
-    @Inject(ClientRuntime.CLIENT_SERVER_CHANNEL_KEY)
-    protected Provider<DataChannel> clientServerChannelProvider;
-
-    public ClientConnection get() throws ConfigurationException {
-
-        DataChannel clientServerChannel = clientServerChannelProvider.get();
-        return new LocalConnection(
-                clientServerChannel,
-                LocalConnection.HESSIAN_SERIALIZATION);
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/MainCayenneClientModuleProvider.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/MainCayenneClientModuleProvider.java
deleted file mode 100644
index 95b5d000a..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/MainCayenneClientModuleProvider.java
+++ /dev/null
@@ -1,46 +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
- *
- *    https://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.configuration.rop.client;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.apache.cayenne.di.Module;
-
-/**
- * @since 4.0
- */
-public class MainCayenneClientModuleProvider implements CayenneClientModuleProvider {
-
-    @Override
-    public Module module() {
-        return new ClientModule();
-    }
-
-    @Override
-    public Class<? extends Module> moduleType() {
-        return ClientModule.class;
-    }
-
-    @Override
-    public Collection<Class<? extends Module>> overrides() {
-        return Collections.emptyList();
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/remote/BaseConnection.java b/cayenne-client/src/main/java/org/apache/cayenne/remote/BaseConnection.java
deleted file mode 100644
index 47d9ba491..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/remote/BaseConnection.java
+++ /dev/null
@@ -1,125 +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
- *
- *    https://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.remote;
-
-import org.slf4j.Logger;
-import org.apache.cayenne.CayenneRuntimeException;
-import org.slf4j.LoggerFactory;
-
-/**
- * A common base class for concrete ClientConnection implementations. Provides message
- * logging functionality via slf4j logging.
- * 
- * @since 1.2
- */
-public abstract class BaseConnection implements ClientConnection {
-
-    protected Logger logger;
-    protected long messageId;
-    
-    /**
-     * Default constructor that initializes logging and a single threaded EventManager.
-     */
-    protected BaseConnection() {
-        this.logger = LoggerFactory.getLogger(getClass());
-    }
-
-    /**
-     * Invokes 'beforeSendMessage' on self, then invokes 'doSendMessage'. Implements basic
-     * logging functionality. Do not override this method unless absolutely necessary.
-     * Override 'beforeSendMessage' and 'doSendMessage' instead.
-     */
-    public Object sendMessage(ClientMessage message) throws CayenneRuntimeException {
-        if (message == null) {
-            throw new NullPointerException("Null message");
-        }
-
-        beforeSendMessage(message);
-
-        // log start...
-        long t0 = 0;
-        String messageLabel = "";
-
-        // using sequential number for message id ... it can be useful for some basic
-        // connector stats.
-        long messageId = this.messageId++;
-
-        if (logger.isInfoEnabled()) {
-            t0 = System.currentTimeMillis();
-            messageLabel = message.toString();
-            logger.info("--- Message " + messageId + ": " + messageLabel);
-        }
-
-        Object response;
-        try {
-            response = doSendMessage(message);
-        }
-        catch (CayenneRuntimeException e) {
-
-            // log error
-            if (logger.isInfoEnabled()) {
-                long time = System.currentTimeMillis() - t0;
-                logger.info("*** Message error for "
-                        + messageId
-                        + ": "
-                        + messageLabel
-                        + " - took "
-                        + time
-                        + " ms.");
-            }
-
-            throw e;
-        }
-
-        // log success...
-        if (logger.isInfoEnabled()) {
-            long time = System.currentTimeMillis() - t0;
-            logger.info("=== Message "
-                    + messageId
-                    + ": "
-                    + messageLabel
-                    + " done - took "
-                    + time
-                    + " ms.");
-        }
-
-        return response;
-    }
-
-    /**
-     * Returns a count of processed messages since the beginning of life of this
-     * connector.
-     */
-    public long getProcessedMessagesCount() {
-        return messageId + 1;
-    }
-    
-    /**
-     * Called before logging the beginning of message processing.
-     */
-    protected abstract void beforeSendMessage(ClientMessage message)
-            throws CayenneRuntimeException;
-
-    /**
-     * The worker method invoked to process message.
-     */
-    protected abstract Object doSendMessage(ClientMessage message)
-            throws CayenneRuntimeException;
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientChannel.java b/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientChannel.java
deleted file mode 100644
index e7cff78a4..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientChannel.java
+++ /dev/null
@@ -1,314 +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
- *
- *    https://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.remote;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.DataChannelSyncCallbackAction;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.Persistent;
-import org.apache.cayenne.QueryResponse;
-import org.apache.cayenne.event.EventBridge;
-import org.apache.cayenne.event.EventManager;
-import org.apache.cayenne.event.EventSubject;
-import org.apache.cayenne.graph.CompoundDiff;
-import org.apache.cayenne.graph.GraphDiff;
-import org.apache.cayenne.graph.GraphDiffCompressor;
-import org.apache.cayenne.graph.GraphEvent;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.query.EntityResultSegment;
-import org.apache.cayenne.query.Query;
-import org.apache.cayenne.query.QueryMetadata;
-import org.apache.cayenne.util.DeepMergeOperation;
-import org.apache.cayenne.util.ToStringBuilder;
-
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * A {@link org.apache.cayenne.DataChannel} implementation that accesses a remote server
- * via a ClientConnection.
- * 
- * @since 1.2
- */
-public class ClientChannel implements DataChannel {
-
-    protected ClientConnection connection;
-    protected EventManager eventManager;
-    protected EntityResolver entityResolver;
-    protected boolean channelEventsEnabled;
-    protected GraphDiffCompressor diffCompressor;
-
-    EventBridge remoteChannelListener;
-
-    /**
-     * @param remoteEventsOptional if true, failure to start an EventBridge will not
-     *            result in an exception.
-     * @since 3.0
-     */
-    public ClientChannel(ClientConnection connection, boolean channelEventsEnabled,
-            EventManager eventManager, boolean remoteEventsOptional)
-            throws CayenneRuntimeException {
-
-        this.connection = connection;
-        this.diffCompressor = new GraphDiffCompressor();
-        this.eventManager = eventManager;
-        this.channelEventsEnabled = eventManager != null && channelEventsEnabled;
-
-        if (!remoteEventsOptional) {
-            setupRemoteChannelListener();
-        } else {
-            try {
-                setupRemoteChannelListener();
-            } catch (CayenneRuntimeException ignored) {}
-        }
-    }
-
-    /**
-     * @since 3.1
-     */
-    public ClientConnection getConnection() {
-        return connection;
-    }
-
-    /**
-     * @since 3.1
-     */
-    public boolean isChannelEventsEnabled() {
-        return channelEventsEnabled;
-    }
-
-    public EventManager getEventManager() {
-        return eventManager;
-    }
-
-    @SuppressWarnings("unchecked")
-    public QueryResponse onQuery(ObjectContext context, Query query) {
-
-        QueryResponse response = send( new QueryMessage(query), QueryResponse.class);
-
-        // if needed, register objects in provided context, rewriting the response
-        // (assuming all lists are mutable)
-
-        if (context != null) {
-
-            EntityResolver resolver = context.getEntityResolver();
-            QueryMetadata info = query.getMetaData(resolver);
-
-            if (!info.isFetchingDataRows()) {
-
-                response.reset();
-
-                while (response.next()) {
-                    if (response.isList()) {
-
-                        List objects = response.currentList();
-
-                        if (!objects.isEmpty()) {
-
-                            DeepMergeOperation merger = new DeepMergeOperation(context);
-                            List<Object> rsMapping = info.getResultSetMapping();
-                            if (rsMapping == null) {
-                                convertSingleObjects(objects, merger);
-                            }
-                            else {
-                                if (rsMapping.size() == 1) {
-                                    if (rsMapping.get(0) instanceof EntityResultSegment) {
-                                        convertSingleObjects(objects, merger);
-                                    }
-                                }
-                                else {
-                                    processMixedResult(objects, merger, rsMapping);
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        return response;
-    }
-
-    private void processMixedResult(
-            List<Object[]> objects,
-            DeepMergeOperation merger,
-            List<Object> rsMapping) {
-
-        int width = rsMapping.size();
-        for (int i = 0; i < width; i++) {
-            if (rsMapping.get(i) instanceof EntityResultSegment) {
-                for (Object[] object : objects) {
-                    object[i] = convertObject(merger, (Persistent) object[i]);
-                }
-            }
-        }
-    }
-
-    private void convertSingleObjects(List<Object> objects, DeepMergeOperation merger) {
-
-        ListIterator<Object> it = objects.listIterator();
-        while (it.hasNext()) {
-            Object next = it.next();
-            it.set(convertObject( merger, (Persistent) next));
-        }
-    }
-
-    private Object convertObject(DeepMergeOperation merger, Persistent object) {
-
-        ObjectId id = object.getObjectId();
-
-        // sanity check
-        if (id == null) {
-            throw new CayenneRuntimeException("Server returned an object without an id: %s", object);
-        }
-
-        return merger.merge(object);
-    }
-
-    public GraphDiff onSync(
-            ObjectContext originatingContext,
-            GraphDiff changes,
-            int syncType) {
-
-        DataChannelSyncCallbackAction callbackAction = DataChannelSyncCallbackAction
-                .getCallbackAction(
-                        getEntityResolver().getCallbackRegistry(),
-                        originatingContext.getGraphManager(),
-                        changes,
-                        syncType);
-        callbackAction.applyPreCommit();
-
-        changes = diffCompressor.compress(changes);
-
-        GraphDiff replyDiff = send(new SyncMessage(
-                originatingContext,
-                syncType,
-                changes), GraphDiff.class);
-
-        if (channelEventsEnabled) {
-            EventSubject subject;
-
-            switch (syncType) {
-                case DataChannel.ROLLBACK_CASCADE_SYNC:
-                    subject = DataChannel.GRAPH_ROLLEDBACK_SUBJECT;
-                    break;
-                case DataChannel.FLUSH_NOCASCADE_SYNC:
-                    subject = DataChannel.GRAPH_CHANGED_SUBJECT;
-                    break;
-                case DataChannel.FLUSH_CASCADE_SYNC:
-                    subject = DataChannel.GRAPH_FLUSHED_SUBJECT;
-                    break;
-                default:
-                    subject = null;
-            }
-
-            if (subject != null) {
-
-                // combine message sender changes and message receiver changes into a
-                // single event
-                boolean sentNoop = changes == null || changes.isNoop();
-                boolean receivedNoop = replyDiff == null || replyDiff.isNoop();
-
-                if (!sentNoop || !receivedNoop) {
-                    CompoundDiff notification = new CompoundDiff();
-
-                    if (!sentNoop) {
-                        notification.add(changes);
-                    }
-
-                    if (!receivedNoop) {
-                        notification.add(replyDiff);
-                    }
-
-                    GraphEvent e = new GraphEvent(this, originatingContext, notification);
-                    eventManager.postEvent(e, subject);
-                }
-            }
-        }
-
-        callbackAction.applyPostCommit();
-        return replyDiff;
-    }
-
-    /**
-     * Returns EntityResolver obtained from the server. On first access, this method sends
-     * a message to the server to retrieve the EntityResolver. On subsequent calls locally
-     * cached resolver is used.
-     */
-    public EntityResolver getEntityResolver() {
-        if (entityResolver == null) {
-            synchronized (this) {
-                if (entityResolver == null) {
-                    entityResolver = send(new BootstrapMessage(), EntityResolver.class);
-                }
-            }
-        }
-
-        return entityResolver;
-    }
-
-    /**
-     * Starts up an EventBridge to listen for remote updates. Returns true if the listener
-     * was setup, false if not. False can be returned if the underlying connection doesn't
-     * support events of if there is no EventManager available.
-     */
-    protected boolean setupRemoteChannelListener() throws CayenneRuntimeException {
-        if (eventManager == null) {
-            return false;
-        }
-
-        EventBridge bridge = connection.getServerEventBridge();
-        if (bridge == null) {
-            return false;
-        }
-
-        try {
-            // make sure events are sent on behalf of this channel...and received from all
-            bridge.startup(eventManager, EventBridge.RECEIVE_LOCAL_EXTERNAL, null, this);
-        }
-        catch (Exception e) {
-            throw new CayenneRuntimeException("Error starting EventBridge " + bridge, e);
-        }
-
-        this.remoteChannelListener = bridge;
-        return true;
-    }
-
-    /**
-     * Sends a message via connector, getting a result as an instance of a specific class.
-     * 
-     * @throws org.apache.cayenne.CayenneRuntimeException if an underlying connector
-     *             exception occurred, or a result is not of expected type.
-     */
-    protected <T> T send(ClientMessage message, Class<T> resultClass) {
-        Object result = connection.sendMessage(message);
-
-        if (result != null && !resultClass.isInstance(result)) {
-            String resultString = new ToStringBuilder(result).toString();
-            throw new CayenneRuntimeException("Expected result type: %s, actual: %s"
-                    , resultClass.getName()
-                    , resultString);
-        }
-
-        return resultClass.cast(result);
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientConnection.java b/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientConnection.java
deleted file mode 100644
index 4233febc3..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/remote/ClientConnection.java
+++ /dev/null
@@ -1,47 +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
- *
- *    https://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.remote;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.event.EventBridge;
-
-/**
- * A connection object used to interact with a remote Cayenne server. Connection supports
- * synchronous interaction via {@link #sendMessage(ClientMessage)} and asynchronous
- * listening for server events.
- * 
- * @since 1.2
- */
-public interface ClientConnection {
-
-    /**
-     * Returns an EventBridge that receives remote server events. Caller would normally
-     * register returned bridge with a local EventManager, thus allowing local listeners
-     * to receive server events.
-     * 
-     * @return An EventBridge or null if server events are not supported.
-     */
-    EventBridge getServerEventBridge() throws CayenneRuntimeException;
-
-    /**
-     * Sends a synchronous ClientMessage to the server, returning a reply.
-     */
-    Object sendMessage(ClientMessage message) throws CayenneRuntimeException;
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/ClientSerializerFactory.java b/cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/ClientSerializerFactory.java
deleted file mode 100644
index 02212e87c..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/ClientSerializerFactory.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
- *
- *    https://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.remote.hessian;
-
-import com.caucho.hessian.io.FieldDeserializer2Factory;
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.util.PersistentObjectList;
-import org.apache.cayenne.util.PersistentObjectMap;
-
-import com.caucho.hessian.io.AbstractSerializerFactory;
-import com.caucho.hessian.io.Deserializer;
-import com.caucho.hessian.io.JavaDeserializer;
-import com.caucho.hessian.io.Serializer;
-
-/**
- * An object that manages all custom (de)serializers used on the client.
- * 
- * @since 1.2
- */
-public class ClientSerializerFactory extends AbstractSerializerFactory {
-
-    private Deserializer dataRowDeserializer;
-    private Deserializer listDeserializer;
-    private Deserializer mapDeserializer;
-
-    @Override
-    public Serializer getSerializer(Class cl) {
-        return null;
-    }
-
-    @Override
-    public Deserializer getDeserializer(Class cl) {
-        //turns out Hessian uses its own (incorrect) serialization mechanism for maps
-        if (PersistentObjectMap.class.isAssignableFrom(cl)) {
-            if (mapDeserializer == null) {
-                mapDeserializer = new JavaDeserializer(cl, FieldDeserializer2Factory.create());
-            }
-            return mapDeserializer;
-        }
-        
-        if (PersistentObjectList.class.isAssignableFrom(cl)) {
-            if (listDeserializer == null) {
-                listDeserializer = new JavaDeserializer(cl, FieldDeserializer2Factory.create());
-            }
-            return listDeserializer;
-        }
-        
-        if(DataRow.class.isAssignableFrom(cl)) {
-            if(dataRowDeserializer == null) {
-                dataRowDeserializer = new DataRowDeserializer();
-            }
-            
-            return dataRowDeserializer;
-        }
-
-        return null;
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/DataRowDeserializer.java b/cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/DataRowDeserializer.java
deleted file mode 100644
index 2c0a381c5..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/DataRowDeserializer.java
+++ /dev/null
@@ -1,81 +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
- *
- *    https://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.remote.hessian;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.DataRow;
-
-import com.caucho.hessian.io.AbstractHessianInput;
-import com.caucho.hessian.io.AbstractMapDeserializer;
-
-/**
- * Client side deserilaizer of DataRows.
- * 
- * @since 1.2
- */
-class DataRowDeserializer extends AbstractMapDeserializer {
-
-    protected Field versionField;
-
-    DataRowDeserializer() {
-        try {
-            versionField = DataRow.class.getDeclaredField("version");
-        }
-        catch (Exception e) {
-            throw new CayenneRuntimeException(
-                    "Error building deserializer for DataRow",
-                    e);
-        }
-
-        versionField.setAccessible(true);
-    }
-
-    @Override
-    public Class<?> getType() {
-        return DataRow.class;
-    }
-
-    @Override
-    public Object readMap(AbstractHessianInput in) throws IOException {
-
-        int size = in.readInt();
-        DataRow row = new DataRow(size);
-        try {
-            versionField.set(row, Long.valueOf(in.readLong()));
-        }
-        catch (Exception e) {
-            throw new IOException("Error reading 'version' field");
-        }
-
-        row.setReplacesVersion(in.readLong());
-        in.addRef(row);
-
-        while (!in.isEnd()) {
-            row.put((String) in.readObject(), in.readObject());
-        }
-
-        in.readEnd();
-
-        return row;
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/service/HessianUtil.java b/cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/service/HessianUtil.java
deleted file mode 100644
index b16dce91b..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/remote/hessian/service/HessianUtil.java
+++ /dev/null
@@ -1,87 +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
- *
- *    https://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.remote.hessian.service;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.Serializable;
-
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.remote.hessian.HessianConfig;
-
-import com.caucho.hessian.io.HessianInput;
-import com.caucho.hessian.io.HessianOutput;
-import org.apache.cayenne.rop.ServerHessianSerializationServiceProvider;
-import org.apache.cayenne.rop.http.ClientHessianSerializationServiceProvider;
-
-/**
- * Hessian related utilities.
- * 
- * @since 1.2
- */
-public class HessianUtil {
-
-    /**
-     * A utility method that clones an object using Hessian serialization/deserialization
-     * mechanism, which is different from default Java serialization.
-     */
-    public static Object cloneViaClientServerSerialization(
-            Serializable object,
-            EntityResolver serverResolver) throws Exception {
-        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-        HessianOutput out = new HessianOutput(bytes);
-        out.setSerializerFactory(HessianConfig.createFactory(
-                ClientHessianSerializationServiceProvider.CLIENT_SERIALIZER_FACTORIES,
-                null));
-        out.writeObject(object);
-
-        byte[] data = bytes.toByteArray();
-
-        HessianInput in = new HessianInput(new ByteArrayInputStream(data));
-        in.setSerializerFactory(HessianConfig.createFactory(
-                ServerHessianSerializationServiceProvider.SERVER_SERIALIZER_FACTORIES,
-                serverResolver));
-
-        return in.readObject();
-    }
-
-    public static Object cloneViaServerClientSerialization(
-            Serializable object,
-            EntityResolver serverResolver) throws Exception {
-        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-        HessianOutput out = new HessianOutput(bytes);
-        out.setSerializerFactory(HessianConfig.createFactory(
-				ServerHessianSerializationServiceProvider.SERVER_SERIALIZER_FACTORIES,
-                serverResolver));
-        out.writeObject(object);
-
-        byte[] data = bytes.toByteArray();
-
-        HessianInput in = new HessianInput(new ByteArrayInputStream(data));
-        in.setSerializerFactory(HessianConfig.createFactory(
-                ClientHessianSerializationServiceProvider.CLIENT_SERIALIZER_FACTORIES,
-                null));
-        return in.readObject();
-    }
-
-    private HessianUtil() {
-
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/remote/package.html b/cayenne-client/src/main/java/org/apache/cayenne/remote/package.html
deleted file mode 100644
index 1a3f7e660..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/remote/package.html
+++ /dev/null
@@ -1,24 +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
-
-     https://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.
--->
-<html>
-	<body> Contains classes an interfaces related to Cayenne remote object persistence features. 
-Defines a set of message classes used for communication between client and server and provides a ClientChannel -
-a DataChannel implementation that connects to a remote service.
-	</body>
-</html>
\ No newline at end of file
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/remote/service/LocalConnection.java b/cayenne-client/src/main/java/org/apache/cayenne/remote/service/LocalConnection.java
deleted file mode 100644
index 520f55927..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/remote/service/LocalConnection.java
+++ /dev/null
@@ -1,144 +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
- *
- *    https://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.remote.service;
-
-import java.io.Serializable;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.event.EventBridge;
-import org.apache.cayenne.remote.BaseConnection;
-import org.apache.cayenne.remote.ClientMessage;
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.apache.cayenne.util.Util;
-
-/**
- * A ClientConnection that connects to a DataChannel. Used as an emulator of a remote
- * service. Emulation includes serialization/deserialization of objects.
- * 
- * @since 1.2
- */
-public class LocalConnection extends BaseConnection {
-
-    public static final int NO_SERIALIZATION = 0;
-    public static final int JAVA_SERIALIZATION = 1;
-    public static final int HESSIAN_SERIALIZATION = 2;
-
-    protected DataChannel channel;
-    protected int serializationPolicy;
-
-    /**
-     * Creates LocalConnector with specified handler and no serialization.
-     */
-    public LocalConnection(DataChannel handler) {
-        this(handler, NO_SERIALIZATION);
-    }
-
-    /**
-     * Creates a LocalConnector with specified handler and serialization policy. Valid
-     * policies are defined as final static int field in this class.
-     */
-    public LocalConnection(DataChannel handler, int serializationPolicy) {
-        this.channel = handler;
-
-        // convert invalid policy to NO_SER..
-        this.serializationPolicy = serializationPolicy == JAVA_SERIALIZATION
-                || serializationPolicy == HESSIAN_SERIALIZATION
-                ? serializationPolicy
-                : NO_SERIALIZATION;
-    }
-
-    public boolean isSerializingMessages() {
-        return serializationPolicy == JAVA_SERIALIZATION
-                || serializationPolicy == HESSIAN_SERIALIZATION;
-    }
-
-    /**
-     * Returns wrapped DataChannel.
-     */
-    public DataChannel getChannel() {
-        return channel;
-    }
-
-    /**
-     * Returns null.
-     */
-    public EventBridge getServerEventBridge() {
-        return null;
-    }
-
-    /**
-     * Does nothing.
-     */
-    @Override
-    protected void beforeSendMessage(ClientMessage message) {
-        // noop
-    }
-
-    /**
-     * Dispatches a message to an internal handler.
-     */
-    @Override
-    protected Object doSendMessage(ClientMessage message) throws CayenneRuntimeException {
-
-        ClientMessage processedMessage;
-
-        try {
-            switch (serializationPolicy) {
-                case HESSIAN_SERIALIZATION:
-                    processedMessage = (ClientMessage) HessianUtil
-                            .cloneViaClientServerSerialization(message, channel
-                                    .getEntityResolver());
-                    break;
-
-                case JAVA_SERIALIZATION:
-                    processedMessage = Util.cloneViaSerialization(message);
-                    break;
-
-                default:
-                    processedMessage = message;
-            }
-
-        }
-        catch (Exception ex) {
-            throw new CayenneRuntimeException("Error serializing message", ex);
-        }
-
-        Serializable result = (Serializable) DispatchHelper.dispatch(
-                channel,
-                processedMessage);
-
-        try {
-            switch (serializationPolicy) {
-                case HESSIAN_SERIALIZATION:
-                    return HessianUtil.cloneViaServerClientSerialization(result, channel
-                            .getEntityResolver());
-                case JAVA_SERIALIZATION:
-                    return Util.cloneViaSerialization(result);
-                default:
-                    return result;
-            }
-        }
-        catch (Exception ex) {
-            throw new CayenneRuntimeException("Error deserializing result", ex);
-        }
-
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/rop/HttpClientConnection.java b/cayenne-client/src/main/java/org/apache/cayenne/rop/HttpClientConnection.java
deleted file mode 100644
index f72723722..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/rop/HttpClientConnection.java
+++ /dev/null
@@ -1,134 +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
- *
- *    https://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.rop;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.di.BeforeScopeEnd;
-import org.apache.cayenne.event.EventBridge;
-import org.apache.cayenne.event.EventBridgeFactory;
-import org.apache.cayenne.remote.BaseConnection;
-import org.apache.cayenne.remote.ClientMessage;
-import org.apache.cayenne.remote.RemoteService;
-import org.apache.cayenne.remote.RemoteSession;
-
-import java.rmi.RemoteException;
-
-public class HttpClientConnection extends BaseConnection {
-
-	private RemoteService remoteService;
-	private RemoteSession session;
-
-	private String sharedSessionName;
-    
-    public HttpClientConnection(RemoteService remoteService, String sharedSession) {
-        this.remoteService = remoteService;
-        this.sharedSessionName = sharedSession;
-    }
-
-    public RemoteSession getSession() {
-        return session;
-    }
-
-	@Override
-	protected void beforeSendMessage(ClientMessage message) throws CayenneRuntimeException {
-		if (session == null) {
-			connect();
-		}
-	}
-
-	@Override
-	protected Object doSendMessage(ClientMessage message) throws CayenneRuntimeException {
-        try {
-            return remoteService.processMessage(message);
-        }
-        catch (CayenneRuntimeException e) {
-            throw e;
-        }
-        catch (Throwable th) {
-            throw new CayenneRuntimeException(th.getMessage(), th);
-        }
-	}
-
-	@Override
-	public EventBridge getServerEventBridge() throws CayenneRuntimeException {
-        if (session == null) {
-            connect();
-        }
-
-        return createServerEventBridge(session);
-	}
-
-    @BeforeScopeEnd
-    public void shutdown() throws RemoteException {
-            remoteService.close();
-    }
-
-	protected synchronized void connect() {
-		if (session != null) {
-			return;
-		}
-        
-        long t0 = System.currentTimeMillis();
-
-		// create server session...
-		try {
-			this.session = (sharedSessionName != null) ? remoteService
-					.establishSharedSession(sharedSessionName) : remoteService
-					.establishSession();
-		}
-		catch (Throwable th) {
-			logger.info(th.getMessage(), th);
-			throw new CayenneRuntimeException(th.getMessage(), th);
-		}
-
-        if (logger.isInfoEnabled()) {
-            long time = System.currentTimeMillis() - t0;
-            logger.info("=== Connected, session: "
-                    + session
-                    + " - took "
-                    + time
-                    + " ms.");
-        }
-	}
-
-    /**
-     * Creates an EventBridge that will listen for server events. Returns null if server
-     * events support is not configured in the descriptor.
-     *
-     * @throws CayenneRuntimeException if EventBridge startup fails for any reason.
-     */
-    protected EventBridge createServerEventBridge(RemoteSession session) throws CayenneRuntimeException {
-
-        if (!session.isServerEventsEnabled()) {
-            return null;
-        }
-
-        try {
-            EventBridgeFactory factory = (EventBridgeFactory) Class.forName(session.getEventBridgeFactory())
-                    .newInstance();
-
-            // must use "name", not the sessionId as an external subject for the
-            // event bridge
-            return factory.createEventBridge(RemoteSession.getSubjects(), session.getName(),
-                    session.getEventBridgeParameters());
-        } catch (Exception ex) {
-            throw new CayenneRuntimeException("Error creating EventBridge.", ex);
-        }
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/rop/HttpClientConnectionProvider.java b/cayenne-client/src/main/java/org/apache/cayenne/rop/HttpClientConnectionProvider.java
deleted file mode 100644
index 3138c434d..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/rop/HttpClientConnectionProvider.java
+++ /dev/null
@@ -1,73 +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
- *
- *    https://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.rop;
-
-import org.apache.cayenne.ConfigurationException;
-import org.apache.cayenne.configuration.RuntimeProperties;
-import org.apache.cayenne.configuration.rop.client.ClientConstants;
-import org.apache.cayenne.di.DIRuntimeException;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.di.Provider;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.rop.http.HttpROPConnector;
-
-public class HttpClientConnectionProvider implements Provider<ClientConnection> {
-
-    @Inject
-    protected RuntimeProperties runtimeProperties;
-    
-    @Inject
-    protected Provider<ROPSerializationService> serializationServiceProvider;
-
-    @Override
-    public ClientConnection get() throws DIRuntimeException {
-        String sharedSession = runtimeProperties
-                .get(ClientConstants.ROP_SERVICE_SHARED_SESSION_PROPERTY);
-
-        HttpROPConnector ropConnector = createHttpRopConnector();
-        ProxyRemoteService remoteService = new ProxyRemoteService(serializationServiceProvider.get(), ropConnector);
-
-        HttpClientConnection clientConnection = new HttpClientConnection(remoteService, sharedSession);
-        ropConnector.setClientConnection(clientConnection);
-
-        return clientConnection;
-    }
-
-    protected HttpROPConnector createHttpRopConnector() {
-        String url = runtimeProperties.get(ClientConstants.ROP_SERVICE_URL_PROPERTY);
-        if (url == null) {
-            throw new ConfigurationException(
-                    "No property defined for '%s', can't initialize HessianConnection",
-                    ClientConstants.ROP_SERVICE_URL_PROPERTY);
-        }
-
-        String userName = runtimeProperties.get(ClientConstants.ROP_SERVICE_USERNAME_PROPERTY);
-        String password = runtimeProperties.get(ClientConstants.ROP_SERVICE_PASSWORD_PROPERTY);
-
-        long readTimeout = runtimeProperties.getLong(ClientConstants.ROP_SERVICE_TIMEOUT_PROPERTY, -1L);
-
-        HttpROPConnector result = new HttpROPConnector(url, userName, password);
-
-        if (readTimeout > 0) {
-            result.setReadTimeout(readTimeout);
-        }
-
-        return result;
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/rop/ProxyRemoteService.java b/cayenne-client/src/main/java/org/apache/cayenne/rop/ProxyRemoteService.java
deleted file mode 100644
index e2208211f..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/rop/ProxyRemoteService.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
- *
- *    https://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.rop;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.remote.ClientMessage;
-import org.apache.cayenne.remote.RemoteService;
-import org.apache.cayenne.remote.RemoteSession;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.rmi.RemoteException;
-
-public class ProxyRemoteService implements RemoteService {
-
-    protected ROPSerializationService serializationService;
-
-    protected ROPConnector ropConnector;
-
-    public ProxyRemoteService(@Inject ROPSerializationService serializationService, @Inject ROPConnector ropConnector) {
-        this.serializationService = serializationService;
-        this.ropConnector = ropConnector;
-    }
-
-    @Override
-    public RemoteSession establishSession() throws RemoteException {
-        try (InputStream is = ropConnector.establishSession()) {
-            return serializationService.deserialize(is, RemoteSession.class);
-        } catch (IOException e) {
-            throw new RemoteException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public RemoteSession establishSharedSession(String name) throws RemoteException {
-        try (InputStream is = ropConnector.establishSharedSession(name)) {
-            return serializationService.deserialize(is, RemoteSession.class);
-        } catch (IOException e) {
-            throw new RemoteException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public Object processMessage(ClientMessage message) throws RemoteException, Throwable {
-        try (InputStream is = ropConnector.sendMessage(serializationService.serialize(message))) {
-            return serializationService.deserialize(is, Object.class);
-        } catch (IOException e) {
-            throw new RemoteException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void close() throws RemoteException {
-        try {
-            ropConnector.close();
-        } catch (IOException e) {
-            throw new RemoteException("Exception while closing ROP resources", e);
-        }
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/rop/ROPConnector.java b/cayenne-client/src/main/java/org/apache/cayenne/rop/ROPConnector.java
deleted file mode 100644
index 9f350d6f2..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/rop/ROPConnector.java
+++ /dev/null
@@ -1,52 +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
- *
- *    https://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.rop;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * ROP network connectivity interface.
- * 
- * @since 4.0
- */
-public interface ROPConnector {
-
-	/**
-	 * Establishes a dedicated session with Cayenne DataChannel, returning session id.
-	 */
-    InputStream establishSession() throws IOException;
-
-	/**
-	 * Creates a new session with the specified or joins an existing one. This method is
-	 * used to bootstrap collaborating clients of a single "group chat".
-	 */
-    InputStream establishSharedSession(String sharedSessionName) throws IOException;
-
-	/**
-	 * Processes message on a remote server, returning the result of such processing.
-	 */
-    InputStream sendMessage(byte[] message) throws IOException;
-
-	/**
-	 * Close all resources related to ROP Connector.
-	 */
-	void close() throws IOException;
-    
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/rop/ROPUtil.java b/cayenne-client/src/main/java/org/apache/cayenne/rop/ROPUtil.java
deleted file mode 100644
index d79d2ba8c..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/rop/ROPUtil.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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.rop;
-
-import java.util.Map;
-
-public class ROPUtil {
-
-    public static String getLogConnect(String url, String username, boolean password) {
-        return getLogConnect(url, username, password, null);
-    }
-
-    public static String getLogConnect(String url, String username, boolean password, String sharedSessionName) {
-        StringBuilder log = new StringBuilder("Connecting to [");
-        if (username != null) {
-            log.append(username);
-
-            if (password) {
-                log.append(":*******");
-            }
-
-            log.append("@");
-        }
-
-        log.append(url);
-        log.append("]");
-
-        if (sharedSessionName != null) {
-            log.append(" - shared session '").append(sharedSessionName).append("'");
-        } else {
-            log.append(" - dedicated session.");
-        }
-
-        return log.toString();
-    }
-
-    public static String getLogDisconnect(String url, String username, boolean password) {
-        StringBuilder log = new StringBuilder("Disconnecting from [");
-        if (username != null) {
-            log.append(username);
-
-            if (password) {
-                log.append(":*******");
-            }
-
-            log.append("@");
-        }
-
-        log.append(url);
-        log.append("]");
-
-        return log.toString();
-    }
-
-    public static String getParamsAsString(Map<String, String> params) {
-        StringBuilder urlParams = new StringBuilder();
-
-        for (Map.Entry<String, String> entry : params.entrySet()) {
-            if (urlParams.length() > 0) {
-                urlParams.append('&');
-            }
-
-            urlParams.append(entry.getKey());
-            urlParams.append('=');
-            urlParams.append(entry.getValue());
-        }
-
-        return urlParams.toString();
-    }
-
-    public static String getBasicAuth(String username, String password) {
-        if (username != null && password != null) {
-            return "Basic " + base64(username + ":" + password);
-        }
-
-        return null;
-    }
-
-    /**
-     * Creates the Base64 value.
-     */
-    public static String base64(String value) {
-        StringBuffer cb = new StringBuffer();
-
-        int i = 0;
-        for (i = 0; i + 2 < value.length(); i += 3) {
-            long chunk = (int) value.charAt(i);
-            chunk = (chunk << 8) + (int) value.charAt(i + 1);
-            chunk = (chunk << 8) + (int) value.charAt(i + 2);
-
-            cb.append(encode(chunk >> 18));
-            cb.append(encode(chunk >> 12));
-            cb.append(encode(chunk >> 6));
-            cb.append(encode(chunk));
-        }
-
-        if (i + 1 < value.length()) {
-            long chunk = (int) value.charAt(i);
-            chunk = (chunk << 8) + (int) value.charAt(i + 1);
-            chunk <<= 8;
-
-            cb.append(encode(chunk >> 18));
-            cb.append(encode(chunk >> 12));
-            cb.append(encode(chunk >> 6));
-            cb.append('=');
-        } else if (i < value.length()) {
-            long chunk = (int) value.charAt(i);
-            chunk <<= 16;
-
-            cb.append(encode(chunk >> 18));
-            cb.append(encode(chunk >> 12));
-            cb.append('=');
-            cb.append('=');
-        }
-
-        return cb.toString();
-    }
-
-    public static char encode(long d) {
-        d &= 0x3f;
-        if (d < 26) {
-            return (char) (d + 'A');
-        } else if (d < 52) {
-            return (char) (d + 'a' - 26);
-        } else if (d < 62) {
-            return (char) (d + '0' - 52);
-        } else if (d == 62) {
-            return '+';
-        } else {
-            return '/';
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/rop/http/ClientHessianSerializationServiceProvider.java b/cayenne-client/src/main/java/org/apache/cayenne/rop/http/ClientHessianSerializationServiceProvider.java
deleted file mode 100644
index 200d69ac5..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/rop/http/ClientHessianSerializationServiceProvider.java
+++ /dev/null
@@ -1,39 +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
- *
- *    https://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.rop.http;
-
-import org.apache.cayenne.di.DIRuntimeException;
-import org.apache.cayenne.di.Provider;
-import org.apache.cayenne.remote.hessian.ClientSerializerFactory;
-import org.apache.cayenne.remote.hessian.HessianConfig;
-import org.apache.cayenne.rop.HessianROPSerializationService;
-import org.apache.cayenne.rop.ROPSerializationService;
-
-public class ClientHessianSerializationServiceProvider implements Provider<ROPSerializationService> {
-
-    public static final String[] CLIENT_SERIALIZER_FACTORIES = new String[] {
-            ClientSerializerFactory.class.getName()
-    };
-
-    @Override
-    public ROPSerializationService get() throws DIRuntimeException {
-        return new HessianROPSerializationService(
-                HessianConfig.createFactory(CLIENT_SERIALIZER_FACTORIES, null));
-    }
-}
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/rop/http/HttpROPConnector.java b/cayenne-client/src/main/java/org/apache/cayenne/rop/http/HttpROPConnector.java
deleted file mode 100644
index 7ed926950..000000000
--- a/cayenne-client/src/main/java/org/apache/cayenne/rop/http/HttpROPConnector.java
+++ /dev/null
@@ -1,166 +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
- *
- *    https://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.rop.http;
-
-import org.apache.cayenne.remote.RemoteSession;
-import org.apache.cayenne.rop.HttpClientConnection;
-import org.apache.cayenne.rop.ROPConnector;
-import org.apache.cayenne.rop.ROPConstants;
-import org.apache.cayenne.rop.ROPUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-
-public class HttpROPConnector implements ROPConnector {
-
-    private static final Logger logger = LoggerFactory.getLogger(HttpROPConnector.class);
-
-    public static final String SESSION_COOKIE_NAME = "JSESSIONID";
-
-    private HttpClientConnection clientConnection;
-
-    private String url;
-
-    private String username;
-    private String password;
-
-    private Long readTimeout;
-    
-    public HttpROPConnector(String url, String username, String password) {
-        this.url = url;
-        this.username = username;
-        this.password = password;
-    }
-
-    public void setClientConnection(HttpClientConnection clientConnection) {
-        this.clientConnection = clientConnection;
-    }
-    
-    public void setReadTimeout(Long readTimeout) {
-        this.readTimeout = readTimeout;
-    }
-
-    @Override
-    public InputStream establishSession() throws IOException {
-        if (logger.isInfoEnabled()) {
-            logger.info(ROPUtil.getLogConnect(url, username, password != null));
-        }
-		
-		Map<String, String> requestParams = new HashMap<>();
-		requestParams.put(ROPConstants.OPERATION_PARAMETER, ROPConstants.ESTABLISH_SESSION_OPERATION);
-		
-        return doRequest(requestParams);
-    }
-
-    @Override
-    public InputStream establishSharedSession(String sharedSessionName) throws IOException {
-        if (logger.isInfoEnabled()) {
-            logger.info(ROPUtil.getLogConnect(url, username, password != null, sharedSessionName));
-        }
-
-		Map<String, String> requestParams = new HashMap<>();
-		requestParams.put(ROPConstants.OPERATION_PARAMETER, ROPConstants.ESTABLISH_SHARED_SESSION_OPERATION);
-		requestParams.put(ROPConstants.SESSION_NAME_PARAMETER, sharedSessionName);
-
-		return doRequest(requestParams);
-    }
-
-    @Override
-    public InputStream sendMessage(byte[] message) throws IOException {
-        return doRequest(message);
-    }
-
-    @Override
-    public void close() throws IOException {
-        if (logger.isInfoEnabled()) {
-            logger.info(ROPUtil.getLogDisconnect(url, username, password != null));
-        }
-    }
-
-    protected InputStream doRequest(Map<String, String> params) throws IOException {
-        URLConnection connection = new URL(url).openConnection();
-
-        if (readTimeout != null) {
-            connection.setReadTimeout(readTimeout.intValue());
-        }
-
-        addAuthHeader(connection);
-
-        connection.setDoOutput(true);
-
-        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
-        connection.setRequestProperty("charset", "utf-8");
-
-        try (OutputStream output = connection.getOutputStream()) {
-            output.write(ROPUtil.getParamsAsString(params).getBytes(StandardCharsets.UTF_8));
-            output.flush();
-        }
-
-        return connection.getInputStream();
-    }
-
-    protected InputStream doRequest(byte[] data) throws IOException {
-        URLConnection connection = new URL(url).openConnection();
-
-        if (readTimeout != null) {
-            connection.setReadTimeout(readTimeout.intValue());
-        }
-
-        addAuthHeader(connection);
-        addSessionCookie(connection);
-        connection.setDoOutput(true);
-
-        connection.setRequestProperty("Content-Type", "application/octet-stream");
-
-        if (data != null) {
-            try (OutputStream output = connection.getOutputStream()) {
-                output.write(data);
-                output.flush();
-            }
-        }
-
-        return connection.getInputStream();
-    }
-
-    protected void addAuthHeader(URLConnection connection) {
-        String basicAuth = ROPUtil.getBasicAuth(username, password);
-
-        if (basicAuth != null) {
-            connection.addRequestProperty("Authorization", basicAuth);
-        }
-    }
-
-    protected void addSessionCookie(URLConnection connection) {
-        RemoteSession session = clientConnection.getSession();
-        if (session != null && session.getSessionId() != null) {
-            connection.addRequestProperty("Cookie", SESSION_COOKIE_NAME
-                    + "="
-                    + session.getSessionId());
-        }
-    }
-
-}
diff --git a/cayenne-client/src/main/resources/META-INF/services/org.apache.cayenne.configuration.rop.client.CayenneClientModuleProvider b/cayenne-client/src/main/resources/META-INF/services/org.apache.cayenne.configuration.rop.client.CayenneClientModuleProvider
deleted file mode 100644
index dda3d4d3d..000000000
--- a/cayenne-client/src/main/resources/META-INF/services/org.apache.cayenne.configuration.rop.client.CayenneClientModuleProvider
+++ /dev/null
@@ -1,20 +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
-#
-#    https://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.
-##################################################################
-
-org.apache.cayenne.configuration.rop.client.MainCayenneClientModuleProvider
\ No newline at end of file
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneIT.java
deleted file mode 100644
index 8940ab936..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneIT.java
+++ /dev/null
@@ -1,51 +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
- *
- *    https://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.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextCayenneIT extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-
-    @Test
-    public void testObjectForPK() throws Exception {
-
-        context.performGenericQuery(new SQLTemplate(
-                ClientMtTable1.class,
-                "insert into MT_TABLE1 "
-                        + "(TABLE1_ID, GLOBAL_ATTRIBUTE1, SERVER_ATTRIBUTE1) "
-                        + "values (1, 'g1', 's1')"));
-
-        ClientMtTable1 o = Cayenne.objectForPK(context, ClientMtTable1.class, 1);
-        assertNotNull(o);
-        assertEquals("g1", o.getGlobalAttribute1());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java
deleted file mode 100644
index ae63b45bd..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java
+++ /dev/null
@@ -1,353 +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
- *
- *    https://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.configuration.rop.client.ClientConstants;
-import org.apache.cayenne.configuration.rop.client.ClientRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.ObjectIdQuery;
-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.ClientMtTable4;
-import org.apache.cayenne.testdo.mt.ClientMtTable5;
-import org.apache.cayenne.unit.di.client.ClientCaseContextsSync;
-import org.apache.cayenne.unit.di.client.ClientRuntimeProperty;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Tests peer context synchronization via ClientChannel events.
- */
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-@ClientRuntimeProperty({
-        ClientConstants.ROP_CHANNEL_EVENTS_PROPERTY, "true"
-})
-public class CayenneContextClientChannelEventsIT extends ClientCaseContextsSync {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private ClientRuntime runtime;
-
-    private TableHelper tMtTable1;
-    private TableHelper tMtTable2;
-    private TableHelper tMtTable4;
-    private TableHelper tMtTable5;
-    private TableHelper tMtJoin45;
-
-    @Before
-    public void setUp() throws Exception {
-        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");
-
-        tMtTable4 = new TableHelper(dbHelper, "MT_TABLE4");
-        tMtTable4.setColumns("ID");
-
-        tMtTable5 = new TableHelper(dbHelper, "MT_TABLE5");
-        tMtTable5.setColumns("ID");
-
-        tMtJoin45 = new TableHelper(dbHelper, "MT_JOIN45");
-        tMtJoin45.setColumns("TABLE4_ID", "TABLE5_ID");
-    }
-
-    @Test
-    public void testSyncNewObject() throws Exception {
-
-        CayenneContext c1 = (CayenneContext) runtime.newContext();
-        CayenneContext c2 = (CayenneContext) runtime.newContext();
-        assertNotSame(c1, c2);
-
-        ClientMtTable1 o1 = c1.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1("X");
-        c1.commitChanges();
-
-        ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode(
-                o1.getObjectId());
-
-        assertNull(o2);
-        // now fetch it fresh
-
-        o2 = (ClientMtTable1) c2.performQuery(new ObjectIdQuery(o1.getObjectId())).get(0);
-        assertNotNull(o2);
-
-        assertEquals("X", o2.getGlobalAttribute1());
-        assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState());
-        assertFalse(c1.internalGraphManager().hasChanges());
-        assertFalse(c2.internalGraphManager().hasChanges());
-    }
-
-    @Test
-    public void testSyncNewDeletedObject() throws Exception {
-
-        CayenneContext c1 = (CayenneContext) runtime.newContext();
-        CayenneContext c2 = (CayenneContext) runtime.newContext();
-        assertNotSame(c1, c2);
-
-        // insert, then delete - this shouldn't propagate via an event.
-        ClientMtTable1 o1 = c1.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1("X");
-        c1.deleteObjects(o1);
-
-        // introduce some other change so that commit can go ahead...
-        ClientMtTable1 o1x = c1.newObject(ClientMtTable1.class);
-        o1x.setGlobalAttribute1("Y");
-        c1.commitChanges();
-
-        ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode(
-                o1.getObjectId());
-
-        assertNull(o2);
-
-        assertFalse(c1.internalGraphManager().hasChanges());
-        assertFalse(c2.internalGraphManager().hasChanges());
-    }
-
-    @Test
-    public void testSyncNewObjectIntoDirtyContext() throws Exception {
-
-        CayenneContext c1 = (CayenneContext) runtime.newContext();
-        CayenneContext c2 = (CayenneContext) runtime.newContext();
-        assertNotSame(c1, c2);
-
-        // make sure c2 has uncommitted changes
-        c2.newObject(ClientMtTable1.class);
-
-        ClientMtTable1 o1 = c1.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1("X");
-        c1.commitChanges();
-
-        ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode(
-                o1.getObjectId());
-        assertNull(o2);
-
-        // now fetch it fresh
-
-        o2 = (ClientMtTable1) c2.performQuery(new ObjectIdQuery(o1.getObjectId())).get(0);
-        assertNotNull(o2);
-        assertEquals("X", o2.getGlobalAttribute1());
-        assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState());
-        assertFalse(c1.internalGraphManager().hasChanges());
-        assertTrue(c2.internalGraphManager().hasChanges());
-    }
-
-    @Test
-    public void testSyncSimpleProperty() throws Exception {
-
-        tMtTable1.insert(1, "g1", "s1");
-
-        CayenneContext c1 = (CayenneContext) runtime.newContext();
-        CayenneContext c2 = (CayenneContext) runtime.newContext();
-        assertNotSame(c1, c2);
-
-        ClientMtTable1 o1 = (ClientMtTable1) Cayenne.objectForQuery(
-                c1,
-                new ObjectIdQuery(ObjectId.of("MtTable1", "TABLE1_ID", 1)));
-
-        ClientMtTable1 o2 = (ClientMtTable1) Cayenne.objectForQuery(
-                c2,
-                new ObjectIdQuery(ObjectId.of("MtTable1", "TABLE1_ID", 1)));
-
-        assertEquals("g1", o1.getGlobalAttribute1());
-        assertEquals("g1", o2.getGlobalAttribute1());
-
-        o1.setGlobalAttribute1("X");
-        c1.commitChanges();
-        
-        // let the events propagate to peers
-        Thread.sleep(500);
-
-        assertEquals("X", o2.getGlobalAttribute1());
-        assertFalse(c1.internalGraphManager().hasChanges());
-        assertFalse(c2.internalGraphManager().hasChanges());
-    }
-
-    @Test
-    public void testSyncToOneRelationship() throws Exception {
-
-        tMtTable1.insert(1, "g1", "s1");
-        tMtTable1.insert(2, "g2", "s2");
-        tMtTable2.insert(1, 1, "g1");
-
-        CayenneContext c1 = (CayenneContext) runtime.newContext();
-        CayenneContext c2 = (CayenneContext) runtime.newContext();
-
-        ClientMtTable2 o1 = (ClientMtTable2) Cayenne.objectForQuery(
-                c1,
-                new ObjectIdQuery(ObjectId.of("MtTable2", "TABLE2_ID", 1)));
-
-        ClientMtTable2 o2 = (ClientMtTable2) Cayenne.objectForQuery(
-                c2,
-                new ObjectIdQuery(ObjectId.of("MtTable2", "TABLE2_ID", 1)));
-
-        assertEquals("g1", o1.getTable1().getGlobalAttribute1());
-        assertEquals("g1", o2.getTable1().getGlobalAttribute1());
-
-        ClientMtTable1 o1r = (ClientMtTable1) Cayenne.objectForQuery(
-                c1,
-                new ObjectIdQuery(ObjectId.of("MtTable1", "TABLE1_ID", 2)));
-        o1.setTable1(o1r);
-        c1.commitChanges();
-        
-        // let the events propagate to peers
-        Thread.sleep(500);
-
-        assertEquals("g2", o2.getTable1().getGlobalAttribute1());
-        assertEquals(o1r.getObjectId(), o2.getTable1().getObjectId());
-        assertFalse(c1.internalGraphManager().hasChanges());
-        assertFalse(c2.internalGraphManager().hasChanges());
-    }
-
-    @Test
-    public void testSyncToManyRelationship() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-        tMtTable2.insert(1, 1, "g1");
-
-        CayenneContext c1 = (CayenneContext) runtime.newContext();
-        CayenneContext c2 = (CayenneContext) runtime.newContext();
-
-        ClientMtTable1 o1 = (ClientMtTable1) Cayenne.objectForQuery(
-                c1,
-                new ObjectIdQuery(ObjectId.of("MtTable1", "TABLE1_ID", 1)));
-
-        ClientMtTable1 o2 = (ClientMtTable1) Cayenne.objectForQuery(
-                c2,
-                new ObjectIdQuery(ObjectId.of("MtTable1", "TABLE1_ID", 1)));
-
-        assertEquals(1, o1.getTable2Array().size());
-        assertEquals(1, o2.getTable2Array().size());
-
-        ClientMtTable2 o1r = c1.newObject(ClientMtTable2.class);
-        o1r.setGlobalAttribute("X");
-        o1.addToTable2Array(o1r);
-
-        c1.commitChanges();
-        
-        // let the events propagate to peers
-        Thread.sleep(500);
-
-        assertEquals(2, o1.getTable2Array().size());
-        assertEquals(2, o2.getTable2Array().size());
-        assertFalse(c1.internalGraphManager().hasChanges());
-        assertFalse(c2.internalGraphManager().hasChanges());
-    }
-
-    @Test
-    public void testSyncToManyRelationship1() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-        tMtTable2.insert(1, 1, "g1");
-
-        CayenneContext c1 = (CayenneContext) runtime.newContext();
-        CayenneContext c2 = (CayenneContext) runtime.newContext();
-
-        ClientMtTable1 o1 = (ClientMtTable1) Cayenne.objectForQuery(
-                c1,
-                new ObjectIdQuery(ObjectId.of("MtTable1", "TABLE1_ID", 1)));
-
-        // do not resolve objects in question in the second context and see if the merge
-        // causes any issues...
-
-        assertEquals(1, o1.getTable2Array().size());
-
-        ClientMtTable2 o1r = c1.newObject(ClientMtTable2.class);
-        o1r.setGlobalAttribute("X");
-        o1.addToTable2Array(o1r);
-
-        c1.commitChanges();
-
-        assertEquals(2, o1.getTable2Array().size());
-
-        assertFalse(c1.internalGraphManager().hasChanges());
-        assertFalse(c2.internalGraphManager().hasChanges());
-
-        ClientMtTable1 o2 = (ClientMtTable1) Cayenne.objectForQuery(
-                c2,
-                new ObjectIdQuery(ObjectId.of("MtTable1", "TABLE1_ID", 1)));
-        assertEquals(2, o2.getTable2Array().size());
-    }
-
-    @Test
-    public void testSyncManyToManyRelationship() throws Exception {
-        tMtTable4.insert(1);
-        tMtTable5.insert(1);
-        tMtTable5.insert(2);
-        tMtJoin45.insert(1, 1);
-        tMtJoin45.insert(1, 2);
-
-        CayenneContext c1 = (CayenneContext) runtime.newContext();
-        CayenneContext c2 = (CayenneContext) runtime.newContext();
-
-        ClientMtTable4 o1 = (ClientMtTable4) Cayenne.objectForQuery(
-                c1,
-                new ObjectIdQuery(ObjectId.of("MtTable4", "ID", 1)));
-
-        ClientMtTable4 o2 = (ClientMtTable4) Cayenne.objectForQuery(
-                c2,
-                new ObjectIdQuery(ObjectId.of("MtTable4", "ID", 1)));
-
-        assertEquals(2, o1.getTable5s().size());
-        assertEquals(2, o2.getTable5s().size());
-
-        ClientMtTable5 o1r = (ClientMtTable5) Cayenne.objectForQuery(
-                c1,
-                new ObjectIdQuery(ObjectId.of("MtTable5", "ID", 1)));
-        o1.removeFromTable5s(o1r);
-
-        c1.commitChanges();
-        // let the events propagate to peers
-        Thread.sleep(500);
-
-        assertEquals(1, o1.getTable5s().size());
-        assertEquals(1, o2.getTable5s().size());
-        assertFalse(c1.internalGraphManager().hasChanges());
-        assertFalse(c2.internalGraphManager().hasChanges());
-    }
-
-    @Test
-    public void testSyncManyToManyRelationship1() throws Exception {
-
-        CayenneContext c1 = (CayenneContext) runtime.newContext();
-        CayenneContext c2 = (CayenneContext) runtime.newContext();
-
-        ClientMtTable4 o1 = c1.newObject(ClientMtTable4.class);
-        ClientMtTable5 o1r = c1.newObject(ClientMtTable5.class);
-        c1.commitChanges();
-
-        ClientMtTable4 o2 = c2.localObject(o1);
-        ClientMtTable5 o2r = c2.localObject(o1r);
-
-        o2.addToTable5s(o2r);
-        c2.commitChanges();
-
-        assertEquals(1, o1.getTable5s().size());
-        assertEquals(1, o2.getTable5s().size());
-        assertFalse(c1.internalGraphManager().hasChanges());
-        assertFalse(c2.internalGraphManager().hasChanges());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesIT.java
deleted file mode 100644
index 61f132879..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesIT.java
+++ /dev/null
@@ -1,123 +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
- *
- *    https://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.testdo.deleterules.ClientDeleteCascade;
-import org.apache.cayenne.testdo.deleterules.ClientDeleteDeny;
-import org.apache.cayenne.testdo.deleterules.ClientDeleteNullify;
-import org.apache.cayenne.testdo.deleterules.ClientDeleteRule;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-@UseServerRuntime(CayenneProjects.DELETE_RULES_PROJECT)
-public class CayenneContextDeleteRulesIT extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-
-    @Test
-    public void testNullifyToOne() {
-
-        ClientDeleteNullify object = context.newObject(ClientDeleteNullify.class);
-        object.setName("object");
-
-        ClientDeleteRule related = context.newObject(ClientDeleteRule.class);
-        object.setName("related");
-
-        object.setNullify(related);
-        context.commitChanges();
-
-        context.deleteObjects(object);
-        assertFalse(related.getFromNullify().contains(object));
-        assertNull(object.getNullify());
-
-        // And be sure that the commit works afterwards, just for sanity
-        context.commitChanges();
-    }
-
-    @Test
-    public void testDenyToOne() {
-
-        ClientDeleteDeny object = context.newObject(ClientDeleteDeny.class);
-        ClientDeleteRule related = context.newObject(ClientDeleteRule.class);
-        object.setDeny(related);
-        context.commitChanges();
-
-        try {
-            context.deleteObjects(object);
-            fail("Should have thrown an exception");
-        }
-        catch (DeleteDenyException e) {
-            // expected
-        }
-
-        object.setDeny(null);
-        context.deleteObjects(object);
-        context.commitChanges();
-    }
-
-    @Test
-    public void testCascadeToOne() {
-
-        ClientDeleteCascade object = context.newObject(ClientDeleteCascade.class);
-        object.setName("object");
-
-        ClientDeleteRule related = context.newObject(ClientDeleteRule.class);
-        object.setName("related");
-
-        object.setCascade(related);
-        context.commitChanges();
-
-        context.deleteObjects(object);
-        assertEquals(PersistenceState.DELETED, related.getPersistenceState());
-        assertTrue(context.deletedObjects().contains(related));
-
-        // And be sure that the commit works afterwards, just for sanity
-        context.commitChanges();
-    }
-
-    @Test
-    public void testCascadeToOneNewObject() {
-
-        ClientDeleteRule related = context.newObject(ClientDeleteRule.class);
-        context.commitChanges();
-
-        ClientDeleteCascade object = context.newObject(ClientDeleteCascade.class);
-        object.setName("object");
-        object.setCascade(related);
-
-        context.deleteObjects(object);
-        assertEquals(PersistenceState.TRANSIENT, object.getPersistenceState());
-        assertEquals(PersistenceState.DELETED, related.getPersistenceState());
-        assertFalse(context.deletedObjects().contains(object));
-        assertTrue(context.deletedObjects().contains(related));
-
-        context.commitChanges();
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLIT.java
deleted file mode 100644
index 55c2217f7..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLIT.java
+++ /dev/null
@@ -1,93 +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
- *
- *    https://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.EJBQLQuery;
-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.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextEJBQLIT extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    private TableHelper tMtTable1;
-
-    @Before
-    public void setUp() throws Exception {
-        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
-        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", "SERVER_ATTRIBUTE1");
-    }
-
-    private void createTwoRecords() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-        tMtTable1.insert(2, "g2", "s2");
-    }
-
-    @Test
-    public void testEJBQLSelect() throws Exception {
-        createTwoRecords();
-
-        EJBQLQuery query = new EJBQLQuery("SELECT a FROM MtTable1 a");
-        List<ClientMtTable1> results = context.performQuery(query);
-
-        assertEquals(2, results.size());
-    }
-
-    @Test
-    public void testEJBQLSelectScalar() throws Exception {
-        createTwoRecords();
-
-        EJBQLQuery query = new EJBQLQuery("SELECT COUNT(a) FROM MtTable1 a");
-
-        List<Long> results = context.performQuery(query);
-        assertEquals(Long.valueOf(2), results.get(0));
-    }
-
-    @Test
-    public void testEJBQLSelectMixed() throws Exception {
-        createTwoRecords();
-
-        EJBQLQuery query = new EJBQLQuery(
-                "SELECT COUNT(a), a, a.serverAttribute1 FROM MtTable1 a Group By a ORDER BY a.serverAttribute1");
-
-        List<Object[]> results = context.performQuery(query);
-
-        assertEquals(2, results.size());
-        assertEquals(Long.valueOf(1), results.get(0)[0]);
-        assertTrue(results.get(0)[1] instanceof ClientMtTable1);
-        assertEquals("s1", results.get(0)[2]);
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorIT.java
deleted file mode 100644
index 6cf88524f..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorIT.java
+++ /dev/null
@@ -1,103 +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
- *
- *    https://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.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.ClientMtTable2;
-import org.apache.cayenne.unit.di.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.DataChannelSyncStats;
-import org.apache.cayenne.unit.di.UnitTestClosure;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextGraphDiffCompressorIT extends ClientCase {
-
-    @Inject(ClientCase.ROP_CLIENT_KEY)
-    protected DataChannelInterceptor clientServerInterceptor;
-
-    @Inject
-    protected CayenneContext context;
-
-    @Test
-    public void testMultipleSimpleProperties() {
-
-        ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1("v1");
-        o1.setGlobalAttribute1("v2");
-
-        DataChannelSyncStats stats = clientServerInterceptor
-                .runWithSyncStatsCollection(new UnitTestClosure() {
-
-                    public void execute() {
-                        context.commitChanges();
-                    }
-                });
-
-        assertEquals(1, stats.nodePropertiesChanged);
-        assertEquals(1, stats.nodesCreated);
-    }
-
-    @Test
-    public void testComplimentaryArcs() {
-
-        ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
-        ClientMtTable2 o2 = context.newObject(ClientMtTable2.class);
-        o2.setTable1(o1);
-        o2.setTable1(null);
-
-        DataChannelSyncStats stats = clientServerInterceptor
-                .runWithSyncStatsCollection(new UnitTestClosure() {
-
-                    public void execute() {
-                        context.commitChanges();
-                    }
-                });
-
-        assertEquals(0, stats.nodePropertiesChanged);
-        assertEquals(2, stats.nodesCreated);
-        assertEquals(0, stats.arcsCreated);
-        assertEquals(0, stats.arcsDeleted);
-    }
-
-    @Test
-    public void testDelete() {
-
-        ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1("v1");
-        context.deleteObjects(o1);
-
-        DataChannelSyncStats stats = clientServerInterceptor
-                .runWithSyncStatsCollection(new UnitTestClosure() {
-
-                    public void execute() {
-                        context.commitChanges();
-                    }
-                });
-        assertEquals(0, stats.nodePropertiesChanged);
-        assertEquals(0, stats.nodesCreated);
-        assertEquals(0, stats.nodesRemoved);
-    }
-
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextIT.java
deleted file mode 100644
index 7a864f7f3..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextIT.java
+++ /dev/null
@@ -1,342 +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
- *
- *    https://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.event.DefaultEventManager;
-import org.apache.cayenne.event.EventManager;
-import org.apache.cayenne.event.MockEventManager;
-import org.apache.cayenne.graph.CompoundDiff;
-import org.apache.cayenne.graph.GraphDiff;
-import org.apache.cayenne.graph.NodeIdChangeOperation;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.query.Query;
-import org.apache.cayenne.remote.BootstrapMessage;
-import org.apache.cayenne.remote.ClientChannel;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.remote.ClientMessage;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.apache.cayenne.util.GenericResponse;
-import org.junit.After;
-import org.junit.Test;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextIT extends ClientCase {
-
-	@Inject
-	private ObjectContext serverContext;
-
-	private DefaultEventManager eventManager;
-
-	@After
-	public void cleanUp() {
-		if(eventManager != null) {
-			eventManager.shutdown();
-			eventManager = null;
-		}
-	}
-
-	@Test
-	public void testConstructor() {
-
-		CayenneContext context = new CayenneContext();
-
-		// test default property parameters
-		assertNotNull(context.getGraphManager());
-		assertNull(context.channel);
-
-		MockDataChannel channel = new MockDataChannel();
-		context.setChannel(channel);
-		assertSame(channel, context.getChannel());
-	}
-
-	@Test
-	public void testChannel() {
-		MockDataChannel channel = new MockDataChannel();
-		CayenneContext context = new CayenneContext(channel);
-
-		assertSame(channel, context.getChannel());
-	}
-
-	@Test
-	public void testCommitUnchanged() {
-
-		MockDataChannel channel = new MockDataChannel();
-		CayenneContext context = new CayenneContext(channel);
-
-		// no context changes so no connector access is expected
-		context.commitChanges();
-		assertTrue(channel.getRequestObjects().isEmpty());
-	}
-
-	@Test
-	public void testCommitCommandExecuted() {
-
-		MockDataChannel channel = new MockDataChannel(mock(GraphDiff.class));
-		channel.setEntityResolver(serverContext.getEntityResolver().getClientEntityResolver());
-		CayenneContext context = new CayenneContext(channel);
-
-		// test that a command is being sent via connector on commit...
-
-		context.internalGraphManager().nodePropertyChanged(ObjectId.of("MtTable1"), "x", "y", "z");
-
-		context.commitChanges();
-		assertEquals(1, channel.getRequestObjects().size());
-
-		// expect a sync/commit chain
-		Object mainMessage = channel.getRequestObjects().iterator().next();
-		assertTrue(mainMessage instanceof GraphDiff);
-	}
-
-	@Test
-	public void testCommitChangesNew() {
-		final CompoundDiff diff = new CompoundDiff();
-		final Object newObjectId = ObjectId.of("test", "key", "generated");
-		eventManager = new DefaultEventManager(0);
-
-		// test that ids that are passed back are actually propagated to the
-		// right
-		// objects...
-
-		MockDataChannel channel = new MockDataChannel() {
-
-			@Override
-			public GraphDiff onSync(ObjectContext originatingContext, GraphDiff changes, int syncType) {
-
-				return diff;
-			}
-
-			// must provide a channel with working event manager
-			@Override
-			public EventManager getEventManager() {
-				return eventManager;
-			}
-		};
-
-		CayenneContext context = new CayenneContext(channel);
-		ObjEntity entity = new ObjEntity("test_entity");
-		entity.setClassName(MockPersistentObject.class.getName());
-
-		DataMap dataMap = new DataMap("test");
-		dataMap.addObjEntity(entity);
-		Collection<DataMap> entities = Collections.singleton(dataMap);
-		context.setEntityResolver(new EntityResolver(entities));
-		Persistent object = context.newObject(MockPersistentObject.class);
-
-		// record change here to make it available to the anonymous connector
-		// method..
-		diff.add(new NodeIdChangeOperation(object.getObjectId(), newObjectId));
-
-		// check that a generated object ID is assigned back to the object...
-		assertNotSame(newObjectId, object.getObjectId());
-		context.commitChanges();
-		assertSame(newObjectId, object.getObjectId());
-		assertSame(object, context.graphManager.getNode(newObjectId));
-	}
-
-	@Test
-	public void testNewObject() {
-
-		CayenneContext context = new CayenneContext(new MockDataChannel());
-
-		ObjEntity entity = new ObjEntity("test_entity");
-		entity.setClassName(MockPersistentObject.class.getName());
-
-		DataMap dataMap = new DataMap("test");
-		dataMap.addObjEntity(entity);
-		Collection<DataMap> entities = Collections.singleton(dataMap);
-		context.setEntityResolver(new EntityResolver(entities));
-
-		Persistent object = context.newObject(MockPersistentObject.class);
-		assertNotNull(object);
-		assertTrue(object instanceof MockPersistentObject);
-		assertEquals(PersistenceState.NEW, object.getPersistenceState());
-		assertSame(context, object.getObjectContext());
-		assertTrue(context.internalGraphManager().dirtyNodes(PersistenceState.NEW).contains(object));
-		assertNotNull(object.getObjectId());
-		assertTrue(object.getObjectId().isTemporary());
-	}
-
-	@Test
-	public void testDeleteObject() {
-
-		CayenneContext context = new CayenneContext(new MockDataChannel());
-		ObjEntity entity = new ObjEntity("test_entity");
-		entity.setClassName(MockPersistentObject.class.getName());
-
-		DataMap dataMap = new DataMap("test");
-		dataMap.addObjEntity(entity);
-		Collection<DataMap> entities = Collections.singleton(dataMap);
-		context.setEntityResolver(new EntityResolver(entities));
-
-		// TRANSIENT ... should quietly ignore it
-		Persistent transientObject = new MockPersistentObject();
-		context.deleteObjects(transientObject);
-		assertEquals(PersistenceState.TRANSIENT, transientObject.getPersistenceState());
-
-		// NEW ... should make it TRANSIENT
-		// create via context to make sure that object store would register it
-		Persistent newObject = context.newObject(MockPersistentObject.class);
-		assertNotNull(newObject.getObjectContext());
-		context.deleteObjects(newObject);
-		assertNull(newObject.getObjectContext());
-		assertEquals(PersistenceState.TRANSIENT, newObject.getPersistenceState());
-		assertFalse(context.internalGraphManager().dirtyNodes().contains(newObject.getObjectId()));
-
-		// see CAY-547 for details...
-		assertFalse(context.internalGraphManager().dirtyNodes().contains(null));
-
-		// COMMITTED
-		Persistent committed = new MockPersistentObject();
-		committed.setPersistenceState(PersistenceState.COMMITTED);
-		committed.setObjectId(ObjectId.of("test_entity", "key", "value1"));
-		committed.setObjectContext(context);
-		context.deleteObjects(committed);
-		assertEquals(PersistenceState.DELETED, committed.getPersistenceState());
-
-		// MODIFIED
-		Persistent modified = new MockPersistentObject();
-		modified.setPersistenceState(PersistenceState.MODIFIED);
-		modified.setObjectId(ObjectId.of("test_entity", "key", "value2"));
-		modified.setObjectContext(context);
-		context.deleteObjects(modified);
-		assertEquals(PersistenceState.DELETED, modified.getPersistenceState());
-
-		// DELETED
-		Persistent deleted = new MockPersistentObject();
-		deleted.setPersistenceState(PersistenceState.DELETED);
-		deleted.setObjectId(ObjectId.of("test_entity", "key", "value3"));
-		deleted.setObjectContext(context);
-		context.deleteObjects(deleted);
-		assertEquals(PersistenceState.DELETED, committed.getPersistenceState());
-	}
-
-	@Test
-	public void testBeforePropertyReadShouldInflateHollow() {
-
-        ObjectId gid = ObjectId.of("MtTable1", "a", "b");
-		final ClientMtTable1 inflated = new ClientMtTable1();
-		inflated.setPersistenceState(PersistenceState.COMMITTED);
-		inflated.setObjectId(gid);
-		inflated.setGlobalAttribute1("abc");
-
-		ClientConnection connection = mock(ClientConnection.class);
-		when(connection.sendMessage((ClientMessage) any())).thenAnswer(new Answer<Object>() {
-
-			public Object answer(InvocationOnMock invocation) {
-				ClientMessage arg = (ClientMessage) invocation.getArguments()[0];
-
-				if (arg instanceof BootstrapMessage) {
-					return new EntityResolver();
-				} else {
-					return new GenericResponse(Arrays.asList(inflated));
-				}
-			}
-		});
-
-		ClientChannel channel = new ClientChannel(connection, false, new MockEventManager(), false);
-
-		// check that a HOLLOW object is infalted on "beforePropertyRead"
-		ClientMtTable1 hollow = new ClientMtTable1();
-		hollow.setPersistenceState(PersistenceState.HOLLOW);
-		hollow.setObjectId(gid);
-
-		final boolean[] selectExecuted = new boolean[1];
-		CayenneContext context = new CayenneContext(channel) {
-
-			@Override
-			public List<?> performQuery(Query query) {
-				selectExecuted[0] = true;
-				return super.performQuery(query);
-			}
-		};
-
-		context.setEntityResolver(serverContext.getEntityResolver().getClientEntityResolver());
-
-		context.graphManager.registerNode(hollow.getObjectId(), hollow);
-
-		// testing this...
-		context.prepareForAccess(hollow, ClientMtTable1.GLOBAL_ATTRIBUTE1.getName(), false);
-		assertTrue(selectExecuted[0]);
-		assertSame(hollow, context.getGraphManager().getNode(gid));
-		assertEquals(inflated.getGlobalAttribute1Direct(), hollow.getGlobalAttribute1Direct());
-		assertEquals(PersistenceState.COMMITTED, hollow.getPersistenceState());
-	}
-
-	@Test
-	public void testBeforeHollowDeleteShouldChangeStateToCommited() {
-
-        ObjectId gid = ObjectId.of("MtTable1", "a", "b");
-		final ClientMtTable1 inflated = new ClientMtTable1();
-		inflated.setPersistenceState(PersistenceState.COMMITTED);
-		inflated.setObjectId(gid);
-		inflated.setGlobalAttribute1("abc");
-
-		ClientConnection connection = mock(ClientConnection.class);
-		when(connection.sendMessage((ClientMessage) any())).thenAnswer(new Answer<Object>() {
-
-			public Object answer(InvocationOnMock invocation) {
-				ClientMessage arg = (ClientMessage) invocation.getArguments()[0];
-
-				if (arg instanceof BootstrapMessage) {
-					return new EntityResolver();
-				} else {
-					return new GenericResponse(Arrays.asList(inflated));
-				}
-			}
-		});
-		ClientChannel channel = new ClientChannel(connection, false, new MockEventManager(), false);
-
-		CayenneContext context = new CayenneContext(channel);
-		context.setEntityResolver(serverContext.getEntityResolver().getClientEntityResolver());
-		ClientMtTable1 hollow = context.localObject(inflated);
-		assertEquals(PersistenceState.HOLLOW, hollow.getPersistenceState());
-
-		// testing this...
-		context.deleteObjects(hollow);
-		assertSame(hollow, context.getGraphManager().getNode(gid));
-		assertEquals(inflated.getGlobalAttribute1Direct(), hollow.getGlobalAttribute1Direct());
-		assertEquals(PersistenceState.DELETED, hollow.getPersistenceState());
-	}
-
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceIT.java
deleted file mode 100644
index f164a0aba..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceIT.java
+++ /dev/null
@@ -1,146 +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
- *
- *    https://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.ObjectSelect;
-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.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.sql.Types;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextInheritanceIT extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    private TableHelper tMtTable1;
-
-    @Before
-    public void setUp() throws Exception {
-        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);
-    }
-
-    @Test
-    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"));
-    }
-
-    @Test
-    public void testPerformQueryInheritanceLeaf() throws Exception {
-
-        tMtTable1.insert(1, "xxx", "yyy", null);
-        tMtTable1.insert(2, "sub1", "zzz", "sa1");
-        tMtTable1.insert(3, "1111", "aaa", null);
-
-        List<ClientMtTable1Subclass1> objects = ObjectSelect.query(ClientMtTable1Subclass1.class).select(context);
-
-        assertEquals(1, objects.size());
-        assertEquals("sa1", objects.get(0).getSubclass1Attribute1());
-    }
-
-    @Test
-    public void testPerformQueryInheritanceSuper() throws Exception {
-
-        tMtTable1.insert(1, "a", "yyy", null);
-        tMtTable1.insert(2, "sub1", "zzz", "sa1");
-        tMtTable1.insert(3, "z", "aaa", null);
-
-        List<ClientMtTable1> objects = ObjectSelect.query(ClientMtTable1.class).select(context);
-
-        assertEquals(3, objects.size());
-
-        int checkedFields = 0;
-        for (ClientMtTable1 object : objects) {
-            Integer id = (Integer) object.getObjectId().getIdSnapshot().get("TABLE1_ID");
-            if (id == 1) {
-                assertEquals("a", object.getGlobalAttribute1());
-                checkedFields++;
-            } else if (id == 2) {
-                assertEquals("sa1", ((ClientMtTable1Subclass1) object).getSubclass1Attribute1());
-                checkedFields++;
-            }
-
-        }
-        assertEquals(2, checkedFields);
-    }
-
-    @Test
-    public void testPerformQueryWithQualifierInheritanceSuper() throws Exception {
-
-        tMtTable1.insert(1, "a", "XX", null);
-        tMtTable1.insert(2, "sub1", "XXA", "sa1");
-        tMtTable1.insert(3, "z", "MM", null);
-
-        List<ClientMtTable1> objects = ObjectSelect.query(ClientMtTable1.class)
-                .where(ClientMtTable1.SERVER_ATTRIBUTE1.like("X%"))
-                .select(context);
-
-        assertEquals(2, objects.size());
-
-        int checkedFields = 0;
-        for (ClientMtTable1 object : objects) {
-            Integer id = (Integer) object.getObjectId().getIdSnapshot().get("TABLE1_ID");
-            if (id == 1) {
-                assertEquals("a", object.getGlobalAttribute1());
-                checkedFields++;
-            } else if (id == 2) {
-                assertEquals("sa1", ((ClientMtTable1Subclass1) object).getSubclass1Attribute1());
-                checkedFields++;
-            }
-
-        }
-        assertEquals(2, checkedFields);
-    }
-
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipIT.java
deleted file mode 100644
index bd1ffe810..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMapRelationshipIT.java
+++ /dev/null
@@ -1,119 +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
- *
- *    https://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.map_to_many.ClientIdMapToMany;
-import org.apache.cayenne.testdo.map_to_many.ClientIdMapToManyTarget;
-import org.apache.cayenne.testdo.map_to_many.IdMapToMany;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-@UseServerRuntime(CayenneProjects.MAP_TO_MANY_PROJECT)
-public class CayenneContextMapRelationshipIT extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMapToMany;
-    private TableHelper tMapToManyTarget;
-
-    @Before
-    public void setUp() throws Exception {
-        tMapToMany = new TableHelper(dbHelper, "ID_MAP_TO_MANY");
-        tMapToMany.setColumns("ID");
-
-        tMapToManyTarget = new TableHelper(dbHelper, "ID_MAP_TO_MANY_TARGET");
-        tMapToManyTarget.setColumns("ID", "MAP_TO_MANY_ID");
-    }
-
-    private void createTwoMapToManysWithTargetsDataSet() throws Exception {
-        tMapToMany.insert(1).insert(2);
-        tMapToManyTarget.insert(1, 1).insert(2, 1).insert(3, 1).insert(4, 2);
-    }
-
-    @Test
-    public void testReadToMany() throws Exception {
-        createTwoMapToManysWithTargetsDataSet();
-
-        ObjectId id = ObjectId.of("IdMapToMany", IdMapToMany.ID_PK_COLUMN, 1);
-        ClientIdMapToMany o1 = (ClientIdMapToMany) Cayenne.objectForQuery(
-                context,
-                new ObjectIdQuery(id));
-
-        Map<Object, ClientIdMapToManyTarget> targets = o1.getTargets();
-
-        assertTrue(((ValueHolder) targets).isFault());
-
-        assertNotNull(targets);
-        assertEquals(3, targets.size());
-        assertNotNull(targets.get(1));
-        assertNotNull(targets.get(2));
-        assertNotNull(targets.get(3));
-    }
-
-    @Test
-    public void testAddToMany() throws Exception {
-        createTwoMapToManysWithTargetsDataSet();
-
-        ObjectId id = ObjectId.of("IdMapToMany", IdMapToMany.ID_PK_COLUMN, 1);
-        ClientIdMapToMany o1 = (ClientIdMapToMany) Cayenne.objectForQuery(
-                context,
-                new ObjectIdQuery(id));
-
-        Map<Object, ClientIdMapToManyTarget> targets = o1.getTargets();
-        assertNotNull(targets);
-        assertEquals(3, targets.size());
-
-        ClientIdMapToManyTarget newTarget = o1.getObjectContext().newObject(
-                ClientIdMapToManyTarget.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(newId));
-
-        assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-        assertEquals(PersistenceState.COMMITTED, newTarget.getPersistenceState());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMeaningfulPKIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMeaningfulPKIT.java
deleted file mode 100644
index 40b236dbf..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMeaningfulPKIT.java
+++ /dev/null
@@ -1,71 +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
- *
- *    https://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.ObjectSelect;
-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.meaningful_pk.ClientMeaningfulPk;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-@UseServerRuntime(CayenneProjects.MEANINGFUL_PK_PROJECT)
-public class CayenneContextMeaningfulPKIT extends ClientCase {
-
-    @Inject
-    private CayenneContext clientContext;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMeaningfulPK;
-
-    @Before
-    public void setUp() throws Exception {
-        tMeaningfulPK = new TableHelper(dbHelper, "MEANINGFUL_PK");
-        tMeaningfulPK.setColumns("PK");
-    }
-
-    private void deleteAndCreateTwoMeaningfulPKsDataSet() throws Exception {
-        tMeaningfulPK.deleteAll();
-        tMeaningfulPK.insert("A");
-        tMeaningfulPK.insert("B");
-    }
-
-    @Test
-    public void testMeaningfulPK() throws Exception {
-        deleteAndCreateTwoMeaningfulPKsDataSet();
-
-        List<?> results = ObjectSelect.query(ClientMeaningfulPk.class)
-                .orderBy(ClientMeaningfulPk.PK.desc())
-                .select(clientContext);
-        assertEquals(2, results.size());
-    }
-
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerIT.java
deleted file mode 100644
index 4606df475..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextMergeHandlerIT.java
+++ /dev/null
@@ -1,98 +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
- *
- *    https://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.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextMergeHandlerIT extends ClientCase {
-
-    @Inject
-    protected CayenneContext context;
-
-    @Test
-    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));
-    }
-
-    @Test
-    public void testNodePropertyChanged() {
-
-        ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
-
-        CayenneContextMergeHandler handler = new CayenneContextMergeHandler(context);
-
-        assertNull(o1.getGlobalAttribute1Direct());
-
-        handler.nodePropertyChanged(o1.getObjectId(), ClientMtTable1.GLOBAL_ATTRIBUTE1.getName(), null, "abc");
-        assertEquals("abc", o1.getGlobalAttribute1Direct());
-
-        handler.nodePropertyChanged(o1.getObjectId(), ClientMtTable1.GLOBAL_ATTRIBUTE1.getName(), "abc", "xyz");
-
-        assertEquals("xyz", o1.getGlobalAttribute1Direct());
-
-        // block if old value is different
-        handler.nodePropertyChanged(o1.getObjectId(), ClientMtTable1.GLOBAL_ATTRIBUTE1.getName(), "123", "mnk");
-
-        assertEquals("xyz", o1.getGlobalAttribute1Direct());
-
-        handler.nodePropertyChanged(o1.getObjectId(), ClientMtTable1.GLOBAL_ATTRIBUTE1.getName(), "xyz", null);
-
-        assertNull(o1.getGlobalAttribute1Direct());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingIT.java
deleted file mode 100644
index c0d39f879..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextNamedQueryCachingIT.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
- *
- *    https://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.MappedSelect;
-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.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-
-@UseServerRuntime(CayenneProjects.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;
-
-    @Before
-    public void setUp() throws Exception {
-        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");
-    }
-
-    @Test
-    public void testLocalCache() throws Exception {
-        createThreeMtTable1sDataSet();
-
-        final MappedSelect q1 = MappedSelect.query("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.forceNoCache();
-        List<?> result3 = context.performQuery(q1);
-        assertNotSame(result1, result3);
-        assertEquals(3, result3.size());
-    }
-
-    @Test
-    public void testLocalCacheParameterized() throws Exception {
-        createThreeMtTable1sDataSet();
-
-        final MappedSelect q1 = MappedSelect.query("ParameterizedMtQueryWithLocalCache").param("g", "g1");
-        final MappedSelect q2 = MappedSelect.query("ParameterizedMtQueryWithLocalCache").param("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);
-            }
-        });
-    
-    }
-
-    @Test
-    public void testParameterizedMappedToEJBQLQueries() throws Exception {
-        
-        createThreeMtTable1sDataSet();
-
-        List<?> r1 = context.performQuery(MappedSelect.query("ParameterizedEJBQLMtQuery").param("g", "g1"));
-        assertEquals(1, r1.size());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingIT.java
deleted file mode 100644
index d63ac95be..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPaginatedListCachingIT.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
- *
- *    https://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.ObjectSelect;
-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.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextPaginatedListCachingIT extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    private TableHelper tMtTable1;
-
-    @Before
-    public void setUp() throws Exception {
-        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
-        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", "SERVER_ATTRIBUTE1");
-    }
-
-    private void createSevenMtTable1sDataSet() throws Exception {
-        for (int i = 1; i <= 7; i++) {
-            tMtTable1.insert(i, "g" + i, "s" + i);
-        }
-    }
-
-    @Test
-    public void testLocalCache() throws Exception {
-        createSevenMtTable1sDataSet();
-
-        List<ClientMtTable1> result1 = ObjectSelect.query(ClientMtTable1.class)
-                .orderBy(ClientMtTable1.GLOBAL_ATTRIBUTE1.asc())
-                .pageSize(3)
-                .localCache()
-                .select(context);
-        assertEquals(7, result1.size());
-
-        // ensure we can resolve all objects without a failure...
-        for (ClientMtTable1 x : result1) {
-            x.getGlobalAttribute1();
-        }
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
deleted file mode 100644
index efb0e2441..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextPrimitiveIT.java
+++ /dev/null
@@ -1,134 +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
- *
- *    https://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.ObjectSelect;
-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.table_primitives.ClientTablePrimitives;
-import org.apache.cayenne.testdo.table_primitives.TablePrimitives;
-import org.apache.cayenne.unit.UnitDbAdapter;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.sql.Types;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-@UseServerRuntime(CayenneProjects.TABLE_PRIMITIVES_PROJECT)
-public class CayenneContextPrimitiveIT extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-    
-    @Inject
-    private UnitDbAdapter accessStackAdapter;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tTablePrimitives;
-
-    @Before
-    public void setUp() throws Exception {
-        int bool = accessStackAdapter.supportsBoolean() ? Types.BOOLEAN : Types.INTEGER;
-        
-        tTablePrimitives = new TableHelper(dbHelper, "TABLE_PRIMITIVES");
-        tTablePrimitives.setColumns("ID", "BOOLEAN_COLUMN", "INT_COLUMN").setColumnTypes(
-                Types.INTEGER,
-                bool,
-                Types.INTEGER);
-    }
-
-    private void createTwoPrimitivesDataSet() throws Exception {
-        tTablePrimitives.insert(1, accessStackAdapter.supportsBoolean() ? true : 1, 0);
-        tTablePrimitives.insert(2, accessStackAdapter.supportsBoolean() ? false : 0, 5);
-    }
-
-    @Test
-    public void testSelectPrimitives() throws Exception {
-        createTwoPrimitivesDataSet();
-
-        List<ClientTablePrimitives> results = ObjectSelect.query(ClientTablePrimitives.class)
-                .orderBy("db:" + TablePrimitives.ID_PK_COLUMN, SortOrder.ASCENDING)
-                .select(context);
-        assertTrue(results.get(0).isBooleanColumn());
-        assertFalse(results.get(1).isBooleanColumn());
-
-        assertEquals(0, results.get(0).getIntColumn());
-        assertEquals(5, results.get(1).getIntColumn());
-    }
-
-    @Test
-    public void testCommitChangesPrimitives() throws Exception {
-
-        ClientTablePrimitives object = context.newObject(ClientTablePrimitives.class);
-
-        object.setBooleanColumn(true);
-        object.setIntColumn(3);
-
-        context.commitChanges();
-
-        assertTrue(tTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
-        assertEquals(3, tTablePrimitives.getInt("INT_COLUMN"));
-
-        object.setBooleanColumn(false);
-        object.setIntColumn(8);
-        context.commitChanges();
-
-        assertFalse(tTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
-        assertEquals(8, tTablePrimitives.getInt("INT_COLUMN"));
-    }
-
-    @Test
-    public void testCommitEmptyChangesPrimitives() throws Exception {
-
-        ClientTablePrimitives object = context.newObject(ClientTablePrimitives.class);
-
-        context.commitChanges();
-
-        assertFalse(tTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
-        assertEquals(0, tTablePrimitives.getInt("INT_COLUMN"));
-
-        object.setBooleanColumn(true);
-        object.setIntColumn(8);
-        context.commitChanges();
-
-        assertTrue(tTablePrimitives.getBoolean("BOOLEAN_COLUMN"));
-        assertEquals(8, tTablePrimitives.getInt("INT_COLUMN"));
-    }
-
-    @Test
-    public void testSelectEmptyPrimitives() throws Exception {
-        tTablePrimitives.insert(1, accessStackAdapter.supportsBoolean() ? true : 1, null);
-
-        ClientTablePrimitives object = ObjectSelect.query(ClientTablePrimitives.class).selectFirst(context);
-
-        assertTrue(object.isBooleanColumn());
-        assertEquals(0, object.getIntColumn());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextReflexiveIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextReflexiveIT.java
deleted file mode 100644
index 29ab9e02f..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextReflexiveIT.java
+++ /dev/null
@@ -1,94 +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
- *
- *    https://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.reflect.LifecycleCallbackRegistry;
-import org.apache.cayenne.testdo.reflexive.ClientReflexive;
-import org.apache.cayenne.testdo.reflexive.Reflexive;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-@UseServerRuntime(CayenneProjects.REFLEXIVE_PROJECT)
-public class CayenneContextReflexiveIT extends ClientCase {
-
-    @Inject
-    private CayenneContext clientContext;
-
-    @Inject
-    private ClientServerChannel clientServerChannel;
-
-    @Test
-    public void testCAY830() throws Exception {
-
-        // an exception was triggered within POST_LOAD callback
-        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        try {
-            callbackRegistry.addListener(Reflexive.class, new LifecycleListener() {
-
-                public void postLoad(Object entity) {
-                }
-
-                public void postPersist(Object entity) {
-                }
-
-                public void postRemove(Object entity) {
-                }
-
-                public void postUpdate(Object entity) {
-                }
-
-                public void postAdd(Object entity) {
-                }
-
-                public void preRemove(Object entity) {
-                }
-
-                public void preUpdate(Object entity) {
-                }
-
-                public void prePersist(Object entity) {
-                }
-            });
-
-            ClientReflexive o1 = clientContext.newObject(ClientReflexive.class);
-            o1.setName("parent");
-
-            ClientReflexive o2 = clientContext.newObject(ClientReflexive.class);
-            o2.setName("child");
-            o2.setToParent(o1);
-            clientContext.commitChanges();
-
-            clientContext.deleteObjects(o1);
-            clientContext.deleteObjects(o2);
-            clientContext.commitChanges();
-            // per CAY-830 an exception is thrown here
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryIT.java
deleted file mode 100644
index a37860be2..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRefreshQueryIT.java
+++ /dev/null
@@ -1,79 +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
- *
- *    https://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.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextRefreshQueryIT extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    private TableHelper tMtTable1;
-    private TableHelper tMtTable2;
-
-    @Before
-    public void setUp() throws Exception {
-        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();
-    }
-
-    @Test
-    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());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsIT.java
deleted file mode 100644
index 46ceafaf7..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextRelationshipsIT.java
+++ /dev/null
@@ -1,102 +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
- *
- *    https://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.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-
-@UseServerRuntime(CayenneProjects.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;
-
-    @Before
-    public void setUp() throws Exception {
-        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");
-    }
-
-    @Test
-    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());
-    }
-
-    @Test
-    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());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateIT.java
deleted file mode 100644
index 8cc7c8483..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextSQLTemplateIT.java
+++ /dev/null
@@ -1,50 +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
- *
- *    https://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.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextSQLTemplateIT extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-
-    @Test
-    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));
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsIT.java
deleted file mode 100644
index 2257c4cfc..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextServerDiffsIT.java
+++ /dev/null
@@ -1,163 +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
- *
- *    https://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.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextServerDiffsIT extends ClientCase {
-
-    @Inject
-    private ClientServerChannel clientServerChannel;
-
-    @Inject
-    private CayenneContext context;
-
-    @Test
-    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();
-        }
-    }
-
-    @Test
-    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();
-        }
-    }
-
-    @Test
-    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();
-        }
-    }
-
-    @Test
-    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();
-        }
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationIT.java
deleted file mode 100644
index d2442fbdf..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationIT.java
+++ /dev/null
@@ -1,86 +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
- *
- *    https://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.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.ClientMtTable2;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.apache.cayenne.validation.ValidationException;
-import org.junit.Test;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextValidationIT extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-
-    @Test
-    public void testValidate() throws Exception {
-
-        ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1("G1");
-        o1.resetValidation(false);
-
-        // this one is not validating
-        ClientMtTable2 o2 = context.newObject(ClientMtTable2.class);
-        o2.setTable1(o1);
-
-        context.commitChanges();
-        assertTrue(o1.isValidatedForInsert());
-        assertFalse(o1.isValidatedForDelete());
-        assertFalse(o1.isValidatedForUpdate());
-
-        o1.resetValidation(false);
-        o1.setGlobalAttribute1("G2");
-
-        context.commitChanges();
-        assertFalse(o1.isValidatedForInsert());
-        assertFalse(o1.isValidatedForDelete());
-        assertTrue(o1.isValidatedForUpdate());
-
-        o1.resetValidation(false);
-        context.deleteObjects(o1);
-        context.deleteObjects(o2);
-
-        context.commitChanges();
-        assertFalse(o1.isValidatedForInsert());
-        assertTrue(o1.isValidatedForDelete());
-        assertFalse(o1.isValidatedForUpdate());
-
-        ClientMtTable1 o11 = context.newObject(ClientMtTable1.class);
-        o11.setGlobalAttribute1("G1");
-        o11.resetValidation(true);
-
-        try {
-            context.commitChanges();
-            fail("Validation failure must have prevented commit");
-        }
-        catch (ValidationException e) {
-            // expected
-        }
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextIT.java
deleted file mode 100644
index 6ffb5b27d..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextIT.java
+++ /dev/null
@@ -1,465 +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
- *
- *    https://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.access.ClientServerChannel;
-import org.apache.cayenne.access.DataContext;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.map.LifecycleEvent;
-import org.apache.cayenne.query.ObjectIdQuery;
-import org.apache.cayenne.query.ObjectSelect;
-import org.apache.cayenne.reflect.LifecycleCallbackRegistry;
-import org.apache.cayenne.remote.RemoteIncrementalFaultList;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.test.parallel.ParallelTestContainer;
-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.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class CayenneContextWithDataContextIT extends ClientCase {
-
-    @Inject
-    private CayenneContext clientContext;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject(ClientCase.ROP_CLIENT_KEY)
-    private DataChannelInterceptor clientServerInterceptor;
-
-    @Inject
-    private ClientServerChannel clientServerChannel;
-
-    private TableHelper tMtTable1;
-    private TableHelper tMtTable2;
-
-    @Before
-    public void setUp() throws Exception {
-        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").setColumnTypes(
-                Types.INTEGER, Types.INTEGER, Types.VARCHAR);
-    }
-
-    private void createTwoMtTable1sAnd2sDataSet() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-        tMtTable1.insert(2, "g2", "s2");
-
-        tMtTable2.insert(1, 1, "g1");
-        tMtTable2.insert(2, 1, "g2");
-    }
-
-    private void createEightMtTable1s() throws Exception {
-        for (int i = 1; i <= 8; i++) {
-            tMtTable1.insert(i, "g" + i, "s" + i);
-        }
-    }
-
-    @Test
-    public void testLocalCacheStaysLocal() {
-        ObjectSelect<ClientMtTable1> query = ObjectSelect.query(ClientMtTable1.class).localCache();
-        List<?> results = query.select(clientContext);
-
-        assertSame(results, clientContext.getQueryCache().get(query.getMetaData(clientContext.getEntityResolver())));
-    }
-
-    @Test
-    public void testAddToList() {
-
-        ClientMtTable1 t1 = clientContext.newObject(ClientMtTable1.class);
-        ClientMtTable2 t2 = clientContext.newObject(ClientMtTable2.class);
-
-        t1.addToTable2Array(t2);
-        assertEquals(1, t1.getTable2Array().size());
-        assertSame(t1, t2.getTable1());
-
-        // do it again to make sure action can handle series of changes
-        ClientMtTable1 t3 = clientContext.newObject(ClientMtTable1.class);
-        ClientMtTable2 t4 = clientContext.newObject(ClientMtTable2.class);
-
-        t3.addToTable2Array(t4);
-        assertEquals(1, t3.getTable2Array().size());
-        assertSame(t3, t4.getTable1());
-    }
-
-    @Test
-    public void testSetValueHolder() {
-
-        ClientMtTable1 t1 = clientContext.newObject(ClientMtTable1.class);
-        ClientMtTable2 t2 = clientContext.newObject(ClientMtTable2.class);
-
-        t2.setTable1(t1);
-        assertEquals(1, t1.getTable2Array().size());
-        assertSame(t1, t2.getTable1());
-    }
-
-    @Test
-    public void testPostAddCallback() {
-
-        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        final boolean[] flag = new boolean[1];
-
-        try {
-            callbackRegistry.addListener(MtTable1.class, new LifecycleListener() {
-
-                public void postLoad(Object entity) {
-                }
-
-                public void postPersist(Object entity) {
-                }
-
-                public void postRemove(Object entity) {
-                }
-
-                public void postUpdate(Object entity) {
-                }
-
-                public void postAdd(Object entity) {
-                    flag[0] = true;
-                }
-
-                public void preRemove(Object entity) {
-                }
-
-                public void preUpdate(Object entity) {
-                }
-
-                public void prePersist(Object entity) {
-                }
-            });
-
-            clientContext.newObject(ClientMtTable1.class);
-
-            assertFalse(flag[0]);
-            clientContext.commitChanges();
-            assertTrue(flag[0]);
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-
-    @Test
-    public void testPostAddOnObjectCallback() throws Exception {
-
-        final DataContext serverContext = (DataContext) clientServerChannel.getParentChannel();
-
-        LifecycleCallbackRegistry callbackRegistry = serverContext
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        try {
-            callbackRegistry.addCallback(
-                    LifecycleEvent.POST_ADD,
-                    MtTable1.class,
-                    "prePersistMethod");
-
-            final Persistent clientObject = clientContext.newObject(ClientMtTable1.class);
-            clientContext.commitChanges();
-
-        new ParallelTestContainer() {
-
-            @Override
-            protected void assertResult() {
-            	// find peer
-            	MtTable1 peer = (MtTable1) serverContext.getGraphManager().getNode(clientObject.getObjectId());
-            	assertNotNull(peer);
-            	assertTrue(peer.isPrePersisted());
-            }
-        }.runTest(1000);
-
-
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-
-    @Test
-    public void testPreRemoveCallback() {
-
-        // an exception was triggered within POST_LOAD callback
-        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        final boolean[] flag = new boolean[1];
-
-        try {
-            callbackRegistry.addListener(MtTable1.class, new LifecycleListener() {
-
-                public void postLoad(Object entity) {
-                }
-
-                public void postPersist(Object entity) {
-                }
-
-                public void postRemove(Object entity) {
-                }
-
-                public void postUpdate(Object entity) {
-                }
-
-                public void postAdd(Object entity) {
-                }
-
-                public void preRemove(Object entity) {
-                    flag[0] = true;
-                }
-
-                public void preUpdate(Object entity) {
-                }
-
-                public void prePersist(Object entity) {
-                }
-            });
-
-            ClientMtTable1 object = clientContext.newObject(ClientMtTable1.class);
-
-            assertFalse(flag[0]);
-            clientContext.commitChanges();
-            assertFalse(flag[0]);
-
-            clientContext.deleteObjects(object);
-            clientContext.commitChanges();
-            assertTrue(flag[0]);
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-
-    @Test
-    public void testRollbackChanges() {
-
-        ClientMtTable1 o = clientContext.newObject(ClientMtTable1.class);
-        o.setGlobalAttribute1("1");
-        clientContext.commitChanges();
-
-        assertEquals("1", o.getGlobalAttribute1());
-        o.setGlobalAttribute1("2");
-        assertEquals("2", o.getGlobalAttribute1());
-        clientContext.rollbackChanges();
-
-        assertEquals("1", o.getGlobalAttribute1());
-        assertTrue(clientContext.modifiedObjects().isEmpty());
-    }
-
-    @Test
-    public void testCreateFault() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-
-        ObjectId id = ObjectId.of("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 1);
-
-        Object fault = clientContext.createFault(id);
-        assertTrue(fault instanceof ClientMtTable1);
-
-        ClientMtTable1 o = (ClientMtTable1) fault;
-        assertEquals(PersistenceState.HOLLOW, o.getPersistenceState());
-        assertSame(clientContext, o.getObjectContext());
-        assertNull(o.getGlobalAttribute1Direct());
-
-        // make sure we haven't tripped the fault yet
-        assertEquals(PersistenceState.HOLLOW, o.getPersistenceState());
-
-        // try tripping fault
-        assertEquals("g1", o.getGlobalAttribute1());
-        assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-    }
-
-    @Test
-    public void testCreateBadFault() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-
-        ObjectId id = ObjectId.of("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 2);
-
-        Object fault = clientContext.createFault(id);
-        assertTrue(fault instanceof ClientMtTable1);
-
-        ClientMtTable1 o = (ClientMtTable1) fault;
-
-        // try tripping fault
-        try {
-            o.getGlobalAttribute1();
-            fail("resolving bad fault should've thrown");
-        }
-        catch (FaultFailureException e) {
-            // expected
-        }
-    }
-
-    @Test
-    public void testPrefetchingToOne() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        final ObjectId prefetchedId = ObjectId.of(
-                "MtTable1",
-                MtTable1.TABLE1_ID_PK_COLUMN,
-                1);
-
-        ObjectSelect<ClientMtTable2> q = ObjectSelect.query(ClientMtTable2.class)
-                .orderBy(ClientMtTable2.GLOBAL_ATTRIBUTE.asc())
-                .prefetch(ClientMtTable2.TABLE1.disjoint());
-
-        final List<ClientMtTable2> results = q.select(clientContext);
-
-        clientServerInterceptor.runWithQueriesBlocked(() -> {
-            assertEquals(2, results.size());
-
-            for (ClientMtTable2 o : results) {
-                assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-                assertSame(clientContext, o.getObjectContext());
-
-                ClientMtTable1 o1 = o.getTable1();
-                assertNotNull(o1);
-                assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-                assertSame(clientContext, o1.getObjectContext());
-                assertEquals(prefetchedId, o1.getObjectId());
-            }
-        });
-    }
-
-    @Test
-    public void testPrefetchingToOneNull() throws Exception {
-        tMtTable2.insert(15, null, "g3");
-
-        ObjectSelect<ClientMtTable2> q = ObjectSelect.query(ClientMtTable2.class)
-                .prefetch(ClientMtTable2.TABLE1.disjoint());
-
-        final List<ClientMtTable2> results = q.select(clientContext);
-
-        clientServerInterceptor.runWithQueriesBlocked(() -> {
-            assertEquals(1, results.size());
-
-            ClientMtTable2 o = results.get(0);
-            assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-            assertSame(clientContext, o.getObjectContext());
-
-            assertNull(o.getTable1());
-        });
-    }
-
-    @Test
-    public void testPrefetchingToMany() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectSelect<ClientMtTable1> q = ObjectSelect.query(ClientMtTable1.class)
-                .orderBy(ClientMtTable1.GLOBAL_ATTRIBUTE1.asc())
-                .prefetch(ClientMtTable1.TABLE2ARRAY.joint());
-
-        final List<ClientMtTable1> results = q.select(clientContext);
-
-        clientServerInterceptor.runWithQueriesBlocked(() -> {
-
-            ClientMtTable1 o1 = results.get(0);
-            assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-            assertSame(clientContext, o1.getObjectContext());
-
-            List<ClientMtTable2> children1 = o1.getTable2Array();
-
-            assertEquals(2, children1.size());
-            for (ClientMtTable2 o : children1) {
-                assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-                assertSame(clientContext, o.getObjectContext());
-
-                // TODO: fixme... reverse relationship is not connected and will
-                // cause a fetch
-                // assertEquals(o1, o.getTable1());
-            }
-        });
-    }
-
-    @Test
-    public void testPerformPaginatedQuery() throws Exception {
-        createEightMtTable1s();
-
-        ObjectSelect<ClientMtTable1> query = ObjectSelect.query(ClientMtTable1.class)
-                .pageSize(5);
-        List<ClientMtTable1> objects = query.select(clientContext);
-        assertNotNull(objects);
-        assertTrue(objects instanceof RemoteIncrementalFaultList);
-    }
-
-    @Test
-    public void testPrefetchingToManyEmpty() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-        
-        ObjectSelect<ClientMtTable1> q = ObjectSelect.query(ClientMtTable1.class)
-                .orderBy(ClientMtTable1.GLOBAL_ATTRIBUTE1.asc())
-                .prefetch(ClientMtTable1.TABLE2ARRAY.joint());
-
-        final List<ClientMtTable1> results = q.select(clientContext);
-
-        clientServerInterceptor.runWithQueriesBlocked(() -> {
-            ClientMtTable1 o2 = results.get(1);
-            assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState());
-            assertSame(clientContext, o2.getObjectContext());
-
-            List<ClientMtTable2> children2 = o2.getTable2Array();
-            assertFalse(((ValueHolder) children2).isFault());
-            assertEquals(0, children2.size());
-        });
-    }
-
-    @Test
-    public void testOIDQueryInterception() {
-
-        final ClientMtTable1 o = clientContext.newObject(ClientMtTable1.class);
-        o.setGlobalAttribute1("aaa");
-
-        // fetch new
-        final ObjectIdQuery q1 = new ObjectIdQuery(o.getObjectId(), false, ObjectIdQuery.CACHE);
-
-        clientServerInterceptor.runWithQueriesBlocked(() -> {
-            List<?> objects = clientContext.performQuery(q1);
-            assertEquals(1, objects.size());
-            assertSame(o, objects.get(0));
-        });
-
-        clientContext.commitChanges();
-
-        // fetch committed
-        final ObjectIdQuery q2 = new ObjectIdQuery(o.getObjectId(), false, ObjectIdQuery.CACHE);
-
-        clientServerInterceptor.runWithQueriesBlocked(() -> {
-            List<?> objects = clientContext.performQuery(q2);
-            assertEquals(1, objects.size());
-            assertSame(o, objects.get(0));
-        });
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/DataRowTest.java b/cayenne-client/src/test/java/org/apache/cayenne/DataRowTest.java
deleted file mode 100644
index 188714253..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/DataRowTest.java
+++ /dev/null
@@ -1,51 +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
- *
- *    https://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.map.EntityResolver;
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-
-public class DataRowTest {
-
-    @Test
-    public void testHessianSerializability() throws Exception {
-        DataRow s1 = new DataRow(10);
-        s1.put("a", "b");
-
-        DataRow s2 = (DataRow) HessianUtil.cloneViaServerClientSerialization(s1, new EntityResolver());
-
-        assertNotSame(s1, s2);
-        assertEquals(s1, s2);
-        assertEquals(s1.getVersion(), s2.getVersion());
-        assertEquals(s1.getReplacesVersion(), s2.getReplacesVersion());
-
-        // at the moment there are no serializers that can go from client to
-        // server.
-        // DataRow s3 = (DataRow) HessianUtil.cloneViaClientServerSerialization(
-        // s1,
-        // new EntityResolver());
-        //
-        // assertNotSame(s1, s3);
-        // assertEquals(s1, s3);
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextIT.java b/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextIT.java
deleted file mode 100644
index e746e93b9..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextIT.java
+++ /dev/null
@@ -1,680 +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
- *
- *    https://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.configuration.rop.client.ClientRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.graph.ArcId;
-import org.apache.cayenne.graph.GraphChangeHandler;
-import org.apache.cayenne.graph.GraphDiff;
-import org.apache.cayenne.query.ObjectSelect;
-import org.apache.cayenne.query.SelectById;
-import org.apache.cayenne.query.SortOrder;
-import org.apache.cayenne.remote.RemoteCayenneCase;
-import org.apache.cayenne.remote.service.LocalConnection;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.ClientMtTable2;
-import org.apache.cayenne.unit.di.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-/**
- * Tests nested object contexts
- */
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-@RunWith(value = Parameterized.class)
-public class NestedCayenneContextIT extends RemoteCayenneCase {
-
-	@Inject
-	private ClientRuntime runtime;
-
-	@Inject
-	private DataChannelInterceptor queryInterceptor;
-
-	@Parameters
-	public static Collection<Object[]> data() {
-		return Arrays.asList(new Object[][] {
-				{ LocalConnection.HESSIAN_SERIALIZATION },
-				{ LocalConnection.JAVA_SERIALIZATION },
-				{ LocalConnection.NO_SERIALIZATION }, });
-	}
-
-	public NestedCayenneContextIT(int serializationPolicy) {
-		super.serializationPolicy = serializationPolicy;
-	}
-
-	@Test
-	public void testChannels() {
-		ObjectContext child = runtime.newContext(clientContext);
-
-		assertNotNull(child);
-		assertSame(clientContext, child.getChannel());
-
-		// second level of nesting
-		ObjectContext grandchild = runtime.newContext(child);
-
-		assertNotNull(grandchild);
-		assertSame(child, grandchild.getChannel());
-	}
-
-	@Test
-	public void testSelect() {
-		ObjectContext child = runtime.newContext(clientContext);
-
-		ClientMtTable1 committed = clientContext.newObject(ClientMtTable1.class);
-		ClientMtTable1 deleted = clientContext.newObject(ClientMtTable1.class);
-		ClientMtTable1 modified = clientContext.newObject(ClientMtTable1.class);
-
-		clientContext.commitChanges();
-		int modifiedid = Cayenne.intPKForObject(modified);
-
-		// test how different object states appear in the child on select
-
-		clientContext.deleteObjects(deleted);
-		modified.setGlobalAttribute1("a");
-
-		ClientMtTable1 _new = clientContext.newObject(ClientMtTable1.class);
-
-		assertEquals(PersistenceState.COMMITTED, committed.getPersistenceState());
-		assertEquals(PersistenceState.MODIFIED, modified.getPersistenceState());
-		assertEquals(PersistenceState.DELETED, deleted.getPersistenceState());
-		assertEquals(PersistenceState.NEW, _new.getPersistenceState());
-
-		List<ClientMtTable1> objects = ObjectSelect.query(ClientMtTable1.class).select(child);
-		assertEquals("All but NEW object must have been included", 3, objects.size());
-
-		for (ClientMtTable1 next : objects) {
-			assertEquals(PersistenceState.COMMITTED, next.getPersistenceState());
-
-			int id = Cayenne.intPKForObject(next);
-			if (id == modifiedid) {
-				assertEquals("a", next.getGlobalAttribute1());
-			}
-		}
-	}
-
-	@Test
-	public void testPrefetchingToOne() {
-		final ClientMtTable1 mt11 = clientContext.newObject(ClientMtTable1.class);
-		clientContext.newObject(ClientMtTable1.class);
-		ClientMtTable2 mt21 = clientContext.newObject(ClientMtTable2.class);
-		ClientMtTable2 mt22 = clientContext.newObject(ClientMtTable2.class);
-
-		mt21.setTable1(mt11);
-		mt22.setTable1(mt11);
-
-		clientContext.commitChanges();
-
-		final ObjectContext child = runtime.newContext(clientContext);
-
-		final List<ClientMtTable2> results = ObjectSelect.query(ClientMtTable2.class)
-				.prefetch(ClientMtTable2.TABLE1.joint())
-				.select(child);
-
-		queryInterceptor.runWithQueriesBlocked(() -> {
-			assertEquals(2, results.size());
-			for (ClientMtTable2 o : results) {
-				assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-				assertSame(child, o.getObjectContext());
-
-				ClientMtTable1 o1 = o.getTable1();
-				assertNotNull(o1);
-				assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-				assertSame(child, o1.getObjectContext());
-				assertEquals(mt11.getObjectId(), o1.getObjectId());
-			}
-		});
-	}
-
-	@Test
-	public void testPrefetchingToMany() {
-		ClientMtTable1 mt11 = clientContext.newObject(ClientMtTable1.class);
-		mt11.setGlobalAttribute1("1");
-
-		ClientMtTable1 mt12 = clientContext.newObject(ClientMtTable1.class);
-		mt12.setGlobalAttribute1("2");
-
-		ClientMtTable2 mt21 = clientContext.newObject(ClientMtTable2.class);
-		ClientMtTable2 mt22 = clientContext.newObject(ClientMtTable2.class);
-
-		mt21.setTable1(mt11);
-		mt22.setTable1(mt11);
-
-		clientContext.commitChanges();
-
-		final ObjectContext child = runtime.newContext(clientContext);
-
-		final List<ClientMtTable1> results = ObjectSelect.query(ClientMtTable1.class)
-				.prefetch(ClientMtTable1.TABLE2ARRAY.joint())
-				.orderBy(ClientMtTable1.GLOBAL_ATTRIBUTE1.asc())
-				.select(child);
-
-		queryInterceptor.runWithQueriesBlocked(() -> {
-			ClientMtTable1 o1 = results.get(0);
-			assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-			assertSame(child, o1.getObjectContext());
-
-			List<ClientMtTable2> children1 = o1.getTable2Array();
-
-			assertEquals(2, children1.size());
-			for (ClientMtTable2 o : children1) {
-				assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-				assertSame(child, o.getObjectContext());
-				assertEquals(o1, o.getTable1());
-			}
-
-			ClientMtTable1 o2 = results.get(1);
-			assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState());
-			assertSame(child, o2.getObjectContext());
-
-			List<?> children2 = o2.getTable2Array();
-
-			assertEquals(0, children2.size());
-		});
-	}
-
-	@Test
-	public void testDeleteNew() {
-		ObjectContext child = runtime.newContext(clientContext);
-
-		ClientMtTable1 a = clientContext.newObject(ClientMtTable1.class);
-		clientContext.commitChanges();
-
-		ClientMtTable2 p = child.newObject(ClientMtTable2.class);
-		ClientMtTable1 aChild = (ClientMtTable1) Cayenne.objectForPK(child, a.getObjectId());
-		p.setGlobalAttribute("X");
-		aChild.addToTable2Array(p);
-
-		child.commitChangesToParent();
-
-		child.deleteObjects(p);
-		aChild.removeFromTable2Array(p);
-
-		child.commitChangesToParent();
-	}
-
-	/**
-	 * A test case for CAY-698 bug.
-	 */
-	@Test
-	public void testNullifyToOne() {
-		ClientMtTable1 a = clientContext.newObject(ClientMtTable1.class);
-		ClientMtTable2 b = clientContext.newObject(ClientMtTable2.class);
-		a.addToTable2Array(b);
-
-		clientContext.commitChanges();
-
-		ObjectContext child = runtime.newContext(clientContext);
-		ObjectContext childPeer = runtime.newContext(clientContext);
-
-		ClientMtTable2 childP1 = SelectById.query(ClientMtTable2.class, b.getObjectId()).selectOne(child);
-
-		// trigger object creation in the peer nested DC
-		Cayenne.objectForPK(childPeer, b.getObjectId());
-		childP1.setTable1(null);
-
-		queryInterceptor.runWithQueriesBlocked(() -> {
-			child.commitChangesToParent();
-			assertEquals(PersistenceState.COMMITTED, childP1.getPersistenceState());
-
-			ClientMtTable2 parentP1 = (ClientMtTable2) clientContext.getGraphManager().getNode(childP1.getObjectId());
-
-			assertNotNull(parentP1);
-			assertEquals(PersistenceState.MODIFIED, parentP1.getPersistenceState());
-			assertNull(parentP1.getTable1());
-
-			// check that arc changes got recorded in the parent context
-			GraphDiff diffs = clientContext.internalGraphManager().getDiffs();
-			final int[] arcDiffs = new int[1];
-
-			diffs.apply(new GraphChangeHandler() {
-				@Override
-				public void arcCreated(Object nodeId, Object targetNodeId, ArcId arcId) {
-					arcDiffs[0]++;
-				}
-
-				@Override
-				public void arcDeleted(Object nodeId, Object targetNodeId, ArcId arcId) {
-					arcDiffs[0]--;
-				}
-
-				@Override
-				public void nodeCreated(Object nodeId) {
-				}
-
-				@Override
-				public void nodeIdChanged(Object nodeId, Object newId) {
-				}
-
-				@Override
-				public void nodePropertyChanged(Object nodeId,
-						String property, Object oldValue, Object newValue) {
-				}
-
-				@Override
-				public void nodeRemoved(Object nodeId) {
-				}
-			});
-
-			assertEquals(-2, arcDiffs[0]);
-		});
-	}
-
-	@Test
-	public void testCommitChangesToParent() {
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.commitChanges();
-
-		final ObjectContext child = runtime.newContext(clientContext);
-
-		List<ClientMtTable1> objects = ObjectSelect.query(ClientMtTable1.class).select(child);
-
-		assertEquals(4, objects.size());
-
-		final ClientMtTable1 childNew = child.newObject(ClientMtTable1.class);
-		childNew.setGlobalAttribute1("NNN");
-
-		final ClientMtTable1 childModified = objects.get(0);
-		childModified.setGlobalAttribute1("MMM");
-
-		final ClientMtTable1 childCommitted = objects.get(1);
-
-		final ClientMtTable1 childHollow = objects.get(3);
-		child.invalidateObjects(childHollow);
-
-		queryInterceptor.runWithQueriesBlocked(() -> {
-			child.commitChangesToParent();
-
-			// * all modified child objects must be in committed state now
-			// * all modifications should be propagated to the parent
-			// * no actual commit should occur.
-
-			assertEquals(PersistenceState.COMMITTED, childNew.getPersistenceState());
-			assertEquals(PersistenceState.COMMITTED, childModified.getPersistenceState());
-			assertEquals(PersistenceState.COMMITTED, childCommitted.getPersistenceState());
-			assertEquals(PersistenceState.HOLLOW, childHollow.getPersistenceState());
-
-			ClientMtTable1 parentNew = (ClientMtTable1) clientContext
-					.getGraphManager().getNode(childNew.getObjectId());
-			final ClientMtTable1 parentModified = (ClientMtTable1) clientContext
-					.getGraphManager().getNode(childModified.getObjectId());
-			ClientMtTable1 parentCommitted = (ClientMtTable1) clientContext
-					.getGraphManager()
-					.getNode(childCommitted.getObjectId());
-			ClientMtTable1 parentHollow = (ClientMtTable1) clientContext
-					.getGraphManager().getNode(childHollow.getObjectId());
-
-			assertNotNull(parentNew);
-			assertEquals(PersistenceState.NEW, parentNew.getPersistenceState());
-			assertEquals("NNN", parentNew.getGlobalAttribute1());
-
-			assertNotNull(parentModified);
-			assertEquals(PersistenceState.MODIFIED, parentModified.getPersistenceState());
-			assertEquals("MMM", parentModified.getGlobalAttribute1());
-
-			assertNotNull(parentCommitted);
-			assertEquals(PersistenceState.COMMITTED, parentCommitted.getPersistenceState());
-
-			assertNotNull(parentHollow);
-
-			// check that arc changes got recorded in the parent context
-			GraphDiff diffs = clientContext.internalGraphManager().getDiffs();
-
-			final int[] modifiedProperties = new int[1];
-
-			diffs.apply(new GraphChangeHandler() {
-
-				@Override
-				public void arcCreated(Object nodeId, Object targetNodeId, ArcId arcId) {
-				}
-
-				@Override
-				public void arcDeleted(Object nodeId, Object targetNodeId, ArcId arcId) {
-				}
-
-				@Override
-				public void nodeCreated(Object nodeId) {
-				}
-
-				@Override
-				public void nodeIdChanged(Object nodeId, Object newId) {
-				}
-
-				@Override
-				public void nodePropertyChanged(Object nodeId, String property, Object oldValue, Object newValue) {
-					if (nodeId.equals(parentModified.getObjectId())) {
-						modifiedProperties[0]++;
-					}
-				}
-
-				@Override
-				public void nodeRemoved(Object nodeId) {
-				}
-			});
-
-			assertEquals(1, modifiedProperties[0]);
-		});
-	}
-
-	@Test
-	public void testCommitChangesToParentDeleted() {
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.commitChanges();
-
-		ObjectContext child = runtime.newContext(clientContext);
-
-		// make sure we fetch in predictable order
-		List<ClientMtTable1> objects = ObjectSelect.query(ClientMtTable1.class).select(child);
-
-		assertEquals(4, objects.size());
-
-		// delete AND modify
-		ClientMtTable1 childDeleted = objects.get(2);
-		child.deleteObjects(childDeleted);
-		childDeleted.setGlobalAttribute1("DDD");
-
-		// don't block queries - on delete Cayenne may need to resolve delete
-		// rules via fetch
-		child.commitChangesToParent();
-
-		// * all modified child objects must be in committed state now
-		// * all modifications should be propagated to the parent
-		// * no actual commit should occur.
-
-		assertEquals(PersistenceState.TRANSIENT, childDeleted.getPersistenceState());
-
-		ClientMtTable1 parentDeleted = (ClientMtTable1) clientContext.getGraphManager()
-				.getNode(childDeleted.getObjectId());
-
-		assertNotNull(parentDeleted);
-		assertEquals(PersistenceState.DELETED,
-				parentDeleted.getPersistenceState());
-		assertEquals("DDD", parentDeleted.getGlobalAttribute1());
-	}
-
-	@Test
-	public void testCommitChanges() {
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.newObject(ClientMtTable1.class);
-		clientContext.commitChanges();
-
-		ObjectContext child = runtime.newContext(clientContext);
-
-		// make sure we fetch in predictable order
-		List<ClientMtTable1> objects = ObjectSelect.query(ClientMtTable1.class).select(child);
-
-		assertEquals(4, objects.size());
-
-		ClientMtTable1 childNew = child.newObject(ClientMtTable1.class);
-		childNew.setGlobalAttribute1("NNN");
-
-		ClientMtTable1 childModified = objects.get(0);
-		childModified.setGlobalAttribute1("MMM");
-
-		ClientMtTable1 childCommitted = objects.get(1);
-
-		// delete AND modify
-		ClientMtTable1 childDeleted = objects.get(2);
-		child.deleteObjects(childDeleted);
-		childDeleted.setGlobalAttribute1("DDD");
-
-		ClientMtTable1 childHollow = objects.get(3);
-		child.invalidateObjects(childHollow);
-
-		child.commitChanges();
-
-		assertEquals(PersistenceState.COMMITTED, childNew.getPersistenceState());
-		assertEquals(PersistenceState.COMMITTED, childModified.getPersistenceState());
-		assertEquals(PersistenceState.COMMITTED, childCommitted.getPersistenceState());
-		assertEquals(PersistenceState.TRANSIENT, childDeleted.getPersistenceState());
-		assertEquals(PersistenceState.HOLLOW, childHollow.getPersistenceState());
-
-		ClientMtTable1 parentNew = (ClientMtTable1) clientContext
-				.getGraphManager().getNode(childNew.getObjectId());
-		ClientMtTable1 parentModified = (ClientMtTable1) clientContext
-				.getGraphManager().getNode(childModified.getObjectId());
-		ClientMtTable1 parentCommitted = (ClientMtTable1) clientContext
-				.getGraphManager().getNode(childCommitted.getObjectId());
-		ClientMtTable1 parentDeleted = (ClientMtTable1) clientContext
-				.getGraphManager().getNode(childDeleted.getObjectId());
-		ClientMtTable1 parentHollow = (ClientMtTable1) clientContext
-				.getGraphManager().getNode(childHollow.getObjectId());
-
-		assertNotNull(parentNew);
-		assertEquals(PersistenceState.COMMITTED, parentNew.getPersistenceState());
-		assertEquals("NNN", parentNew.getGlobalAttribute1());
-
-		assertNotNull(parentModified);
-		assertEquals(PersistenceState.COMMITTED, parentModified.getPersistenceState());
-		assertEquals("MMM", parentModified.getGlobalAttribute1());
-
-		assertNull("Deleted object should not be registered.", parentDeleted);
-
-		assertNotNull(parentCommitted);
-		assertEquals(PersistenceState.COMMITTED, parentCommitted.getPersistenceState());
-
-		assertNotNull(parentHollow);
-	}
-
-	@Test
-	public void testAddRemove() {
-		ObjectContext child = runtime.newContext(clientContext);
-
-		ClientMtTable1 a = child.newObject(ClientMtTable1.class);
-		a.setGlobalAttribute1("X");
-		child.commitChanges();
-
-		ClientMtTable2 p1 = child.newObject(ClientMtTable2.class);
-		p1.setGlobalAttribute("P1");
-		a.addToTable2Array(p1);
-
-		ClientMtTable2 p2 = child.newObject(ClientMtTable2.class);
-		p2.setGlobalAttribute("P2");
-		a.addToTable2Array(p2);
-
-		a.removeFromTable2Array(p2);
-
-		// this causes an error on commit
-		child.deleteObjects(p2);
-
-		child.commitChangesToParent();
-
-	}
-
-	@Test
-	public void testChangeRel() {
-		ObjectContext child = runtime.newContext(clientContext);
-
-		ClientMtTable1 a = child.newObject(ClientMtTable1.class);
-		ClientMtTable2 b = child.newObject(ClientMtTable2.class);
-		child.commitChanges();
-
-		assertEquals(PersistenceState.COMMITTED, a.getPersistenceState());
-
-		a.addToTable2Array(b);
-		assertEquals(PersistenceState.MODIFIED, a.getPersistenceState());
-
-		child.commitChangesToParent();
-		ClientMtTable1 parentA = (ClientMtTable1) clientContext
-				.getGraphManager().getNode(a.getObjectId());
-		assertEquals(PersistenceState.COMMITTED, a.getPersistenceState());
-		assertEquals(PersistenceState.MODIFIED, parentA.getPersistenceState());
-		assertEquals(1, parentA.getTable2Array().size());
-
-		clientContext.commitChanges();
-		assertEquals(PersistenceState.COMMITTED, parentA.getPersistenceState());
-
-		a.removeFromTable2Array(b);
-		assertEquals(PersistenceState.MODIFIED, a.getPersistenceState());
-
-		child.commitChangesToParent();
-		assertEquals(PersistenceState.COMMITTED, a.getPersistenceState());
-		assertEquals(PersistenceState.MODIFIED, parentA.getPersistenceState());
-		assertEquals(0, parentA.getTable2Array().size());
-	}
-
-	@Test
-	public void testCAY1183()  {
-		ClientMtTable1 parentMt = clientContext.newObject(ClientMtTable1.class);
-		clientContext.commitChanges();
-
-		ObjectContext child = runtime.newContext(clientContext);
-		ClientMtTable1 childMt = (ClientMtTable1) Cayenne.objectForPK(child,
-				parentMt.getObjectId());
-		childMt.setGlobalAttribute1("1183");
-		ClientMtTable2 childMt2 = child.newObject(ClientMtTable2.class);
-		childMt2.setGlobalAttribute("1183");
-		childMt2.setTable1(childMt);
-
-		child.commitChangesToParent();
-
-		// fetching other relationship... this fails per CAY-1183
-		childMt2.getTable3();
-	}
-
-	/**
-	 * CAY1714
-	 */
-	@Test
-	public void testQueriesOnTemporaryObject() {
-		ObjectContext clientContext = runtime.newContext(this.clientContext);
-		ClientMtTable1 parentMt = clientContext.newObject(ClientMtTable1.class);
-
-		ObjectContext childContext = runtime.newContext(clientContext);
-		ClientMtTable1 childMt = (ClientMtTable1) Cayenne.objectForPK(childContext, parentMt.getObjectId());
-		childMt.setGlobalAttribute1("1183");
-		ClientMtTable2 childMt2 = childContext.newObject(ClientMtTable2.class);
-		childMt2.setGlobalAttribute("1183");
-		childMt2.setTable1(childMt);
-
-		childContext.commitChangesToParent();
-
-		assertNull(childMt2.getTable3());
-	}
-
-	@Test
-	public void testCAY1194() {
-		ClientMtTable1 parentMt = clientContext.newObject(ClientMtTable1.class);
-		ObjectContext child = runtime.newContext(clientContext);
-
-		ClientMtTable2 childMt2 = child.newObject(ClientMtTable2.class);
-		childMt2.setGlobalAttribute("222");
-
-		ClientMtTable1 localParentMt = child.localObject(parentMt);
-		assertEquals(0, parentMt.getTable2Array().size());
-		assertEquals(0, localParentMt.getTable2Array().size());
-
-		childMt2.setTable1(localParentMt);
-
-		assertEquals(0, parentMt.getTable2Array().size());
-		assertEquals(1, localParentMt.getTable2Array().size());
-
-		assertEquals(localParentMt.getTable2Array().get(0).getObjectContext(),
-				child);
-
-		child.commitChangesToParent();
-		assertEquals(1, parentMt.getTable2Array().size());
-		assertEquals(parentMt.getTable2Array().get(0).getObjectContext(),
-				clientContext);
-	}
-
-	@Test
-	public void testCommitChangesToParentOneToMany() {
-		ObjectContext child = runtime.newContext(clientContext);
-
-		ClientMtTable1 master = child.newObject(ClientMtTable1.class);
-		ClientMtTable2 dep = child.newObject(ClientMtTable2.class);
-		master.addToTable2Array(dep);
-
-		child.commitChangesToParent();
-
-		ClientMtTable1 masterParent = (ClientMtTable1) clientContext
-				.getGraphManager().getNode(master.getObjectId());
-		ClientMtTable2 depParent = (ClientMtTable2) clientContext
-				.getGraphManager().getNode(dep.getObjectId());
-
-		assertNotNull(masterParent);
-		assertNotNull(depParent);
-
-		assertSame(masterParent, depParent.getTable1());
-		assertTrue(masterParent.getTable2Array().contains(depParent));
-
-		// check that arc changes got recorded in the parent context
-		GraphDiff diffs = clientContext.internalGraphManager().getDiffs();
-
-		final int[] arcDiffs = new int[1];
-		final int[] newNodes = new int[1];
-
-		diffs.apply(new GraphChangeHandler() {
-			@Override
-			public void arcCreated(Object nodeId, Object targetNodeId, ArcId arcId) {
-				arcDiffs[0]++;
-			}
-
-			@Override
-			public void arcDeleted(Object nodeId, Object targetNodeId, ArcId arcId) {
-				arcDiffs[0]--;
-			}
-
-			@Override
-			public void nodeCreated(Object nodeId) {
-				newNodes[0]++;
-			}
-
-			@Override
-			public void nodeIdChanged(Object nodeId, Object newId) {
-			}
-
-			@Override
-			public void nodePropertyChanged(Object nodeId, String property, Object oldValue, Object newValue) {
-			}
-
-			@Override
-			public void nodeRemoved(Object nodeId) {
-				newNodes[0]--;
-			}
-		});
-
-		assertEquals(2, newNodes[0]);
-		assertEquals(2, arcDiffs[0]);
-	}
-
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextTooneIT.java b/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextTooneIT.java
deleted file mode 100644
index c63eff710..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/NestedCayenneContextTooneIT.java
+++ /dev/null
@@ -1,222 +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
- *
- *    https://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.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.cayenne.configuration.rop.client.ClientRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.graph.ArcId;
-import org.apache.cayenne.graph.GraphChangeHandler;
-import org.apache.cayenne.graph.GraphDiff;
-import org.apache.cayenne.query.ObjectSelect;
-import org.apache.cayenne.remote.RemoteCayenneCase;
-import org.apache.cayenne.remote.service.LocalConnection;
-import org.apache.cayenne.testdo.toone.ClientTooneDep;
-import org.apache.cayenne.testdo.toone.ClientTooneMaster;
-import org.apache.cayenne.unit.di.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-
-@UseServerRuntime(CayenneProjects.TOONE_PROJECT)
-@RunWith(value = Parameterized.class)
-public class NestedCayenneContextTooneIT extends RemoteCayenneCase {
-
-    @Inject
-    private ClientRuntime runtime;
-
-    @Inject
-    private DataChannelInterceptor queryInterceptor;
-
-    @Parameterized.Parameters
-    public static Collection<Object[]> data() {
-        return Arrays.asList(new Object[][]{
-                {LocalConnection.HESSIAN_SERIALIZATION},
-                {LocalConnection.JAVA_SERIALIZATION},
-                {LocalConnection.NO_SERIALIZATION},});
-    }
-
-    public NestedCayenneContextTooneIT(int serializationPolicy) {
-        super.serializationPolicy = serializationPolicy;
-    }
-
-    /*
- * was added for CAY-1636
- */
-    @Test
-    public void testCAY1636() throws Exception {
-
-        ClientTooneMaster A = clientContext
-                .newObject(ClientTooneMaster.class);
-        clientContext.commitChanges();
-
-        ClientTooneDep B = clientContext.newObject(ClientTooneDep.class);
-        A.setToDependent(B);
-        clientContext.commitChanges();
-
-        ObjectContext child = runtime.newContext(clientContext);
-
-        ObjectSelect<ClientTooneMaster> query = ObjectSelect.query(ClientTooneMaster.class);
-        List<ClientTooneMaster> objects = child.select(query);
-
-        assertEquals(1, objects.size());
-
-        ClientTooneMaster childDeleted = objects.get(0);
-
-        child.deleteObjects(childDeleted);
-
-        child.commitChangesToParent();
-
-        ClientTooneMaster parentDeleted = (ClientTooneMaster) clientContext
-                .getGraphManager().getNode(childDeleted.getObjectId());
-
-        assertNotNull(parentDeleted);
-        assertEquals(PersistenceState.DELETED,
-                parentDeleted.getPersistenceState());
-
-        clientContext.commitChanges();
-
-        ObjectSelect<ClientTooneMaster> query2 = ObjectSelect.query(ClientTooneMaster.class);
-        List<ClientTooneMaster> objects2 = child.select(query2);
-
-        assertEquals(0, objects2.size());
-
-    }
-
-    @Test
-    public void testCAY1636_2() throws Exception {
-
-        ClientTooneMaster A = clientContext
-                .newObject(ClientTooneMaster.class);
-        clientContext.commitChanges();
-
-        ClientTooneDep B = clientContext.newObject(ClientTooneDep.class);
-        A.setToDependent(B);
-        clientContext.commitChanges();
-
-        ObjectContext child = runtime.newContext(clientContext);
-
-        ObjectSelect<ClientTooneDep> queryB = ObjectSelect.query(ClientTooneDep.class);
-        List<?> objectsB = child.performQuery(queryB);
-
-        assertEquals(1, objectsB.size());
-
-        ClientTooneDep childBDeleted = (ClientTooneDep) objectsB.get(0);
-        child.deleteObjects(childBDeleted);
-
-        ObjectSelect<ClientTooneMaster> query = ObjectSelect.query(ClientTooneMaster.class);
-        List<ClientTooneMaster> objects = child.select(query);
-
-        assertEquals(1, objects.size());
-
-        ClientTooneMaster childDeleted = objects.get(0);
-
-        child.deleteObjects(childDeleted);
-
-        child.commitChangesToParent();
-
-        ClientTooneMaster parentDeleted = (ClientTooneMaster) clientContext
-                .getGraphManager().getNode(childDeleted.getObjectId());
-
-        assertNotNull(parentDeleted);
-        assertEquals(PersistenceState.DELETED,
-                parentDeleted.getPersistenceState());
-
-        clientContext.commitChanges();
-
-        ObjectSelect<ClientTooneMaster> query2 = ObjectSelect.query(ClientTooneMaster.class);
-        List<ClientTooneMaster> objects2 = child.select(query2);
-
-        assertEquals(0, objects2.size());
-
-    }
-
-    @Test
-    public void testCommitChangesToParentOneToOne() throws Exception {
-        ObjectContext child = runtime.newContext(clientContext);
-
-        ClientTooneMaster master = child.newObject(ClientTooneMaster.class);
-        ClientTooneDep dep = child.newObject(ClientTooneDep.class);
-        master.setToDependent(dep);
-
-        child.commitChangesToParent();
-
-        ClientTooneMaster masterParent = (ClientTooneMaster) clientContext
-                .getGraphManager().getNode(master.getObjectId());
-        ClientTooneDep depParent = (ClientTooneDep) clientContext
-                .getGraphManager().getNode(dep.getObjectId());
-
-        assertNotNull(masterParent);
-        assertNotNull(depParent);
-
-        assertSame(masterParent, depParent.getToMaster());
-        assertSame(depParent, masterParent.getToDependent());
-
-        // check that arc changes got recorded in the parent context
-        GraphDiff diffs = clientContext.internalGraphManager().getDiffs();
-
-        final int[] arcDiffs = new int[1];
-        final int[] newNodes = new int[1];
-
-        diffs.apply(new GraphChangeHandler() {
-
-            @Override
-            public void arcCreated(Object nodeId, Object targetNodeId, ArcId arcId) {
-                arcDiffs[0]++;
-            }
-
-            @Override
-            public void arcDeleted(Object nodeId, Object targetNodeId, ArcId arcId) {
-                arcDiffs[0]--;
-            }
-
-            @Override
-            public void nodeCreated(Object nodeId) {
-                newNodes[0]++;
-            }
-
-            @Override
-            public void nodeIdChanged(Object nodeId, Object newId) {
-            }
-
-            @Override
-            public void nodePropertyChanged(Object nodeId, String property, Object oldValue, Object newValue) {
-            }
-
-            @Override
-            public void nodeRemoved(Object nodeId) {
-                newNodes[0]--;
-            }
-        });
-
-        assertEquals(2, newNodes[0]);
-        assertEquals(2, arcDiffs[0]);
-    }
-
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/ObjectContextChangeLogTest.java b/cayenne-client/src/test/java/org/apache/cayenne/ObjectContextChangeLogTest.java
deleted file mode 100644
index 453823337..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/ObjectContextChangeLogTest.java
+++ /dev/null
@@ -1,48 +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
- *
- *    https://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.graph.CompoundDiff;
-import org.apache.cayenne.graph.NodeCreateOperation;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-public class ObjectContextChangeLogTest {
-
-    @Test
-    public void testGetDiffsSerializableWithHessian() throws Exception {
-        ObjectContextChangeLog recorder = new ObjectContextChangeLog();
-
-        // id must be a serializable object
-        recorder.addOperation(new NodeCreateOperation("id-string"));
-        CompoundDiff diff = (CompoundDiff) recorder.getDiffs();
-
-        Object clone = HessianUtil.cloneViaClientServerSerialization(diff, new EntityResolver());
-        assertNotNull(clone);
-        assertTrue(clone instanceof CompoundDiff);
-
-        CompoundDiff d1 = (CompoundDiff) clone;
-        assertEquals(1, d1.getDiffs().size());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/ObjectIdTest.java b/cayenne-client/src/test/java/org/apache/cayenne/ObjectIdTest.java
deleted file mode 100644
index a3b5e68cb..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/ObjectIdTest.java
+++ /dev/null
@@ -1,84 +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
- *
- *    https://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.map.EntityResolver;
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.junit.Test;
-
-import java.util.Collections;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
-
-public class ObjectIdTest {
-
-    @Test
-    public void testHessianSerializabilityTemp() throws Exception {
-        ObjectId temp1 = ObjectId.of("e");
-
-        // make sure hashcode is resolved
-        int h = temp1.hashCode();
-        assertEquals(h, temp1.hashCode());
-        assertTrue(temp1.hashCode() != 0);
-
-        ObjectId temp2 = (ObjectId) HessianUtil.cloneViaClientServerSerialization(temp1, new EntityResolver());
-
-        // make sure hashCode is reset to 0
-        assertEquals(h, temp2.hashCode());
-
-        assertTrue(temp1.isTemporary());
-        assertNotSame(temp1, temp2);
-        assertEquals(temp1, temp2);
-    }
-
-    @Test
-    public void testHessianSerializabilityPerm() throws Exception {
-        ObjectId perm1 = ObjectId.of("e", "a", "b");
-
-        // make sure hashcode is resolved
-        int h = perm1.hashCode();
-        assertEquals(h, perm1.hashCode());
-        assertTrue(perm1.hashCode() != 0);
-
-        ObjectId perm2 = (ObjectId) HessianUtil.cloneViaClientServerSerialization(perm1, new EntityResolver());
-
-        assertEquals(h, perm2.hashCode());
-
-        assertFalse(perm2.isTemporary());
-        assertNotSame(perm1, perm2);
-        assertEquals(perm1, perm2);
-    }
-
-    @Test
-    public void testHessianSerializabilityPerm1() throws Exception {
-        // test serializing an id created with unmodifiable map
-
-        Map<String, Object> id = Collections.unmodifiableMap(Collections.singletonMap("a", "b"));
-        ObjectId perm1 = ObjectId.of("e", id);
-        ObjectId perm2 = (ObjectId) HessianUtil.cloneViaClientServerSerialization(perm1, new EntityResolver());
-
-        assertFalse(perm2.isTemporary());
-        assertNotSame(perm1, perm2);
-        assertEquals(perm1, perm2);
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/PersistentObjectInContextIT.java b/cayenne-client/src/test/java/org/apache/cayenne/PersistentObjectInContextIT.java
deleted file mode 100644
index f267ce705..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/PersistentObjectInContextIT.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
- *
- *    https://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.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.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.apache.cayenne.util.PersistentObjectHolder;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class PersistentObjectInContextIT extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMtTable1;
-    private TableHelper tMtTable2;
-
-    @Before
-    public void setUp() throws Exception {
-        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 createTwoMtTable1sAnd2sDataSet() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-        tMtTable1.insert(2, "g2", "s2");
-
-        tMtTable2.insert(1, 1, "g1");
-        tMtTable2.insert(2, 1, "g2");
-    }
-
-    @Test
-    public void testResolveToManyReverseResolved() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectId gid = ObjectId.of(
-                "MtTable1",
-                MtTable1.TABLE1_ID_PK_COLUMN,
-                1);
-        ClientMtTable1 t1 = (ClientMtTable1) Cayenne.objectForQuery(
-                context,
-                new ObjectIdQuery(gid));
-
-        assertNotNull(t1);
-
-        List<ClientMtTable2> t2s = t1.getTable2Array();
-        assertEquals(2, t2s.size());
-
-        for (ClientMtTable2 t2 : t2s) {
-
-            PersistentObjectHolder holder = (PersistentObjectHolder) t2.getTable1Direct();
-            assertFalse(holder.isFault());
-            assertSame(t1, holder.getValue());
-        }
-    }
-
-    @Test
-    public void testToOneRelationship() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectId gid = ObjectId.of(
-                "MtTable2",
-                MtTable2.TABLE2_ID_PK_COLUMN,
-                1);
-        ClientMtTable2 mtTable21 = (ClientMtTable2) Cayenne.objectForQuery(
-                context,
-                new ObjectIdQuery(gid));
-
-        assertNotNull(mtTable21);
-
-        ClientMtTable1 mtTable1 = mtTable21.getTable1();
-        assertNotNull("To one relationship incorrectly resolved to null", mtTable1);
-        assertEquals("g1", mtTable1.getGlobalAttribute1());
-    }
-
-    @Test
-    public void testResolveToOneReverseResolved() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectId gid = ObjectId.of(
-                "MtTable2",
-                MtTable2.TABLE2_ID_PK_COLUMN,
-                1);
-        ClientMtTable2 mtTable21 = (ClientMtTable2) Cayenne.objectForQuery(
-                context,
-                new ObjectIdQuery(gid));
-
-        assertNotNull(mtTable21);
-
-        ClientMtTable1 mtTable1 = mtTable21.getTable1();
-        assertNotNull("To one relationship incorrectly resolved to null", mtTable1);
-
-        List<ClientMtTable2> list = mtTable1.getTable2Array();
-        assertNotNull(list);
-        assertTrue(list instanceof ValueHolder);
-
-        assertTrue(((ValueHolder) list).isFault());
-
-        // resolve it here...
-        assertEquals(2, list.size());
-        for (ClientMtTable2 t2 : list) {
-            PersistentObjectHolder holder = (PersistentObjectHolder) t2.getTable1Direct();
-            assertFalse(holder.isFault());
-            assertSame(mtTable1, holder.getValue());
-        }
-
-        assertEquals("g1", mtTable1.getGlobalAttribute1());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/access/ClientServerChannelIT.java b/cayenne-client/src/test/java/org/apache/cayenne/access/ClientServerChannelIT.java
deleted file mode 100644
index 1429de5a1..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/access/ClientServerChannelIT.java
+++ /dev/null
@@ -1,263 +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
- *
- *    https://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.access;
-
-import java.util.List;
-
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.MockDataChannel;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.QueryResponse;
-import org.apache.cayenne.ValueHolder;
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.graph.GraphDiff;
-import org.apache.cayenne.graph.NodeCreateOperation;
-import org.apache.cayenne.log.JdbcEventLogger;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.query.MockQuery;
-import org.apache.cayenne.query.ObjectSelect;
-import org.apache.cayenne.query.Query;
-import org.apache.cayenne.remote.QueryMessage;
-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.testdo.mt.ClientMtTable2;
-import org.apache.cayenne.testdo.mt.ClientMtTable3;
-import org.apache.cayenne.testdo.mt.MtTable1;
-import org.apache.cayenne.testdo.mt.MtTable3;
-import org.apache.cayenne.unit.di.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.apache.cayenne.util.EqualsBuilder;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.mock;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class ClientServerChannelIT extends ClientCase {
-
-	@Inject
-	protected DataContext serverContext;
-
-	@Inject
-	protected ClientServerChannel clientServerChannel;
-
-	@Inject
-	protected DBHelper dbHelper;
-
-	@Inject
-	protected DataChannelInterceptor queryInterceptor;
-
-	@Inject
-	protected JdbcEventLogger logger;
-
-	@Inject
-	private ServerRuntime runtime;
-
-	private TableHelper tMtTable1;
-	private TableHelper tMtTable2;
-	private TableHelper tMtTable3;
-
-	@Before
-	public void setUp() throws Exception {
-		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");
-
-		tMtTable3 = new TableHelper(dbHelper, "MT_TABLE3");
-		tMtTable3.setColumns("TABLE3_ID", "BINARY_COLUMN", "CHAR_COLUMN", "INT_COLUMN");
-	}
-
-	private void createTwoMtTable1sAnd2sDataSet() throws Exception {
-
-		tMtTable1.insert(1, "g1", "s1");
-		tMtTable1.insert(2, "g2", "s2");
-
-		tMtTable2.insert(1, 1, "g1");
-		tMtTable2.insert(2, 1, "g2");
-	}
-
-	@Test
-	public void testGetEntityResolver() {
-		EntityResolver resolver = clientServerChannel.getEntityResolver();
-		assertNotNull(resolver);
-		assertNull(resolver.getObjEntity(ClientMtTable1.class));
-		assertNotNull(resolver.getClientEntityResolver().getObjEntity(ClientMtTable1.class));
-	}
-
-	@Test
-	public void testSynchronizeCommit() {
-
-		ObjectSelect<MtTable1> query = ObjectSelect.query(MtTable1.class);
-
-		// no changes...
-		clientServerChannel.onSync(serverContext, mock(GraphDiff.class), DataChannel.FLUSH_CASCADE_SYNC);
-
-		assertEquals(0, serverContext.performQuery(query).size());
-
-		// introduce changes
-		clientServerChannel.onSync(serverContext
-				, new NodeCreateOperation(ObjectId.of("MtTable1"))
-				, DataChannel.FLUSH_CASCADE_SYNC);
-
-		assertEquals(1, serverContext.performQuery(query).size());
-	}
-
-	@Test
-	public void testPerformQueryObjectIDInjection() throws Exception {
-		tMtTable1.insert(55, "g1", "s1");
-
-		Query query = ObjectSelect.query(MtTable1.class);
-		QueryResponse response = clientServerChannel.onQuery(null, query);
-
-		assertNotNull(response);
-
-		List<?> results = response.firstList();
-
-		assertNotNull(results);
-		assertEquals(1, results.size());
-
-		Object result = results.get(0);
-		assertTrue(result instanceof ClientMtTable1);
-		ClientMtTable1 clientObject = (ClientMtTable1) result;
-		assertNotNull(clientObject.getObjectId());
-
-		assertEquals(ObjectId.of("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 55), clientObject.getObjectId());
-	}
-
-	@Test
-	public void testPerformQueryValuePropagation() throws Exception {
-
-		byte[] bytes = new byte[] { 1, 2, 3 };
-
-		tMtTable3.insert(1, bytes, "abc", 4);
-
-		Query query = ObjectSelect.query(MtTable3.class);
-		QueryResponse response = clientServerChannel.onQuery(null, query);
-
-		assertNotNull(response);
-
-		List<?> results = response.firstList();
-
-		assertNotNull(results);
-		assertEquals(1, results.size());
-
-		Object result = results.get(0);
-		assertTrue("Result is of wrong type: " + result, result instanceof ClientMtTable3);
-		ClientMtTable3 clientObject = (ClientMtTable3) result;
-
-		assertEquals("abc", clientObject.getCharColumn());
-		assertEquals(new Integer(4), clientObject.getIntColumn());
-		assertTrue(new EqualsBuilder().append(clientObject.getBinaryColumn(), bytes).isEquals());
-	}
-
-	@Test
-	public void testPerformQueryPropagationInheritance() throws Exception {
-
-		tMtTable1.insert(65, "sub1", "xyz");
-
-		ObjectSelect<ClientMtTable1> query = ObjectSelect.query(ClientMtTable1.class);
-		QueryResponse response = clientServerChannel.onQuery(null, query);
-
-		assertNotNull(response);
-
-		List<?> results = response.firstList();
-
-		assertNotNull(results);
-		assertEquals(1, results.size());
-
-		Object result = results.get(0);
-		assertTrue("Result is of wrong type: " + result, result instanceof ClientMtTable1Subclass1);
-		ClientMtTable1Subclass1 clientObject = (ClientMtTable1Subclass1) result;
-
-		assertEquals("sub1", clientObject.getGlobalAttribute1());
-	}
-
-	@Test
-	public void testOnQuery() {
-
-		final boolean[] genericDone = new boolean[1];
-		MockDataChannel parent = new MockDataChannel(new EntityResolver()) {
-
-			@Override
-			public QueryResponse onQuery(ObjectContext context, Query query) {
-				genericDone[0] = true;
-				return super.onQuery(context, query);
-			}
-		};
-		DataContext context = (DataContext) runtime.newContext(parent);
-
-		QueryMessage message = new QueryMessage(new MockQuery());
-		new ClientServerChannel(context).onQuery(null, message.getQuery());
-		assertTrue(genericDone[0]);
-	}
-
-	@Test
-	public void testOnQueryPrefetchingToMany() throws Exception {
-		createTwoMtTable1sAnd2sDataSet();
-
-		ObjectSelect<ClientMtTable1> query = ObjectSelect.query(ClientMtTable1.class)
-				.orderBy(ClientMtTable1.GLOBAL_ATTRIBUTE1.asc())
-				.prefetch(ClientMtTable1.TABLE2ARRAY.joint());
-
-		final List<?> results = clientServerChannel.onQuery(null, query).firstList();
-
-		queryInterceptor.runWithQueriesBlocked(() -> {
-			ClientMtTable1 o1 = (ClientMtTable1) results.get(0);
-			assertNull(o1.getObjectContext());
-
-			List<ClientMtTable2> children1 = o1.getTable2Array();
-
-			assertEquals(2, children1.size());
-			for (ClientMtTable2 o : children1) {
-				assertNull(o.getObjectContext());
-			}
-		});
-	}
-
-	@Test
-	public void testOnQueryPrefetchingToManyEmpty() throws Exception {
-		createTwoMtTable1sAnd2sDataSet();
-
-		ObjectSelect<ClientMtTable1> q = ObjectSelect.query(ClientMtTable1.class)
-				.orderBy(ClientMtTable1.GLOBAL_ATTRIBUTE1.asc())
-				.prefetch(ClientMtTable1.TABLE2ARRAY.joint());
-
-		final List<?> results = clientServerChannel.onQuery(null, q).firstList();
-
-		queryInterceptor.runWithQueriesBlocked(() -> {
-			ClientMtTable1 o2 = (ClientMtTable1) results.get(1);
-			assertNull(o2.getObjectContext());
-
-			List<?> children2 = o2.getTable2Array();
-			assertNotNull(children2);
-			assertFalse(((ValueHolder) children2).isFault());
-			assertEquals(0, children2.size());
-		});
-	}
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/access/ClientServerChannelQueryIT.java b/cayenne-client/src/test/java/org/apache/cayenne/access/ClientServerChannelQueryIT.java
deleted file mode 100644
index 5d26fb4ca..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/access/ClientServerChannelQueryIT.java
+++ /dev/null
@@ -1,241 +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
- *
- *    https://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.access;
-
-import java.util.List;
-
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.ValueHolder;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.MappedSelect;
-import org.apache.cayenne.query.ObjectSelect;
-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.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.apache.cayenne.util.PersistentObjectHolder;
-import org.apache.cayenne.util.PersistentObjectList;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class ClientServerChannelQueryIT extends ClientCase {
-
-    @Inject(ClientCase.ROP_CLIENT_KEY)
-    protected ObjectContext context;
-
-    @Inject
-    private ClientServerChannel serverChannel;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMtTable1;
-    private TableHelper tMtTable2;
-
-    @Before
-    public void setUp() throws Exception {
-        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");
-    }
-
-    protected void createSevenMtTable1sDataSet() throws Exception {
-
-        for (int i = 1; i <= 7; i++) {
-            tMtTable1.insert(i, "g" + i, "s" + i);
-        }
-    }
-
-    protected void createTwoMtTable1sAnd2sDataSet() throws Exception {
-
-        tMtTable1.insert(1, "g1", "s1");
-        tMtTable1.insert(2, "g2", "s2");
-
-        tMtTable2.insert(1, 1, "g1");
-        tMtTable2.insert(2, 1, "g2");
-    }
-
-    @SuppressWarnings("deprecation")
-    @Test
-    public void testPaginatedQueryServerCacheOverflow() throws Exception {
-        createSevenMtTable1sDataSet();
-
-        ObjectSelect<ClientMtTable1> query = ObjectSelect.query(ClientMtTable1.class)
-                .orderBy(ClientMtTable1.GLOBAL_ATTRIBUTE1.asc())
-                .pageSize(3);
-
-        List<?> results = context.performQuery(query);
-
-        // read page 1
-        assertTrue(results.get(0) instanceof ClientMtTable1);
-
-        assertTrue(results.get(3) instanceof ClientMtTable1);
-    }
-
-    @Test
-    public void testParameterizedMappedToEJBQLQueries() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        List<?> r1 = context.performQuery(MappedSelect.query("ParameterizedEJBQLMtQuery").param("g", "g1"));
-        assertEquals(1, r1.size());
-        assertTrue(r1.get(0) instanceof ClientMtTable1);
-    }
-
-    @Test
-    public void testNamedQuery() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        List<?> results = context.performQuery(MappedSelect.query("AllMtTable1"));
-
-        assertEquals(2, results.size());
-        assertTrue(results.get(0) instanceof ClientMtTable1);
-    }
-
-    @Test
-    public void testSelectQueryEntityNameRoot() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectSelect q = ObjectSelect.query(MtTable1.class);
-        List<?> results = context.performQuery(q);
-
-        assertEquals(2, results.size());
-
-        assertTrue(results.get(0) instanceof ClientMtTable1);
-    }
-
-    @Test
-    public void testSelectQueryClientClassRoot() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectSelect<ClientMtTable1> q = ObjectSelect.query(ClientMtTable1.class);
-        List<?> results = context.performQuery(q);
-
-        assertEquals(2, results.size());
-        assertTrue(results.get(0) instanceof ClientMtTable1);
-    }
-
-    @Test
-    public void testSelectQuerySimpleQualifier() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectSelect<ClientMtTable1> q = ObjectSelect.query(ClientMtTable1.class)
-                .where(ClientMtTable1.GLOBAL_ATTRIBUTE1.eq("g1"));
-        List<?> results = context.performQuery(q);
-
-        assertEquals(1, results.size());
-
-        assertTrue(results.get(0) instanceof ClientMtTable1);
-    }
-
-    @Test
-    public void testSelectQueryToManyRelationshipQualifier() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectSelect<ClientMtTable1> q = ObjectSelect.query(ClientMtTable1.class)
-                .where(ClientMtTable1.TABLE2ARRAY.dot(ClientMtTable2.GLOBAL_ATTRIBUTE).eq("g1"));
-        List<?> results = context.performQuery(q);
-
-        assertEquals(1, results.size());
-        assertTrue(results.get(0) instanceof ClientMtTable1);
-    }
-
-    @Test
-    public void testSelectQueryOrdering() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectSelect q = ObjectSelect.query(MtTable1.class)
-                .orderBy(ClientMtTable1.GLOBAL_ATTRIBUTE1.asc());
-        List<?> results = context.performQuery(q);
-
-        assertEquals(2, results.size());
-
-        ClientMtTable1 o1 = (ClientMtTable1) results.get(0);
-        ClientMtTable1 o2 = (ClientMtTable1) results.get(1);
-        assertTrue(o1.getGlobalAttribute1().compareTo(o2.getGlobalAttribute1()) < 0);
-
-        // now run the same query with reverse ordering to check that the first ordering
-        // result wasn't coincidental.
-        q.getOrderings().clear();
-        q.orderBy(ClientMtTable1.GLOBAL_ATTRIBUTE1.desc());
-        List<?> results1 = context.performQuery(q);
-
-        assertEquals(2, results1.size());
-
-        ClientMtTable1 o3 = (ClientMtTable1) results1.get(0);
-        ClientMtTable1 o4 = (ClientMtTable1) results1.get(1);
-        assertTrue(o3.getGlobalAttribute1().compareTo(o4.getGlobalAttribute1()) > 0);
-    }
-
-    @Test
-    public void testSelectQueryPrefetchToOne() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectSelect<ClientMtTable2> q = ObjectSelect.query(ClientMtTable2.class)
-                .where(ClientMtTable2.GLOBAL_ATTRIBUTE.eq("g1"))
-                .prefetch(ClientMtTable2.TABLE1.disjoint());
-        List<?> results = context.performQuery(q);
-
-        assertEquals(1, results.size());
-
-        ClientMtTable2 result = (ClientMtTable2) results.get(0);
-
-        ValueHolder holder = result.getTable1Direct();
-        assertNotNull(holder);
-        assertTrue(holder instanceof PersistentObjectHolder);
-        PersistentObjectHolder objectHolder = (PersistentObjectHolder) holder;
-        assertFalse(objectHolder.isFault());
-
-        ClientMtTable1 target = (ClientMtTable1) objectHolder.getValue();
-        assertNotNull(target);
-    }
-
-    @Test
-    public void testSelectQueryPrefetchToMany() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        ObjectSelect<ClientMtTable1> q = ObjectSelect.query(ClientMtTable1.class)
-                .where(ClientMtTable1.GLOBAL_ATTRIBUTE1.eq("g1"))
-                .prefetch(ClientMtTable1.TABLE2ARRAY.joint());
-        List<?> results = context.performQuery(q);
-
-        assertEquals(1, results.size());
-
-        ClientMtTable1 result = (ClientMtTable1) results.get(0);
-
-        List<?> holder = result.getTable2ArrayDirect();
-        assertNotNull(holder);
-        assertTrue(holder instanceof PersistentObjectList);
-        PersistentObjectList objectHolder = (PersistentObjectList) holder;
-        assertFalse(objectHolder.isFault());
-        assertEquals(2, objectHolder.size());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/access/types/EnumTest.java b/cayenne-client/src/test/java/org/apache/cayenne/access/types/EnumTest.java
deleted file mode 100644
index e13db5823..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/access/types/EnumTest.java
+++ /dev/null
@@ -1,113 +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
- *
- *    https://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.access.types;
-
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.apache.cayenne.util.Util;
-import org.junit.Test;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-
-/**
- * A test case checking Cayenne handling of 1.5 Enums.
- * 
- */
-public class EnumTest {
-
-    @Test
-    public void testSerializabilityWithHessianStandalone() throws Exception {
-        MockEnum before = MockEnum.a;
-
-        // test standalone
-        Object after = HessianUtil.cloneViaClientServerSerialization(
-                before,
-                new EntityResolver());
-        assertNotNull(after);
-        assertSame(before, after);
-    }
-
-    @Test
-    public void testSerializabilityWithHessianInTheMap() throws Exception {
-        // test in the Map
-        Map<String, MockEnum> map = new HashMap<>();
-        map.put("a", MockEnum.b);
-
-        Map after = (Map) HessianUtil.cloneViaClientServerSerialization(
-                (Serializable) map,
-                new EntityResolver());
-        assertNotNull(map);
-        assertSame(MockEnum.b, after.get("a"));
-
-    }
-
-    @Test
-    public void testSerializabilityWithHessianObjectProperty() throws Exception {
-        // test object property
-        MockEnumHolder object = new MockEnumHolder();
-        object.setMockEnum(MockEnum.b);
-
-        MockEnumHolder after = (MockEnumHolder) HessianUtil
-                .cloneViaClientServerSerialization(object, new EntityResolver());
-        assertNotNull(after);
-        assertSame(MockEnum.b, after.getMockEnum());
-    }
-
-    @Test
-    public void testSerializabilityWithHessianObjectPropertyInAList() throws Exception {
-
-        // test that Enum properties are serialized properly...
-
-        MockEnumHolder o1 = new MockEnumHolder();
-        o1.setMockEnum(MockEnum.b);
-
-        MockEnumHolder o2 = new MockEnumHolder();
-        o2.setMockEnum(MockEnum.c);
-
-        ArrayList<MockEnumHolder> l = new ArrayList<MockEnumHolder>();
-        l.add(o1);
-        l.add(o2);
-
-        ArrayList ld = (ArrayList) HessianUtil.cloneViaClientServerSerialization(
-                l,
-                new EntityResolver());
-        assertEquals(2, ld.size());
-
-        MockEnumHolder o1d = (MockEnumHolder) ld.get(0);
-        MockEnumHolder o2d = (MockEnumHolder) ld.get(1);
-        assertSame(MockEnum.b, o1d.getMockEnum());
-        assertSame(MockEnum.c, o2d.getMockEnum());
-    }
-
-    @Test
-    public void testSerializability() throws Exception {
-        MockEnum before = MockEnum.c;
-        Object object = Util.cloneViaSerialization(before);
-        assertNotNull(object);
-        assertSame(before, object);
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/cay_2641/Cay2641IT.java b/cayenne-client/src/test/java/org/apache/cayenne/cay_2641/Cay2641IT.java
deleted file mode 100644
index 3b2d14827..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/cay_2641/Cay2641IT.java
+++ /dev/null
@@ -1,97 +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
- *
- *    https://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.cay_2641;
-
-import org.apache.cayenne.CayenneContext;
-import org.apache.cayenne.Fault;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.ObjectSelect;
-import org.apache.cayenne.testdo.cay_2641.client.ArtistLazy;
-import org.apache.cayenne.testdo.cay_2641.client.PaintingLazy;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.*;
-
-/**
- * @since 4.2
- */
-@UseServerRuntime(CayenneProjects.CAY_2641)
-public class Cay2641IT extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-
-    @Before
-    public void setup() {
-        ArtistLazy artistLazy = context.newObject(ArtistLazy.class);
-        artistLazy.setName("Test");
-        artistLazy.setSurname("Test1");
-
-        PaintingLazy paintingLazy = context.newObject(PaintingLazy.class);
-        paintingLazy.setName("Test");
-        paintingLazy.setArtist(artistLazy);
-
-        context.commitChanges();
-    }
-
-    @Test
-    public void testSampleSelect() {
-        List<ArtistLazy> artists = ObjectSelect.query(ArtistLazy.class).select(context);
-
-        assertEquals(artists.size(), 1);
-        assertEquals(artists.get(0).getSurname(), "Test1");
-
-        assertTrue(artists.get(0).readPropertyDirectly("name") instanceof Fault);
-
-        assertEquals(artists.get(0).getName(), "Test");
-    }
-
-    @Test
-    public void testColumnSelect() {
-        List<String> strings = ObjectSelect.columnQuery(ArtistLazy.class, ArtistLazy.NAME).select(context);
-
-        assertEquals(strings.size(), 1);
-        assertEquals(strings.get(0), "Test");
-    }
-
-    @Test
-    public void testPrefetchSelect() {
-        List<PaintingLazy> paintingLazyList1 = ObjectSelect.query(PaintingLazy.class).prefetch(PaintingLazy.ARTIST.joint()).select(context);
-
-        assertEquals(paintingLazyList1.size(), 1);
-        assertTrue(paintingLazyList1.get(0).getArtist().readPropertyDirectly("name") instanceof Fault);
-
-        List<PaintingLazy> paintingLazyList2 = ObjectSelect.query(PaintingLazy.class).prefetch(PaintingLazy.ARTIST.disjoint()).select(context);
-
-        assertEquals(paintingLazyList2.size(), 1);
-        assertTrue(paintingLazyList1.get(0).getArtist().readPropertyDirectly("name") instanceof Fault);
-
-        List<PaintingLazy> paintingLazyList3 = ObjectSelect.query(PaintingLazy.class).prefetch(PaintingLazy.ARTIST.disjointById()).select(context);
-
-        assertEquals(paintingLazyList3.size(), 1);
-        assertTrue(paintingLazyList1.get(0).getArtist().readPropertyDirectly("name") instanceof Fault);
-    }
-
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientLocalRuntimeTest.java b/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientLocalRuntimeTest.java
deleted file mode 100644
index 46f26286b..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientLocalRuntimeTest.java
+++ /dev/null
@@ -1,84 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.access.ClientServerChannel;
-import org.apache.cayenne.access.DataContext;
-import org.apache.cayenne.configuration.ObjectContextFactory;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.remote.service.LocalConnection;
-import org.junit.Test;
-
-import java.util.Collection;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.mock;
-
-public class ClientLocalRuntimeTest {
-
-    @Test
-	public void testDefaultConstructor() {
-
-		Module serverModule = binder -> {
-        };
-
-		ClientRuntime runtime = ClientRuntime.builder()
-				.disableModulesAutoLoading()
-				.local(DIBootstrap.createInjector(serverModule))
-				.build();
-		Collection<Module> cmodules = runtime.getModules();
-		assertEquals(2, cmodules.size());
-
-		assertTrue(cmodules.toArray()[0] instanceof ClientModule);
-	}
-
-    @Test
-	public void testGetConnection() {
-
-		final DataContext serverContext = mock(DataContext.class);
-
-		Module serverModule = binder -> binder.bind(ObjectContextFactory.class).toInstance(new ObjectContextFactory() {
-
-            public ObjectContext createContext(DataChannel parent) {
-                return null;
-            }
-
-            public ObjectContext createContext() {
-                return serverContext;
-            }
-        });
-
-		ClientRuntime runtime = ClientRuntime.builder()
-				.local(DIBootstrap.createInjector(serverModule))
-				.build();
-
-		ClientConnection connection = runtime.getConnection();
-		assertNotNull(connection);
-		assertTrue(connection instanceof LocalConnection);
-
-		LocalConnection localConnection = (LocalConnection) connection;
-		assertTrue(localConnection.getChannel() instanceof ClientServerChannel);
-		ClientServerChannel clientServerChannel = (ClientServerChannel) localConnection.getChannel();
-		assertSame(serverContext, clientServerChannel.getParentChannel());
-	}
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientModuleTest.java b/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientModuleTest.java
deleted file mode 100644
index 85dfcec14..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientModuleTest.java
+++ /dev/null
@@ -1,98 +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
- *
- *    https://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.configuration.rop.client;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.configuration.Constants;
-import org.apache.cayenne.configuration.ObjectContextFactory;
-import org.apache.cayenne.configuration.server.ServerModule;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.event.DefaultEventManager;
-import org.apache.cayenne.remote.ClientChannel;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.remote.MockClientConnection;
-import org.junit.Test;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-@SuppressWarnings("deprecation")
-public class ClientModuleTest {
-
-    @Test
-    public void testObjectContextFactory() {
-
-        Map<String, String> properties = new HashMap<>();
-        ClientModule module = new ClientModule() {
-
-            @Override
-            public void configure(Binder binder) {
-                super.configure(binder);
-
-                // use a noop connection to prevent startup errors...
-                binder.bind(ClientConnection.class).to(MockClientConnection.class);
-            }
-        };
-
-        Injector injector = DIBootstrap.createInjector(module);
-
-        ObjectContextFactory factory = injector.getInstance(ObjectContextFactory.class);
-        assertNotNull(factory);
-        assertSame("ObjectContextFactory must be a singleton", factory, injector
-                .getInstance(ObjectContextFactory.class));
-    }
-
-    @Test
-    public void testDataChannel() {
-
-        Map<String, String> properties = new HashMap<>();
-        ClientModule module = new ClientModule() {
-
-            @Override
-            public void configure(Binder binder) {
-                super.configure(binder);
-
-                // use a noop connection to prevent startup errors...
-                binder.bind(ClientConnection.class).to(MockClientConnection.class);
-                ServerModule.contributeProperties(binder)
-                        .put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, String.valueOf(true));
-            }
-        };
-
-        Injector injector = DIBootstrap.createInjector(module);
-
-        DataChannel channel = injector.getInstance(DataChannel.class);
-        assertNotNull(channel);
-        assertTrue(channel instanceof ClientChannel);
-        assertSame("DataChannel must be a singleton", channel, injector
-                .getInstance(DataChannel.class));
-
-        ClientChannel clientChannel = (ClientChannel) channel;
-        assertTrue(clientChannel.getConnection() instanceof MockClientConnection);
-        assertTrue(clientChannel.getEventManager() instanceof DefaultEventManager);
-        assertFalse(clientChannel.isChannelEventsEnabled());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeBuilderTest.java b/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeBuilderTest.java
deleted file mode 100644
index eb9fe3208..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeBuilderTest.java
+++ /dev/null
@@ -1,160 +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
- *
- *    https://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.configuration.rop.client;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.configuration.Constants;
-import org.apache.cayenne.configuration.server.ServerModule;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.di.Key;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.remote.ClientChannel;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.remote.MockClientConnection;
-import org.apache.cayenne.rop.HttpClientConnection;
-import org.junit.After;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.mock;
-
-/**
- * @since 4.0
- */
-public class ClientRuntimeBuilderTest {
-
-    private ClientRuntime runtime;
-
-    @After
-    public void stopRuntime() {
-        if (runtime != null) {
-            runtime.shutdown();
-        }
-    }
-
-    @Test
-    public void testDefaultBuild() {
-        runtime = new ClientRuntimeBuilder().build();
-
-        Map<String, String> properties = runtime.getInjector()
-                .getInstance(Key.getMapOf(String.class, String.class, Constants.PROPERTIES_MAP));
-        assertTrue(properties.isEmpty());
-
-        Collection<Module> modules = runtime.getModules();
-        assertEquals(1, modules.size());
-        assertThat(modules.iterator().next(), instanceOf(ClientModule.class));
-    }
-
-    @Test
-    public void testNoAutoLoading() {
-        runtime = new ClientRuntimeBuilder().disableModulesAutoLoading().build();
-
-        Map<String, String> properties = runtime.getInjector()
-                .getInstance(Key.getMapOf(String.class, String.class, Constants.PROPERTIES_MAP));
-        assertTrue(properties.isEmpty());
-
-        Collection<Module> modules = runtime.getModules();
-        assertEquals(1, modules.size());
-        assertThat(modules.iterator().next(), instanceOf(ClientModule.class));
-    }
-
-    @Test
-    public void testExtraModules() {
-
-        Module m = mock(Module.class);
-
-        runtime = new ClientRuntimeBuilder().addModule(m).build();
-
-        Collection<Module> modules = runtime.getModules();
-        assertEquals(2, modules.size());
-        Module[] array = modules.toArray(new Module[2]);
-        assertThat(array[0], instanceOf(ClientModule.class));
-        assertSame(m, array[1]);
-    }
-
-    @Test
-    public void testProperties() {
-        Map<String, String> properties = Collections.singletonMap("test", "test_value");
-
-        runtime = new ClientRuntimeBuilder().properties(properties).build();
-
-        Map<String, String> injectedProperties = runtime.getInjector()
-                .getInstance(Key.getMapOf(String.class, String.class, Constants.PROPERTIES_MAP));
-        assertEquals(properties, injectedProperties);
-    }
-
-    @Test
-    public void testClientConnection() {
-
-        Map<String, String> properties1 = new HashMap<>();
-        properties1.put(ClientConstants.ROP_SERVICE_URL_PROPERTY, "http://localhost/YuM");
-        ClientModule module = new ClientModule(){
-
-            @Override
-            public void configure(Binder binder) {
-                super.configure(binder);
-                ServerModule.contributeProperties(binder).putAll(properties1);
-            }
-        };
-
-
-        Injector injector = DIBootstrap.createInjector(module);
-
-        ClientConnection connection = injector.getInstance(ClientConnection.class);
-        assertNotNull(connection);
-        assertTrue(connection instanceof HttpClientConnection);
-
-        assertSame("Connection must be a singleton", connection, injector
-                .getInstance(ClientConnection.class));
-    }
-
-    @Test
-    public void testDataChannel_NoChannelEvents() {
-
-        Map<String, String> properties1 = new HashMap<>();
-        properties1.put(ClientConstants.ROP_CHANNEL_EVENTS_PROPERTY, "true");
-        ClientModule module = new ClientModule() {
-
-            @Override
-            public void configure(Binder binder) {
-                super.configure(binder);
-
-                // use a noop connection to prevent startup errors...
-                binder.bind(ClientConnection.class).to(MockClientConnection.class);
-
-                ServerModule.contributeProperties(binder).putAll(properties1);
-            }
-        };
-
-        Injector injector = DIBootstrap.createInjector(module);
-
-        DataChannel channel = injector.getInstance(DataChannel.class);
-        ClientChannel clientChannel = (ClientChannel) channel;
-        assertTrue(clientChannel.isChannelEventsEnabled());
-    }
-}
\ No newline at end of file
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeTest.java b/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeTest.java
deleted file mode 100644
index 736671a16..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/ClientRuntimeTest.java
+++ /dev/null
@@ -1,118 +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
- *
- *    https://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.configuration.rop.client;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.cayenne.CayenneContext;
-import org.apache.cayenne.DataChannel;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.configuration.Constants;
-import org.apache.cayenne.configuration.server.ServerModule;
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.event.DefaultEventManager;
-import org.apache.cayenne.event.EventManager;
-import org.apache.cayenne.remote.ClientChannel;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.remote.MockClientConnection;
-import org.junit.Test;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-@SuppressWarnings("deprecation")
-public class ClientRuntimeTest {
-
-    @Test
-	public void testGetObjectContext() {
-
-		Map<String, String> properties = new HashMap<>();
-		ClientModule extraModule = new ClientModule() {
-
-			@Override
-			public void configure(Binder binder) {
-				super.configure(binder);
-
-				// use a noop connection to prevent startup errors...
-				binder.bind(ClientConnection.class).to(MockClientConnection.class);
-			}
-		};
-
-		ClientRuntime runtime = ClientRuntime.builder()
-								.properties(properties)
-								.addModule(extraModule)
-								.build();
-
-		ObjectContext context = runtime.newContext();
-		assertNotNull(context);
-		assertTrue(context instanceof CayenneContext);
-		assertNotSame("ObjectContext must not be a singleton", context, runtime.newContext());
-
-		CayenneContext clientContext = (CayenneContext) context;
-		assertNotNull(clientContext.getChannel());
-		assertSame(runtime.getChannel(), clientContext.getChannel());
-	}
-
-    @Test
-	public void testGetDataChannel() {
-
-		Map<String, String> properties = new HashMap<>();
-
-		Module extraModule = binder ->
-            // use a noop connection to prevent hessian startup errors...
-            binder.bind(ClientConnection.class).to(MockClientConnection.class);
-
-
-		ClientRuntime runtime = ClientRuntime.builder()
-								.properties(properties)
-								.addModule(extraModule)
-								.build();
-
-		DataChannel channel = runtime.getChannel();
-		assertNotNull(channel);
-		assertTrue(channel instanceof ClientChannel);
-	}
-
-    @Test
-	public void testShutdown() throws Exception {
-
-		Map<String, String> properties = new HashMap<>();
-		ClientRuntime runtime = ClientRuntime.builder()
-								.properties(properties)
-								.addModule(binder -> ServerModule.contributeProperties(binder)
-										.put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, String.valueOf(true)))
-								.build();
-
-		// make sure objects to be shut down are resolved
-
-		EventManager em = runtime.getInjector().getInstance(EventManager.class);
-		assertNotNull(em);
-		assertTrue(em instanceof DefaultEventManager);
-		assertFalse(((DefaultEventManager) em).isStopped());
-
-		runtime.getInjector().shutdown();
-
-		assertTrue(((DefaultEventManager) em).isStopped());
-	}
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/MainCayenneClientModuleProviderTest.java b/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/MainCayenneClientModuleProviderTest.java
deleted file mode 100644
index a17688b6f..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/configuration/rop/client/MainCayenneClientModuleProviderTest.java
+++ /dev/null
@@ -1,35 +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
- *
- *    https://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.configuration.rop.client;
-
-import org.apache.cayenne.unit.util.ModuleProviderChecker;
-import org.junit.Test;
-
-/**
- * @since 4.0
- */
-public class MainCayenneClientModuleProviderTest {
-
-    @Test
-    public void testAutoLoadable() {
-        ModuleProviderChecker.testProviderPresent(MainCayenneClientModuleProvider.class, CayenneClientModuleProvider.class);
-    }
-
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/event/EventSubjectTest.java b/cayenne-client/src/test/java/org/apache/cayenne/event/EventSubjectTest.java
deleted file mode 100644
index 799f2176d..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/event/EventSubjectTest.java
+++ /dev/null
@@ -1,40 +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
- *
- *    https://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.event;
-
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-
-public class EventSubjectTest {
-
-    @Test
-    public void testEqualityOfClonedSubjectsHessian() throws Exception {
-        EventSubject s1 = EventSubject.getSubject(EventSubjectTest.class, "MySubject");
-        EventSubject s2 = (EventSubject) HessianUtil.cloneViaClientServerSerialization(s1, new EntityResolver());
-
-        assertNotSame(s1, s2);
-        assertEquals(s1, s2);
-        assertEquals(s1.hashCode(), s2.hashCode());
-    }
-
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/graph/NodeDiffTest.java b/cayenne-client/src/test/java/org/apache/cayenne/graph/NodeDiffTest.java
deleted file mode 100644
index 70f7109e5..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/graph/NodeDiffTest.java
+++ /dev/null
@@ -1,58 +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
- *
- *    https://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.graph;
-
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-public class NodeDiffTest {
-
-	@Test
-	public void testHessianSerialization() throws Exception {
-
-		// id must be a serializable object...
-		String id = "abcd";
-		NodeDiff diff = new ConcreteNodeDiff(id);
-
-		Object d = HessianUtil.cloneViaClientServerSerialization(diff, new EntityResolver());
-		assertNotNull(d);
-		assertNotNull(((NodeDiff) d).getNodeId());
-		assertEquals(id, ((NodeDiff) d).getNodeId());
-	}
-
-	@SuppressWarnings("serial")
-	static class ConcreteNodeDiff extends NodeDiff {
-
-		ConcreteNodeDiff(Object id) {
-			super(id);
-		}
-
-		@Override
-		public void apply(GraphChangeHandler tracker) {
-		}
-
-		@Override
-		public void undo(GraphChangeHandler tracker) {
-		}
-	}
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/map/ClientEntityResolverTest.java b/cayenne-client/src/test/java/org/apache/cayenne/map/ClientEntityResolverTest.java
deleted file mode 100644
index a6ac129d9..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/map/ClientEntityResolverTest.java
+++ /dev/null
@@ -1,66 +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
- *
- *    https://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.map;
-
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.junit.Test;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
-
-public class ClientEntityResolverTest {
-
-    @Test
-    public void testSerializabilityWithHessian() throws Exception {
-        ObjEntity entity = new ObjEntity("test_entity");
-        entity.setClassName(Artist.class.getName());
-
-        DataMap dataMap = new DataMap("test");
-        dataMap.addObjEntity(entity);
-        Collection<DataMap> maps = Collections.singleton(dataMap);
-        EntityResolver resolver = new EntityResolver(maps);
-
-        // 1. simple case
-        Object c1 = HessianUtil.cloneViaClientServerSerialization(resolver, new EntityResolver());
-
-        assertNotNull(c1);
-        assertTrue(c1 instanceof EntityResolver);
-        EntityResolver cr1 = (EntityResolver) c1;
-
-        assertNotSame(resolver, cr1);
-        assertEquals(1, cr1.getObjEntities().size());
-        assertNotNull(cr1.getObjEntity(entity.getName()));
-
-        // 2. with descriptors resolved...
-        assertNotNull(resolver.getClassDescriptor(entity.getName()));
-
-        EntityResolver cr2 = (EntityResolver) HessianUtil.cloneViaClientServerSerialization(resolver,
-                new EntityResolver());
-        assertNotNull(cr2);
-        assertEquals(1, cr2.getObjEntities().size());
-        assertNotNull(cr2.getObjEntity(entity.getName()));
-        assertNotNull(cr2.getClassDescriptor(entity.getName()));
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/map/ClientObjectRelationshipTest.java b/cayenne-client/src/test/java/org/apache/cayenne/map/ClientObjectRelationshipTest.java
deleted file mode 100644
index 00dc6227d..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/map/ClientObjectRelationshipTest.java
+++ /dev/null
@@ -1,48 +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
- *
- *    https://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.map;
-
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-public class ClientObjectRelationshipTest {
-
-    @Test
-    public void testSerializabilityViaHessian() throws Exception {
-
-        ClientObjRelationship r1 = new ClientObjRelationship("r1", "rr1", true, true);
-        ClientObjRelationship r2 = (ClientObjRelationship) HessianUtil.cloneViaClientServerSerialization(r1,
-                new EntityResolver());
-        assertEquals(r1.getName(), r2.getName());
-        assertEquals(r1.getReverseRelationship(), r2.getReverseRelationship());
-        assertEquals(r1.isToMany(), r2.isToMany());
-        assertEquals(r1.isReadOnly(), r2.isReadOnly());
-
-        ClientObjRelationship r3 = new ClientObjRelationship("r3", null, false, false);
-        ClientObjRelationship r4 = (ClientObjRelationship) HessianUtil.cloneViaClientServerSerialization(r3,
-                new EntityResolver());
-        assertEquals(r3.getName(), r4.getName());
-        assertNull(r4.getReverseRelationship());
-        assertEquals(r3.isToMany(), r4.isToMany());
-        assertEquals(r3.isReadOnly(), r4.isReadOnly());
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/map/DataMapTest.java b/cayenne-client/src/test/java/org/apache/cayenne/map/DataMapTest.java
deleted file mode 100644
index b59a850f8..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/map/DataMapTest.java
+++ /dev/null
@@ -1,42 +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
- *
- *    https://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.map;
-
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.apache.cayenne.util.Util;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-public class DataMapTest {
-
-    @Test
-    public void testSerializabilityWithHessian() throws Exception {
-        DataMap m1 = new DataMap("abc");
-        DataMap d1 = (DataMap) HessianUtil.cloneViaClientServerSerialization(m1, new EntityResolver());
-        assertEquals(m1.getName(), d1.getName());
-
-        ObjEntity oe1 = new ObjEntity("oe1");
-        m1.addObjEntity(oe1);
-
-        DataMap d2 = (DataMap) Util.cloneViaSerialization(m1);
-        assertNotNull(d2.getObjEntity(oe1.getName()));
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/map/DbEntityTest.java b/cayenne-client/src/test/java/org/apache/cayenne/map/DbEntityTest.java
deleted file mode 100644
index 16a2d0873..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/map/DbEntityTest.java
+++ /dev/null
@@ -1,58 +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
- *
- *    https://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.map;
-
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-public class DbEntityTest {
-
-    @Test
-    public void testSerializabilityWithHessian() throws Exception {
-        DbEntity entity = new DbEntity("entity");
-
-        DbAttribute pk = new DbAttribute("pk");
-        pk.setPrimaryKey(true);
-        entity.addAttribute(pk);
-
-        DbAttribute generated = new DbAttribute("generated");
-        generated.setGenerated(true);
-        entity.addAttribute(generated);
-
-        DbEntity d2 = (DbEntity) HessianUtil.cloneViaClientServerSerialization(entity, new EntityResolver());
-
-        assertNotNull(d2.getPrimaryKeys());
-        assertEquals(entity.getPrimaryKeys().size(), d2.getPrimaryKeys().size());
-
-        DbAttribute pk2 = d2.getAttribute(pk.getName());
-        assertNotNull(pk2);
-        assertTrue(d2.getPrimaryKeys().contains(pk2));
-
-        assertNotNull(d2.getGeneratedAttributes());
-        assertEquals(entity.getGeneratedAttributes().size(), d2.getGeneratedAttributes().size());
-
-        DbAttribute generated2 = d2.getAttribute(generated.getName());
-        assertNotNull(generated2);
-        assertTrue(d2.getGeneratedAttributes().contains(generated2));
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/map/EntityTest.java b/cayenne-client/src/test/java/org/apache/cayenne/map/EntityTest.java
deleted file mode 100644
index ef6a302b7..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/map/EntityTest.java
+++ /dev/null
@@ -1,65 +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
- *
- *    https://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.map;
-
-import org.apache.cayenne.remote.hessian.service.HessianUtil;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-public class EntityTest {
-
-    @Test
-    public void testSerializabilityWithHessian() throws Exception {
-        Entity entity = new MockEntity("entity");
-
-        Entity d1 = (Entity) HessianUtil.cloneViaClientServerSerialization(
-                entity,
-                new EntityResolver());
-        assertEquals(entity.getName(), d1.getName());
-
-        entity.addAttribute(new MockAttribute("abc"));
-        entity.addRelationship(new MockRelationship("xyz"));
-        Entity d2 = (Entity) HessianUtil.cloneViaClientServerSerialization(
-                entity,
-                new EntityResolver());
-        assertNotNull(d2.getAttribute("abc"));
-        assertNotNull(d2.getRelationship("xyz"));
-
-        // test that ref collection wrappers are still working
-        assertNotNull(d2.getAttributes());
-        assertEquals(entity.getAttributes().size(), d2.getAttributes().size());
-        assertTrue(d2.getAttributes().contains(d2.getAttribute("abc")));
-
-        assertNotNull(d2.getRelationships());
-        assertEquals(entity.getRelationships().size(), d2.getRelationships().size());
-        assertTrue(d2.getAttributes().contains(d2.getAttribute("abc")));
-
-        assertNotNull(d2.getAttributeMap());
-        assertEquals(entity.getAttributes().size(), d2.getAttributeMap().size());
-        assertSame(d2.getAttribute("abc"), d2.getAttributeMap().get("abc"));
-
-        assertNotNull(d2.getRelationshipMap());
-        assertEquals(entity.getRelationships().size(), d2.getRelationshipMap().size());
-        assertSame(d2.getRelationship("xyz"), d2.getRelationshipMap().get("xyz"));
-    }
-}
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/query/ClientExpressionIT.java b/cayenne-client/src/test/java/org/apache/cayenne/query/ClientExpressionIT.java
deleted file mode 100644
index 9681b2aa7..000000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/query/ClientExpressionIT.java
+++ /dev/null
@@ -1,346 +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
- *
- *    https://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.query;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.cayenne.CayenneContext;
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.exp.parser.ASTEqual;
-import org.apache.cayenne.exp.parser.ASTList;
-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.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-
-@UseServerRuntime(CayenneProjects.MULTI_TIER_PROJECT)
-public class ClientExpressionIT extends ClientCase {
-
-    @Inject
-    private CayenneContext context;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tMtTable1;
-    private TableHelper tMtTable2;
-
-    @Before
-    public void setUp() throws Exception {
-        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 createDataSet() throws Exception {
-        for(int i = 1; i <= 10; i++) {
-            tMtTable1.insert(i ,"1_global" + i, "server" + i);
-            tMtTable2.insert(i , i, "2_global" + i);
-            tMtTable2.insert(i + 10, i, "2_global" + (i + 10));
-        }
-    }
-
-    @Test
-    public void testPersistentValueInExpression() {
-        ClientMtTable1 t1 = context.newObject(ClientMtTable1.class);
-        ClientMtTable1 t2 = context.newObject(ClientMtTable1.class);
-
-        context.commitChanges();
-
-        Expression scalar = ExpressionFactory.matchExp((String)null, t1);
-        Expression list = ExpressionFactory.matchAllExp("|", Arrays.asList(t1, t2));
-
-        assertEquals(t1.getObjectId(), scalar.getOperand(1));
-        assertEquals(t1.getObjectId(), ((ASTEqual)list.getOperand(0)).getOperand(1));
-        assertEquals(t2.getObjectId(), ((ASTEqual)list.getOperand(1)).getOperand(1));
-    }
-
-    @Test
-    public void testListInASTList() {
-        ClientMtTable1 t1 = context.newObject(ClientMtTable1.class);
-        ClientMtTable1 t2 = context.newObject(ClientMtTable1.class);
-
-        context.commitChanges();
-
-        List<ClientMtTable1> table1List = new ArrayList<>();
-        table1List.add(t1);
-        table1List.add(t2);
-
-        // send list in expression factory
-        Expression list = ClientMtTable2.TABLE1.in(table1List);
-
-        Object[] values = (Object[])((ASTList)list.getOperand(1)).getOperand(0);
-        assertEquals(t1.getObjectId(), values[0]);
-        assertEquals(t2.getObjectId(), values[1]);
-
-        ObjectId t1Id = ObjectId.of("MtTable1", "TABLE1_ID", 1);
-        ObjectId t2Id = ObjectId.of("MtTable1", "TABLE1_ID", 2);
-        t1.setObjectId(t1Id);
-        t2.setObjectId(t2Id);
-
-        //Expression and client have different copies of object
-        assertNotSame(t1.getObjectId(), values[0]);
-        assertNotSame(t2.getObjectId(), values[1]);
-    }
-
-    @Test
-    public void testArrayInASTList() {
-        ClientMtTable1 t1 = context.newObject(ClientMtTable1.class);
-        ClientMtTable1 t2 = context.newObject(ClientMtTable1.class);
-        ClientMtTable1 t3 = context.newObject(ClientMtTable1.class);
-
-        context.commitChanges();
-
-        Object[] tArray = new Object[3];
-        tArray[0] = t1;
-        tArray[1] = t2;
-
-        // send array in expression factory
-        Expression list = ExpressionFactory.inExp(ClientMtTable2.TABLE1.getName(), tArray);
-        tArray[2] = t3;
-
-        Object[] values = (Object[])((ASTList)list.getOperand(1)).getOperand(0);
-        assertEquals(tArray.length, values.length);
-        assertNotSame(tArray[2], values[2]);
-        assertEquals(t1.getObjectId(), values[0]);
-        assertEquals(t2.getObjectId(), values[1]);
-
-        ObjectId t1Id = ObjectId.of("MtTable1", "TABLE1_ID", 1);
-        ObjectId t2Id = ObjectId.of("MtTable1", "TABLE1_ID", 2);
-        t1.setObjectId(t1Id);
-        t2.setObjectId(t2Id);
-
-        // Expression and client have different arrays
-        assertNotSame(t1.getObjectId(), values[0]);
-        assertNotSame(t2.getObjectId(), values[1]);
-    }
-
-    @Test
-    public void testExpressionFactoryMatch() throws Exception {
-        createDataSet();
-
-        ObjectSelect<ClientMtTable1> table1Query = ObjectSelect.query(ClientMtTable1.class)
-                .orderBy(new Ordering("db:TABLE1_ID", SortOrder.ASCENDING));
-        List<ClientMtTable1> table1List = table1Query.select(context);
-
-        assertNotNull(table1List);
-
-        ClientMtTable1 element_1 = table1List.get(0);
-        ClientMtTable1 element_2 = table1List.get(1);
-
-        Expression exp = ClientMtTable2.TABLE1.eq(element_1);
-        ObjectSelect<ClientMtTable2> table2Query = ObjectSelect.query(ClientMtTable2.class)
-                .where(exp);
-        List<ClientMtTable2> table2List = table2Query.select(context);
-
-        assertNotNull(table2List);
-        assertEquals(2, table2List.size());
-
-        exp = ExpressionFactory.matchExp(element_2);
-        table2Query = ObjectSelect.query(ClientMtTable2.class)
-                .where(exp);
-        table2List = context.select(table2Query);
-
-        assertNotNull(table2List);
-        assertEquals(2, table2List.size());
-    }
-
-    @Test
-    public void testExpressionFactoryMatchAll() throws Exception {
-        createDataSet();
-
-        ObjectSelect<ClientMtTable2> table2Query = ObjectSelect.query(ClientMtTable2.class)
-                .orderBy(new Ordering("db:TABLE2_ID", SortOrder.ASCENDING));
-        List<ClientMtTable2> table2List = context.select(table2Query);
-
-        ClientMtTable2 element_1 = table2List.get(0);
-        ClientMtTable2 element_2 = table2List.get(10);
-
-        assertEquals(element_1.getTable1(), element_2.getTable1());
-
-        Expression exp = ExpressionFactory.matchAllExp("|" + ClientMtTable1.TABLE2ARRAY.getName(), Arrays.asList(element_1, element_2));
-        ObjectSelect<ClientMtTable1> table1Query = ObjectSelect.query(ClientMtTable1.class)
-                .where(exp);
-        List<ClientMtTable1> table1List = table1Query.select(context);
-
-        assertEquals(1, table1List.size());
-    }
-
-    @Test
-    public void testExpressionFactoryMatchAny() throws Exception {
-        createDataSet();
-
-        ObjectSelect<ClientMtTable2> table2Query = ObjectSelect.query(ClientMtTable2.class)
-                .orderBy(new Ordering("db:TABLE2_ID", SortOrder.ASCENDING));
-        List<ClientMtTable2> table2List = context.select(table2Query);
-
-        ClientMtTable2 element_1 = table2List.get(0);
-        ClientMtTable2 element_2 = table2List.get(10);
-
-        Expression exp = ExpressionFactory.matchAnyExp(element_1, element_2);
-        table2Query = ObjectSelect.query(ClientMtTable2.class)
-                .where(exp);
-        table2List = context.select(table2Query);
-
-        assertEquals(2, table2List.size());
-    }
-
-    @Test
-    public void testExpressionFactoryIn() throws Exception {
-        createDataSet();
-
-        ObjectSelect<ClientMtTable1> table1Query = ObjectSelect.query(ClientMtTable1.class)
-                .orderBy(new Ordering("db:TABLE1_ID", SortOrder.ASCENDING));
-        List<ClientMtTable1> table1List = context.select(table1Query);
-
-        ClientMtTable1 element_3 = table1List.get(2);
-        ClientMtTable1 element_8 = table1List.get(7);
-
-        // IN expression via Collection
-        Expression exp = ExpressionFactory.inExp(ClientMtTable2.TABLE1.getName(), table1List.subList(3, 6));
-        ObjectSelect<ClientMtTable2> table2Query = ObjectSelect.query(ClientMtTable2.class)
-                .where(exp);
-        List<ClientMtTable2> table2List = context.select(table2Query);
-
-        assertEquals(6, table2List.size());
-
-        // IN expression via Array
-        exp = ExpressionFactory.inExp(ClientMtTable2.TABLE1.getName(), element_3, element_8);
-        table2Query = ObjectSelect.query(ClientMtTable2.class)
-                .where(exp);
-        table2List = context.select(table2Query);
-
-        assertEquals(4, table2List.size());
-    }
-
-    @Test
-    public void testExpressionFactoryBetween() throws Exception {
-        createDataSet();
-
-        ObjectSelect<ClientMtTable1> table1Query = ObjectSelect.query(ClientMtTable1.class)
-                .orderBy(new Ordering("db:TABLE1_ID", SortOrder.ASCENDING));
... 13052 lines suppressed ...


[cayenne] 04/05: CAY-2744 Remove ROP support - drop unused dependencies

Posted by nt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 0280cd257dbdd42a637ccf8f7c2fe0d2d25b9028
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Jul 7 18:39:20 2022 +0300

    CAY-2744 Remove ROP support
     - drop unused dependencies
---
 assembly/src/main/resources/assemblies/generic/assembly-generic.xml | 6 ------
 assembly/src/main/resources/assemblies/mac/assembly-mac.xml         | 6 ------
 assembly/src/main/resources/assemblies/windows/assembly-windows.xml | 6 ------
 docs/doc/pom.xml                                                    | 5 -----
 pom.xml                                                             | 6 ------
 5 files changed, 29 deletions(-)

diff --git a/assembly/src/main/resources/assemblies/generic/assembly-generic.xml b/assembly/src/main/resources/assemblies/generic/assembly-generic.xml
index a041e8fc6..5d9b2b7e8 100644
--- a/assembly/src/main/resources/assemblies/generic/assembly-generic.xml
+++ b/assembly/src/main/resources/assemblies/generic/assembly-generic.xml
@@ -33,8 +33,6 @@
 			<outputDirectory>tutorials</outputDirectory>
 			<includes>
 				<include>tutorial/**</include>
-				<include>tutorial-rop-server/**</include>
-				<include>tutorial-rop-client/**</include>
 			</includes>
 			<excludes>
 				<exclude>**/.gradle/**</exclude>
@@ -72,8 +70,6 @@
 				<include>org.apache.cayenne:cayenne-ant</include>
 				<include>org.apache.cayenne:cayenne-cache-invalidation</include>
 				<include>org.apache.cayenne:cayenne-cgen</include>
-				<include>org.apache.cayenne:cayenne-client</include>
-				<include>org.apache.cayenne:cayenne-client-jetty</include>
 				<include>org.apache.cayenne:cayenne-commitlog</include>
 				<include>org.apache.cayenne:cayenne-crypto</include>
 				<include>org.apache.cayenne:cayenne-dbsync</include>
@@ -83,8 +79,6 @@
 				<include>org.apache.cayenne:cayenne-osgi</include>
 				<include>org.apache.cayenne:cayenne-project</include>
 				<include>org.apache.cayenne:cayenne-project-compatibility</include>
-				<include>org.apache.cayenne:cayenne-protostuff</include>
-				<include>org.apache.cayenne:cayenne-rop-server</include>
 				<include>org.apache.cayenne:cayenne-server</include>
 				<include>org.apache.cayenne:cayenne-velocity</include>
 				<include>org.apache.cayenne:cayenne-web</include>
diff --git a/assembly/src/main/resources/assemblies/mac/assembly-mac.xml b/assembly/src/main/resources/assemblies/mac/assembly-mac.xml
index 55d3de1fd..149d2d09b 100644
--- a/assembly/src/main/resources/assemblies/mac/assembly-mac.xml
+++ b/assembly/src/main/resources/assemblies/mac/assembly-mac.xml
@@ -33,8 +33,6 @@
 			<outputDirectory>${content.dir}/tutorials/</outputDirectory>
 			<includes>
 				<include>tutorial/**</include>
-				<include>tutorial-rop-server/**</include>
-				<include>tutorial-rop-client/**</include>
 			</includes>
 			<excludes>
 				<exclude>**/target/**</exclude>
@@ -70,8 +68,6 @@
 				<include>org.apache.cayenne:cayenne-ant</include>
 				<include>org.apache.cayenne:cayenne-cache-invalidation</include>
 				<include>org.apache.cayenne:cayenne-cgen</include>
-				<include>org.apache.cayenne:cayenne-client</include>
-				<include>org.apache.cayenne:cayenne-client-jetty</include>
 				<include>org.apache.cayenne:cayenne-commitlog</include>
 				<include>org.apache.cayenne:cayenne-crypto</include>
 				<include>org.apache.cayenne:cayenne-dbsync</include>
@@ -81,8 +77,6 @@
 				<include>org.apache.cayenne:cayenne-osgi</include>
 				<include>org.apache.cayenne:cayenne-project</include>
 				<include>org.apache.cayenne:cayenne-project-compatibility</include>
-				<include>org.apache.cayenne:cayenne-protostuff</include>
-				<include>org.apache.cayenne:cayenne-rop-server</include>
 				<include>org.apache.cayenne:cayenne-server</include>
 				<include>org.apache.cayenne:cayenne-velocity</include>
 				<include>org.apache.cayenne:cayenne-web</include>
diff --git a/assembly/src/main/resources/assemblies/windows/assembly-windows.xml b/assembly/src/main/resources/assemblies/windows/assembly-windows.xml
index 47cee20c6..f175c370b 100644
--- a/assembly/src/main/resources/assemblies/windows/assembly-windows.xml
+++ b/assembly/src/main/resources/assemblies/windows/assembly-windows.xml
@@ -33,8 +33,6 @@
 			<outputDirectory>tutorials</outputDirectory>
 			<includes>
 				<include>tutorial/**</include>
-				<include>tutorial-rop-server/**</include>
-				<include>tutorial-rop-client/**</include>
 			</includes>
 			<excludes>
 				<exclude>**/target/**</exclude>
@@ -70,8 +68,6 @@
 				<include>org.apache.cayenne:cayenne-ant</include>
 				<include>org.apache.cayenne:cayenne-cache-invalidation</include>
 				<include>org.apache.cayenne:cayenne-cgen</include>
-				<include>org.apache.cayenne:cayenne-client</include>
-				<include>org.apache.cayenne:cayenne-client-jetty</include>
 				<include>org.apache.cayenne:cayenne-commitlog</include>
 				<include>org.apache.cayenne:cayenne-crypto</include>
 				<include>org.apache.cayenne:cayenne-dbsync</include>
@@ -81,8 +77,6 @@
 				<include>org.apache.cayenne:cayenne-osgi</include>
 				<include>org.apache.cayenne:cayenne-project</include>
 				<include>org.apache.cayenne:cayenne-project-compatibility</include>
-				<include>org.apache.cayenne:cayenne-protostuff</include>
-				<include>org.apache.cayenne:cayenne-rop-server</include>
 				<include>org.apache.cayenne:cayenne-server</include>
 				<include>org.apache.cayenne:cayenne-velocity</include>
 				<include>org.apache.cayenne:cayenne-web</include>
diff --git a/docs/doc/pom.xml b/docs/doc/pom.xml
index 199987a6b..551690549 100644
--- a/docs/doc/pom.xml
+++ b/docs/doc/pom.xml
@@ -53,11 +53,6 @@
 			<version>${project.version}</version>
 		</dependency>
 
-		<dependency>
-			<groupId>com.caucho</groupId>
-            <artifactId>hessian</artifactId>
-		</dependency>
-
 		<dependency>
 			<groupId>foundrylogic.vpp</groupId>
 			<artifactId>vpp</artifactId>
diff --git a/pom.xml b/pom.xml
index f74911ac0..860d48776 100644
--- a/pom.xml
+++ b/pom.xml
@@ -336,12 +336,6 @@
                 <groupId>org.apache.commons</groupId>
                 <artifactId>commons-dbcp2</artifactId>
                 <version>2.2.0</version>
-            </dependency>
-            <dependency>
-                <groupId>com.caucho</groupId>
-                <artifactId>hessian</artifactId>
-                <version>4.0.63</version>
-                <scope>provided</scope>
             </dependency>
 			<dependency>
 				<groupId>com.jgoodies</groupId>


[cayenne] 03/05: CAY-2744 Remove ROP support - delete ROP tutorials

Posted by nt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit c1247afd2b60d02f0cf86a9ed7b4ecd24871dd6e
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Jul 7 18:26:02 2022 +0300

    CAY-2744 Remove ROP support
     - delete ROP tutorials
---
 tutorials/pom.xml                                  |   4 -
 tutorials/tutorial-rop-client-http2/pom.xml        |  50 --------
 .../org/apache/cayenne/tutorial/Http2Client.java   | 127 --------------------
 .../cayenne/tutorial/persistent/client/Artist.java |  31 -----
 .../tutorial/persistent/client/Gallery.java        |  31 -----
 .../tutorial/persistent/client/Painting.java       |  31 -----
 .../tutorial/persistent/client/auto/_Artist.java   |  93 --------------
 .../tutorial/persistent/client/auto/_Gallery.java  |  72 -----------
 .../tutorial/persistent/client/auto/_Painting.java |  86 -------------
 .../src/main/resources/keystore                    | Bin 3697 -> 0 bytes
 tutorials/tutorial-rop-client/pom.xml              |  57 ---------
 .../cayenne/tutorial/persistent/client/Artist.java |  28 -----
 .../tutorial/persistent/client/Datamap.java        |  36 ------
 .../tutorial/persistent/client/Gallery.java        |  28 -----
 .../cayenne/tutorial/persistent/client/Main.java   |  98 ---------------
 .../tutorial/persistent/client/Painting.java       |  28 -----
 .../tutorial/persistent/client/auto/_Artist.java   |  93 --------------
 .../tutorial/persistent/client/auto/_Datamap.java  |  12 --
 .../tutorial/persistent/client/auto/_Gallery.java  |  72 -----------
 .../tutorial/persistent/client/auto/_Painting.java |  86 -------------
 .../src/main/resources/.gitignore                  |   0
 .../tutorial-rop-client/src/test/java/.gitignore   |   0
 .../src/test/resources/.gitignore                  |   0
 tutorials/tutorial-rop-server-http2/pom.xml        |  73 -----------
 .../apache/cayenne/tutorial/Http2ROPServlet.java   |  66 ----------
 .../org/apache/cayenne/tutorial/Http2Server.java   | 114 ------------------
 .../apache/cayenne/tutorial/persistent/Artist.java |  28 -----
 .../cayenne/tutorial/persistent/Gallery.java       |  28 -----
 .../cayenne/tutorial/persistent/Painting.java      |  28 -----
 .../cayenne/tutorial/persistent/auto/_Artist.java  | 133 ---------------------
 .../cayenne/tutorial/persistent/auto/_Gallery.java | 112 -----------------
 .../tutorial/persistent/auto/_Painting.java        | 124 -------------------
 .../cayenne/tutorial/persistent/client/Artist.java |  31 -----
 .../tutorial/persistent/client/Gallery.java        |  31 -----
 .../tutorial/persistent/client/Painting.java       |  31 -----
 .../tutorial/persistent/client/auto/_Artist.java   |  93 --------------
 .../tutorial/persistent/client/auto/_Gallery.java  |  72 -----------
 .../tutorial/persistent/client/auto/_Painting.java |  84 -------------
 .../src/main/resources/cayenne-project.xml         |  18 ---
 .../src/main/resources/datamap.map.xml             |  50 --------
 .../src/main/resources/keystore                    | Bin 3697 -> 0 bytes
 tutorials/tutorial-rop-server/pom.xml              |  76 ------------
 tutorials/tutorial-rop-server/realm.properties     |  16 ---
 .../apache/cayenne/tutorial/persistent/Artist.java |  50 --------
 .../cayenne/tutorial/persistent/Datamap.java       |  36 ------
 .../cayenne/tutorial/persistent/Gallery.java       |  25 ----
 .../cayenne/tutorial/persistent/Painting.java      |  25 ----
 .../cayenne/tutorial/persistent/auto/_Artist.java  | 133 ---------------------
 .../cayenne/tutorial/persistent/auto/_Datamap.java |  12 --
 .../cayenne/tutorial/persistent/auto/_Gallery.java | 112 -----------------
 .../tutorial/persistent/auto/_Painting.java        | 124 -------------------
 .../cayenne/tutorial/persistent/client/Artist.java |  28 -----
 .../tutorial/persistent/client/Datamap.java        |  36 ------
 .../tutorial/persistent/client/Gallery.java        |  28 -----
 .../tutorial/persistent/client/Painting.java       |  28 -----
 .../tutorial/persistent/client/auto/_Artist.java   |  93 --------------
 .../tutorial/persistent/client/auto/_Datamap.java  |  12 --
 .../tutorial/persistent/client/auto/_Gallery.java  |  72 -----------
 .../tutorial/persistent/client/auto/_Painting.java |  84 -------------
 .../src/main/resources/cayenne-project.xml         |  18 ---
 .../src/main/resources/datamap.map.xml             |  50 --------
 .../src/main/webapp/META-INF/context.xml           |  23 ----
 .../src/main/webapp/WEB-INF/web.xml                |  53 --------
 .../tutorial-rop-server/src/test/java/.gitignore   |   0
 .../src/test/resources/.gitignore                  |   0
 65 files changed, 3313 deletions(-)

diff --git a/tutorials/pom.xml b/tutorials/pom.xml
index f9f951559..a471c0795 100644
--- a/tutorials/pom.xml
+++ b/tutorials/pom.xml
@@ -32,10 +32,6 @@
 
 	<modules>
 		<module>tutorial</module>
-		<module>tutorial-rop-client</module>
-		<module>tutorial-rop-client-http2</module>
-		<module>tutorial-rop-server</module>
-		<module>tutorial-rop-server-http2</module>
 	</modules>
 
 	<properties>
diff --git a/tutorials/tutorial-rop-client-http2/pom.xml b/tutorials/tutorial-rop-client-http2/pom.xml
deleted file mode 100644
index c750654e6..000000000
--- a/tutorials/tutorial-rop-client-http2/pom.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-	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
-	https://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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <artifactId>cayenne-tutorials-parent</artifactId>
-        <groupId>org.apache.cayenne.tutorials</groupId>
-        <version>4.3.M1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>tutorial-rop-client-http2</artifactId>
-    <name>tutorial-rop-client-http2: Cayenne ROP HTTP/2 Client Tutorial</name>
-    <packaging>jar</packaging>
-
-    <properties>
-        <main.class>org.apache.cayenne.tutorial.Http2Client</main.class>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.cayenne</groupId>
-            <artifactId>cayenne-client-jetty</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cayenne</groupId>
-            <artifactId>cayenne-protostuff</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-simple</artifactId>
-            <scope>compile</scope>
-        </dependency>
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/Http2Client.java b/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/Http2Client.java
deleted file mode 100644
index 26462d703..000000000
--- a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/Http2Client.java
+++ /dev/null
@@ -1,127 +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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.tutorial;
-
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.configuration.rop.client.ClientConstants;
-import org.apache.cayenne.configuration.rop.client.ClientJettyHttp2Module;
-import org.apache.cayenne.configuration.rop.client.ClientRuntime;
-import org.apache.cayenne.configuration.rop.client.ProtostuffModule;
-import org.apache.cayenne.query.ObjectSelect;
-import org.apache.cayenne.rop.JettyHttp2ClientConnectionProvider;
-import org.apache.cayenne.rop.http.JettyHttpROPConnector;
-import org.apache.cayenne.rop.protostuff.ProtostuffROPSerializationService;
-import org.apache.cayenne.tutorial.persistent.client.Artist;
-import org.apache.cayenne.tutorial.persistent.client.Gallery;
-import org.apache.cayenne.tutorial.persistent.client.Painting;
-
-import javax.net.ssl.HttpsURLConnection;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This example uses {@link ProtostuffROPSerializationService} which is bound in {@link ProtostuffModule}
- * and {@link JettyHttpROPConnector} initialized by {@link JettyHttp2ClientConnectionProvider}, which is bound
- * in {@link ClientJettyHttp2Module}. It works without ALPN by default.
- * <p>
- * In order to run it with ALPN, you have to set {@link ClientConstants#ROP_SERVICE_USE_ALPN_PROPERTY} to true
- * and provide the alpn-boot-XXX.jar into the bootstrap classpath.
- */
-public class Http2Client {
-
-    public static void main(String[] args) throws Exception {
-        HttpsURLConnection.setDefaultHostnameVerifier((hostname, sslSession) -> hostname.equals("localhost"));
-        System.setProperty("javax.net.ssl.trustStore", Http2Client.class.getResource("/keystore").getPath());
-
-        // Setting Protostuff properties
-        System.setProperty("protostuff.runtime.collection_schema_on_repeated_fields", "true");
-        System.setProperty("protostuff.runtime.morph_collection_interfaces", "true");
-        System.setProperty("protostuff.runtime.morph_map_interfaces", "true");
-        System.setProperty("protostuff.runtime.pojo_schema_on_collection_fields", "true");
-        System.setProperty("protostuff.runtime.pojo_schema_on_map_fields", "true");
-
-        Map<String, String> properties = new HashMap<>();
-        properties.put(ClientConstants.ROP_SERVICE_URL_PROPERTY, "https://localhost:8443/");
-        properties.put(ClientConstants.ROP_SERVICE_USE_ALPN_PROPERTY, "false");
-        properties.put(ClientConstants.ROP_SERVICE_USERNAME_PROPERTY, "cayenne-user");
-        properties.put(ClientConstants.ROP_SERVICE_PASSWORD_PROPERTY, "secret");
-        properties.put(ClientConstants.ROP_SERVICE_REALM_PROPERTY, "Cayenne Realm");
-
-        ClientRuntime runtime = ClientRuntime.builder()
-                            .properties(properties)
-                            .addModule(new ClientJettyHttp2Module())
-                            .build();
-
-        ObjectContext context = runtime.newContext();
-
-        newObjectsTutorial(context);
-        selectTutorial(context);
-        deleteTutorial(context);
-
-        runtime.shutdown();
-    }
-
-    static void newObjectsTutorial(ObjectContext context) {
-
-        // creating new Artist
-        Artist picasso = context.newObject(Artist.class);
-        picasso.setName("Pablo Picasso");
-
-        // Creating other objects
-        Gallery metropolitan = context.newObject(Gallery.class);
-        metropolitan.setName("Metropolitan Museum of Art");
-
-        Painting girl = context.newObject(Painting.class);
-        girl.setName("Girl Reading at a Table");
-
-        Painting stein = context.newObject(Painting.class);
-        stein.setName("Gertrude Stein");
-
-        // connecting objects together via relationships
-        picasso.addToPaintings(girl);
-        picasso.addToPaintings(stein);
-
-        girl.setGallery(metropolitan);
-        stein.setGallery(metropolitan);
-
-        // saving all the changes above
-        context.commitChanges();
-    }
-
-    static void selectTutorial(ObjectContext context) {
-        // ObjectSelect examples
-        List<Painting> paintings1 = ObjectSelect.query(Painting.class).select(context);
-
-        List<Painting> paintings2 = ObjectSelect.query(Painting.class)
-                .where(Painting.NAME.likeIgnoreCase("gi%")).select(context);
-    }
-
-    static void deleteTutorial(ObjectContext context) {
-        // Delete object example
-        Artist picasso = ObjectSelect.query(Artist.class).where(Artist.NAME.eq("Pablo Picasso")).selectOne(context);
-
-        if (picasso != null) {
-            context.deleteObjects(picasso);
-            context.commitChanges();
-        }
-    }
-}
diff --git a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java b/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
deleted file mode 100644
index 154987f9e..000000000
--- a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
+++ /dev/null
@@ -1,31 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Artist;
-
-/**
- * A persistent class mapped as "Artist" Cayenne entity.
- */
-public class Artist extends _Artist {
-
-     private static final long serialVersionUID = 1L; 
-     
-}
diff --git a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java b/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
deleted file mode 100644
index 95400a112..000000000
--- a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
+++ /dev/null
@@ -1,31 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Gallery;
-
-/**
- * A persistent class mapped as "Gallery" Cayenne entity.
- */
-public class Gallery extends _Gallery {
-
-     private static final long serialVersionUID = 1L; 
-     
-}
diff --git a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java b/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
deleted file mode 100644
index 768407449..000000000
--- a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
+++ /dev/null
@@ -1,31 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Painting;
-
-/**
- * A persistent class mapped as "Painting" Cayenne entity.
- */
-public class Painting extends _Painting {
-
-     private static final long serialVersionUID = 1L; 
-     
-}
diff --git a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java b/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
deleted file mode 100644
index 052709b71..000000000
--- a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import java.time.LocalDate;
-import java.util.List;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.exp.property.DateProperty;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Painting;
-import org.apache.cayenne.util.PersistentObjectList;
-
-/**
- * A generated persistent class mapped as "Artist" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Artist extends PersistentObject {
-
-    public static final DateProperty<LocalDate> DATE_OF_BIRTH = PropertyFactory.createDate("dateOfBirth", LocalDate.class);
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected LocalDate dateOfBirth;
-    protected String name;
-    protected List<Painting> paintings;
-
-    public LocalDate getDateOfBirth() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "dateOfBirth", false);
-        }
-
-        return dateOfBirth;
-    }
-
-    public void setDateOfBirth(LocalDate dateOfBirth) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "dateOfBirth", false);
-            objectContext.propertyChanged(this, "dateOfBirth", this.dateOfBirth, dateOfBirth);
-        }
-
-        this.dateOfBirth = dateOfBirth;
-    }
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public List<Painting> getPaintings() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        return paintings;
-    }
-
-    public void addToPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.add(object);
-    }
-
-    public void removeFromPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.remove(object);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java b/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
deleted file mode 100644
index 57ccb07ba..000000000
--- a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import java.util.List;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Painting;
-import org.apache.cayenne.util.PersistentObjectList;
-
-/**
- * A generated persistent class mapped as "Gallery" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Gallery extends PersistentObject {
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected String name;
-    protected List<Painting> paintings;
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public List<Painting> getPaintings() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        return paintings;
-    }
-
-    public void addToPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.add(object);
-    }
-
-    public void removeFromPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.remove(object);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java b/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
deleted file mode 100644
index d6a4db2d7..000000000
--- a/tutorials/tutorial-rop-client-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.ValueHolder;
-import org.apache.cayenne.exp.property.EntityProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Artist;
-import org.apache.cayenne.tutorial.persistent.client.Gallery;
-import org.apache.cayenne.util.PersistentObjectHolder;
-
-/**
- * A generated persistent class mapped as "Painting" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Painting extends PersistentObject {
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final EntityProperty<org.apache.cayenne.tutorial.persistent.client.Artist> ARTIST = PropertyFactory.createEntity("artist", org.apache.cayenne.tutorial.persistent.client.Artist.class);
-    public static final EntityProperty<org.apache.cayenne.tutorial.persistent.client.Gallery> GALLERY = PropertyFactory.createEntity("gallery", org.apache.cayenne.tutorial.persistent.client.Gallery.class);
-
-    protected String name;
-    protected ValueHolder<Artist> artist;
-    protected ValueHolder<Gallery> gallery;
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public Artist getArtist() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "artist", true);
-        } else if (this.artist == null) {
-        	this.artist = new PersistentObjectHolder<>(this, "artist");
-		}
-
-        return artist.getValue();
-    }
-
-    public void setArtist(Artist artist) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "artist", true);
-            objectContext.propertyChanged(this, "artist", this.artist.getValueDirectly(), artist);
-        } else if (this.artist == null) {
-        	this.artist = new PersistentObjectHolder<>(this, "artist");
-		}
-
-        this.artist.setValue(artist);
-    }
-
-    public Gallery getGallery() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "gallery", true);
-        } else if (this.gallery == null) {
-        	this.gallery = new PersistentObjectHolder<>(this, "gallery");
-		}
-
-        return gallery.getValue();
-    }
-
-    public void setGallery(Gallery gallery) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "gallery", true);
-            objectContext.propertyChanged(this, "gallery", this.gallery.getValueDirectly(), gallery);
-        } else if (this.gallery == null) {
-        	this.gallery = new PersistentObjectHolder<>(this, "gallery");
-		}
-
-        this.gallery.setValue(gallery);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-client-http2/src/main/resources/keystore b/tutorials/tutorial-rop-client-http2/src/main/resources/keystore
deleted file mode 100644
index d6592f95e..000000000
Binary files a/tutorials/tutorial-rop-client-http2/src/main/resources/keystore and /dev/null differ
diff --git a/tutorials/tutorial-rop-client/pom.xml b/tutorials/tutorial-rop-client/pom.xml
deleted file mode 100644
index 03bb53892..000000000
--- a/tutorials/tutorial-rop-client/pom.xml
+++ /dev/null
@@ -1,57 +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
-
-	https://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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.cayenne.tutorials</groupId>
-		<artifactId>cayenne-tutorials-parent</artifactId>
-		<version>4.3.M1-SNAPSHOT</version>
-	</parent>
-
-	<artifactId>tutorial-rop-client</artifactId>
-	<name>tutorial-rop-client: Cayenne ROP Client Tutorial</name>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.cayenne</groupId>
-			<artifactId>cayenne-client-jetty</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>com.caucho</groupId>
-            <artifactId>hessian</artifactId>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-simple</artifactId>
-			<scope>compile</scope>
-		</dependency>
-	</dependencies>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-deploy-plugin</artifactId>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-
-</project>
diff --git a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java b/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
deleted file mode 100644
index ef55bda7e..000000000
--- a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
+++ /dev/null
@@ -1,28 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Artist;
-
-/**
- * A persistent class mapped as "Artist" Cayenne entity.
- */
-public class Artist extends _Artist {
-
-}
diff --git a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Datamap.java b/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Datamap.java
deleted file mode 100644
index 637c9ee7c..000000000
--- a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Datamap.java
+++ /dev/null
@@ -1,36 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Datamap;
-
-public class Datamap extends _Datamap {
-
-    private static Datamap instance;
-
-    private Datamap() {}
-
-    public static Datamap getInstance() {
-        if(instance == null) {
-            instance = new Datamap();
-        }
-
-        return instance;
-    }
-}
diff --git a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java b/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
deleted file mode 100644
index 2584de48e..000000000
--- a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
+++ /dev/null
@@ -1,28 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Gallery;
-
-/**
- * A persistent class mapped as "Gallery" Cayenne entity.
- */
-public class Gallery extends _Gallery {
-
-}
diff --git a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Main.java b/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Main.java
deleted file mode 100644
index 46ab1770d..000000000
--- a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Main.java
+++ /dev/null
@@ -1,98 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.configuration.rop.client.ClientConstants;
-import org.apache.cayenne.configuration.rop.client.ClientJettyHttp2Module;
-import org.apache.cayenne.configuration.rop.client.ClientJettyHttpModule;
-import org.apache.cayenne.configuration.rop.client.ClientRuntime;
-import org.apache.cayenne.query.ObjectSelect;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class Main {
-
-    public static void main(String[] args) {
-
-        Map<String, String> properties = new HashMap<>();
-        properties.put(ClientConstants.ROP_SERVICE_URL_PROPERTY, "http://localhost:8080/cayenne-service");
-        properties.put(ClientConstants.ROP_SERVICE_USERNAME_PROPERTY, "cayenne-user");
-        properties.put(ClientConstants.ROP_SERVICE_PASSWORD_PROPERTY, "secret");
-        properties.put(ClientConstants.ROP_SERVICE_REALM_PROPERTY, "Cayenne Realm");
-
-        ClientRuntime runtime = ClientRuntime.builder()
-                                .properties(properties)
-                                .build();
-
-        ObjectContext context = runtime.newContext();
-
-        newObjectsTutorial(context);
-        selectTutorial(context);
-        deleteTutorial(context);
-        runtime.shutdown();
-    }
-
-    static void newObjectsTutorial(ObjectContext context) {
-
-        // creating new Artist
-        Artist picasso = context.newObject(Artist.class);
-        picasso.setName("Pablo Picasso");
-
-        // Creating other objects
-        Gallery metropolitan = context.newObject(Gallery.class);
-        metropolitan.setName("Metropolitan Museum of Art");
-
-        Painting girl = context.newObject(Painting.class);
-        girl.setName("Girl Reading at a Table");
-
-        Painting stein = context.newObject(Painting.class);
-        stein.setName("Gertrude Stein");
-
-        // connecting objects together via relationships
-        picasso.addToPaintings(girl);
-        picasso.addToPaintings(stein);
-
-        girl.setGallery(metropolitan);
-        stein.setGallery(metropolitan);
-
-        // saving all the changes above
-        context.commitChanges();
-    }
-
-    static void selectTutorial(ObjectContext context) {
-        // ObjectSelect examples
-        List<Painting> paintings1 = ObjectSelect.query(Painting.class).select(context);
-
-        List<Painting> paintings2 = ObjectSelect.query(Painting.class)
-                .where(Painting.NAME.likeIgnoreCase("gi%")).select(context);
-    }
-
-    static void deleteTutorial(ObjectContext context) {
-        // Delete object example
-        Artist picasso = ObjectSelect.query(Artist.class).where(Artist.NAME.eq("Pablo Picasso")).selectOne(context);
-
-        if (picasso != null) {
-            context.deleteObjects(picasso);
-            context.commitChanges();
-        }
-    }
-}
diff --git a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java b/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
deleted file mode 100644
index 2bb394411..000000000
--- a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
+++ /dev/null
@@ -1,28 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Painting;
-
-/**
- * A persistent class mapped as "Painting" Cayenne entity.
- */
-public class Painting extends _Painting {
-
-}
diff --git a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java b/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
deleted file mode 100644
index 052709b71..000000000
--- a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import java.time.LocalDate;
-import java.util.List;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.exp.property.DateProperty;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Painting;
-import org.apache.cayenne.util.PersistentObjectList;
-
-/**
- * A generated persistent class mapped as "Artist" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Artist extends PersistentObject {
-
-    public static final DateProperty<LocalDate> DATE_OF_BIRTH = PropertyFactory.createDate("dateOfBirth", LocalDate.class);
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected LocalDate dateOfBirth;
-    protected String name;
-    protected List<Painting> paintings;
-
-    public LocalDate getDateOfBirth() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "dateOfBirth", false);
-        }
-
-        return dateOfBirth;
-    }
-
-    public void setDateOfBirth(LocalDate dateOfBirth) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "dateOfBirth", false);
-            objectContext.propertyChanged(this, "dateOfBirth", this.dateOfBirth, dateOfBirth);
-        }
-
-        this.dateOfBirth = dateOfBirth;
-    }
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public List<Painting> getPaintings() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        return paintings;
-    }
-
-    public void addToPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.add(object);
-    }
-
-    public void removeFromPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.remove(object);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Datamap.java b/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Datamap.java
deleted file mode 100644
index bfb26721a..000000000
--- a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Datamap.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-
-
-/**
- * This class was generated by Cayenne.
- * It is probably a good idea to avoid changing this class manually,
- * since it may be overwritten next time code is regenerated.
- * If you need to make any customizations, please use subclass.
- */
-public class _Datamap {
-}
diff --git a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java b/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
deleted file mode 100644
index 57ccb07ba..000000000
--- a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import java.util.List;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Painting;
-import org.apache.cayenne.util.PersistentObjectList;
-
-/**
- * A generated persistent class mapped as "Gallery" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Gallery extends PersistentObject {
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected String name;
-    protected List<Painting> paintings;
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public List<Painting> getPaintings() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        return paintings;
-    }
-
-    public void addToPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.add(object);
-    }
-
-    public void removeFromPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.remove(object);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java b/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
deleted file mode 100644
index d6a4db2d7..000000000
--- a/tutorials/tutorial-rop-client/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.ValueHolder;
-import org.apache.cayenne.exp.property.EntityProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Artist;
-import org.apache.cayenne.tutorial.persistent.client.Gallery;
-import org.apache.cayenne.util.PersistentObjectHolder;
-
-/**
- * A generated persistent class mapped as "Painting" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Painting extends PersistentObject {
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final EntityProperty<org.apache.cayenne.tutorial.persistent.client.Artist> ARTIST = PropertyFactory.createEntity("artist", org.apache.cayenne.tutorial.persistent.client.Artist.class);
-    public static final EntityProperty<org.apache.cayenne.tutorial.persistent.client.Gallery> GALLERY = PropertyFactory.createEntity("gallery", org.apache.cayenne.tutorial.persistent.client.Gallery.class);
-
-    protected String name;
-    protected ValueHolder<Artist> artist;
-    protected ValueHolder<Gallery> gallery;
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public Artist getArtist() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "artist", true);
-        } else if (this.artist == null) {
-        	this.artist = new PersistentObjectHolder<>(this, "artist");
-		}
-
-        return artist.getValue();
-    }
-
-    public void setArtist(Artist artist) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "artist", true);
-            objectContext.propertyChanged(this, "artist", this.artist.getValueDirectly(), artist);
-        } else if (this.artist == null) {
-        	this.artist = new PersistentObjectHolder<>(this, "artist");
-		}
-
-        this.artist.setValue(artist);
-    }
-
-    public Gallery getGallery() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "gallery", true);
-        } else if (this.gallery == null) {
-        	this.gallery = new PersistentObjectHolder<>(this, "gallery");
-		}
-
-        return gallery.getValue();
-    }
-
-    public void setGallery(Gallery gallery) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "gallery", true);
-            objectContext.propertyChanged(this, "gallery", this.gallery.getValueDirectly(), gallery);
-        } else if (this.gallery == null) {
-        	this.gallery = new PersistentObjectHolder<>(this, "gallery");
-		}
-
-        this.gallery.setValue(gallery);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-client/src/main/resources/.gitignore b/tutorials/tutorial-rop-client/src/main/resources/.gitignore
deleted file mode 100644
index e69de29bb..000000000
diff --git a/tutorials/tutorial-rop-client/src/test/java/.gitignore b/tutorials/tutorial-rop-client/src/test/java/.gitignore
deleted file mode 100644
index e69de29bb..000000000
diff --git a/tutorials/tutorial-rop-client/src/test/resources/.gitignore b/tutorials/tutorial-rop-client/src/test/resources/.gitignore
deleted file mode 100644
index e69de29bb..000000000
diff --git a/tutorials/tutorial-rop-server-http2/pom.xml b/tutorials/tutorial-rop-server-http2/pom.xml
deleted file mode 100644
index 39698013e..000000000
--- a/tutorials/tutorial-rop-server-http2/pom.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    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
-    https://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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <artifactId>cayenne-tutorials-parent</artifactId>
-        <groupId>org.apache.cayenne.tutorials</groupId>
-        <version>4.3.M1-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>tutorial-rop-server-http2</artifactId>
-    <name>tutorial-rop-server-http2: Cayenne ROP HTTP/2 Server Tutorial</name>
-    <packaging>jar</packaging>
-
-    <properties>
-        <main.class>org.apache.cayenne.tutorial.Http2Server</main.class>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.cayenne</groupId>
-            <artifactId>cayenne-server</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cayenne</groupId>
-            <artifactId>cayenne-protostuff</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.derby</groupId>
-            <artifactId>derby</artifactId>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-simple</artifactId>
-            <scope>compile</scope>
-        </dependency>
-
-        <!-- Jetty's dependencies-->
-        <dependency>
-            <groupId>org.eclipse.jetty.http2</groupId>
-            <artifactId>http2-server</artifactId>
-            <version>${jetty.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlet</artifactId>
-            <version>${jetty.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jetty</groupId>
-            <artifactId>jetty-servlets</artifactId>
-            <version>${jetty.version}</version>
-        </dependency>
-
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/Http2ROPServlet.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/Http2ROPServlet.java
deleted file mode 100644
index 14c2497f4..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/Http2ROPServlet.java
+++ /dev/null
@@ -1,66 +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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.tutorial;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import java.util.Collection;
-import java.util.Map;
-
-import org.apache.cayenne.configuration.rop.server.ROPServerModule;
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.configuration.web.WebConfiguration;
-import org.apache.cayenne.configuration.web.WebUtil;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.remote.RemoteService;
-import org.apache.cayenne.rop.ROPSerializationService;
-import org.apache.cayenne.rop.ROPServlet;
-
-public class Http2ROPServlet extends ROPServlet {
-
-    @Override
-    public void init(ServletConfig configuration) throws ServletException {
-
-        checkAlreadyConfigured(configuration.getServletContext());
-
-        this.servletContext = configuration.getServletContext();
-
-        WebConfiguration configAdapter = new WebConfiguration(configuration);
-
-        String configurationLocation = configAdapter.getConfigurationLocation();
-        Map<String, String> eventBridgeParameters = configAdapter.getOtherParameters();
-
-        Collection<Module> modules = configAdapter.createModules();
-
-        ServerRuntime runtime = ServerRuntime
-                .builder()
-                .addConfig(configurationLocation)
-                .addModule(binder ->
-                        ROPServerModule.contributeROPBridgeProperties(binder).putAll(eventBridgeParameters))
-                .addModules(modules)
-                .build();
-
-        this.remoteService = runtime.getInjector().getInstance(RemoteService.class);
-        this.serializationService = runtime.getInjector().getInstance(ROPSerializationService.class);
-
-        WebUtil.setCayenneRuntime(servletContext, runtime);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/Http2Server.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/Http2Server.java
deleted file mode 100644
index 80470e4df..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/Http2Server.java
+++ /dev/null
@@ -1,114 +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
- * <p>
- * https://www.apache.org/licenses/LICENSE-2.0
- * <p>
- * 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.tutorial;
-
-import org.eclipse.jetty.http2.HTTP2Cipher;
-import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
-import org.eclipse.jetty.security.ConstraintMapping;
-import org.eclipse.jetty.security.ConstraintSecurityHandler;
-import org.eclipse.jetty.security.HashLoginService;
-import org.eclipse.jetty.security.SecurityHandler;
-import org.eclipse.jetty.security.UserStore;
-import org.eclipse.jetty.security.authentication.BasicAuthenticator;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.SecureRequestCustomizer;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.SslConnectionFactory;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.util.security.Constraint;
-import org.eclipse.jetty.util.security.Credential;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-
-import static org.eclipse.jetty.util.resource.Resource.newClassPathResource;
-
-/**
- * Based on the example org.eclipse.jetty.embedded.Http2Server included in the jetty-project distribution.
- * <p>
- * This server works without ALPN and could handle only HTTP/2 protocol.
- */
-public class Http2Server {
-
-    public static void main(String... args) throws Exception {
-        // Setting Protostuff properties
-        System.setProperty("protostuff.runtime.collection_schema_on_repeated_fields", "true");
-        System.setProperty("protostuff.runtime.morph_collection_interfaces", "true");
-        System.setProperty("protostuff.runtime.morph_map_interfaces", "true");
-        System.setProperty("protostuff.runtime.pojo_schema_on_collection_fields", "true");
-        System.setProperty("protostuff.runtime.pojo_schema_on_map_fields", "true");
-
-        Server server = new Server();
-
-        ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
-        context.addServlet(new ServletHolder("cayenne-project", new Http2ROPServlet()), "/");
-        context.setSecurityHandler(basicAuth("cayenne-user", "secret", "Cayenne Realm"));
-        server.setHandler(context);
-
-        // HTTPS Configuration
-        HttpConfiguration httpsConfig = new HttpConfiguration();
-        httpsConfig.setSecureScheme("https");
-        httpsConfig.setSecurePort(8443);
-        httpsConfig.addCustomizer(new SecureRequestCustomizer());
-
-        // SSL Context Factory for HTTPS and HTTP/2
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setKeyStoreResource(newClassPathResource("keystore"));
-        sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
-        sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
-        sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
-
-        // SSL Connection Factory
-        SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, "h2");
-
-        // HTTP/2 Connector
-        ServerConnector http2Connector = new ServerConnector(server, ssl, new HTTP2ServerConnectionFactory(httpsConfig));
-        http2Connector.setPort(8443);
-        server.addConnector(http2Connector);
-
-        server.start();
-        server.join();
-    }
-
-    private static SecurityHandler basicAuth(String username, String password, String realm) {
-        HashLoginService loginService = new HashLoginService();
-        UserStore userStore = new UserStore();
-        userStore.addUser(username, Credential.getCredential(password), new String[]{"cayenne-service-user"});
-        loginService.setUserStore(userStore);
-        loginService.setName(realm);
-
-        Constraint constraint = new Constraint();
-        constraint.setName(Constraint.__BASIC_AUTH);
-        constraint.setRoles(new String[]{"cayenne-service-user"});
-        constraint.setAuthenticate(true);
-
-        ConstraintMapping constraintMapping = new ConstraintMapping();
-        constraintMapping.setConstraint(constraint);
-        constraintMapping.setPathSpec("/*");
-
-        ConstraintSecurityHandler constraintSecurityHandler = new ConstraintSecurityHandler();
-        constraintSecurityHandler.setAuthenticator(new BasicAuthenticator());
-        constraintSecurityHandler.setRealmName(realm);
-        constraintSecurityHandler.addConstraintMapping(constraintMapping);
-        constraintSecurityHandler.setLoginService(loginService);
-
-        return constraintSecurityHandler;
-    }
-}
\ No newline at end of file
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Artist.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Artist.java
deleted file mode 100644
index bab14077d..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Artist.java
+++ /dev/null
@@ -1,28 +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
- *
- *    https://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.tutorial.persistent;
-
-import org.apache.cayenne.tutorial.persistent.auto._Artist;
-
-public class Artist extends _Artist {
-
-    private static final long serialVersionUID = 1L; 
-
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Gallery.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Gallery.java
deleted file mode 100644
index cfcf3c800..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Gallery.java
+++ /dev/null
@@ -1,28 +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
- *
- *    https://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.tutorial.persistent;
-
-import org.apache.cayenne.tutorial.persistent.auto._Gallery;
-
-public class Gallery extends _Gallery {
-
-    private static final long serialVersionUID = 1L; 
-
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Painting.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Painting.java
deleted file mode 100644
index 2a9a91c3a..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/Painting.java
+++ /dev/null
@@ -1,28 +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
- *
- *    https://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.tutorial.persistent;
-
-import org.apache.cayenne.tutorial.persistent.auto._Painting;
-
-public class Painting extends _Painting {
-
-    private static final long serialVersionUID = 1L; 
-
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Artist.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Artist.java
deleted file mode 100644
index 5ff782323..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Artist.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.auto;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.time.LocalDate;
-import java.util.List;
-
-import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.property.DateProperty;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.Painting;
-
-/**
- * Class _Artist was generated by Cayenne.
- * It is probably a good idea to avoid changing this class manually,
- * since it may be overwritten next time code is regenerated.
- * If you need to make any customizations, please use subclass.
- */
-public abstract class _Artist extends BaseDataObject {
-
-    private static final long serialVersionUID = 1L; 
-
-    public static final String ID_PK_COLUMN = "ID";
-
-    public static final DateProperty<LocalDate> DATE_OF_BIRTH = PropertyFactory.createDate("dateOfBirth", LocalDate.class);
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected LocalDate dateOfBirth;
-    protected String name;
-
-    protected Object paintings;
-
-    public void setDateOfBirth(LocalDate dateOfBirth) {
-        beforePropertyWrite("dateOfBirth", this.dateOfBirth, dateOfBirth);
-        this.dateOfBirth = dateOfBirth;
-    }
-
-    public LocalDate getDateOfBirth() {
-        beforePropertyRead("dateOfBirth");
-        return this.dateOfBirth;
-    }
-
-    public void setName(String name) {
-        beforePropertyWrite("name", this.name, name);
-        this.name = name;
-    }
-
-    public String getName() {
-        beforePropertyRead("name");
-        return this.name;
-    }
-
-    public void addToPaintings(Painting obj) {
-        addToManyTarget("paintings", obj, true);
-    }
-
-    public void removeFromPaintings(Painting obj) {
-        removeToManyTarget("paintings", obj, true);
-    }
-
-    @SuppressWarnings("unchecked")
-    public List<Painting> getPaintings() {
-        return (List<Painting>)readProperty("paintings");
-    }
-
-    @Override
-    public Object readPropertyDirectly(String propName) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch(propName) {
-            case "dateOfBirth":
-                return this.dateOfBirth;
-            case "name":
-                return this.name;
-            case "paintings":
-                return this.paintings;
-            default:
-                return super.readPropertyDirectly(propName);
-        }
-    }
-
-    @Override
-    public void writePropertyDirectly(String propName, Object val) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch (propName) {
-            case "dateOfBirth":
-                this.dateOfBirth = (LocalDate)val;
-                break;
-            case "name":
-                this.name = (String)val;
-                break;
-            case "paintings":
-                this.paintings = val;
-                break;
-            default:
-                super.writePropertyDirectly(propName, val);
-        }
-    }
-
-    private void writeObject(ObjectOutputStream out) throws IOException {
-        writeSerialized(out);
-    }
-
-    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        readSerialized(in);
-    }
-
-    @Override
-    protected void writeState(ObjectOutputStream out) throws IOException {
-        super.writeState(out);
-        out.writeObject(this.dateOfBirth);
-        out.writeObject(this.name);
-        out.writeObject(this.paintings);
-    }
-
-    @Override
-    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        super.readState(in);
-        this.dateOfBirth = (LocalDate)in.readObject();
-        this.name = (String)in.readObject();
-        this.paintings = in.readObject();
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Gallery.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Gallery.java
deleted file mode 100644
index 0dfd94185..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Gallery.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.auto;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.List;
-
-import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.Painting;
-
-/**
- * Class _Gallery was generated by Cayenne.
- * It is probably a good idea to avoid changing this class manually,
- * since it may be overwritten next time code is regenerated.
- * If you need to make any customizations, please use subclass.
- */
-public abstract class _Gallery extends BaseDataObject {
-
-    private static final long serialVersionUID = 1L; 
-
-    public static final String ID_PK_COLUMN = "ID";
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected String name;
-
-    protected Object paintings;
-
-    public void setName(String name) {
-        beforePropertyWrite("name", this.name, name);
-        this.name = name;
-    }
-
-    public String getName() {
-        beforePropertyRead("name");
-        return this.name;
-    }
-
-    public void addToPaintings(Painting obj) {
-        addToManyTarget("paintings", obj, true);
-    }
-
-    public void removeFromPaintings(Painting obj) {
-        removeToManyTarget("paintings", obj, true);
-    }
-
-    @SuppressWarnings("unchecked")
-    public List<Painting> getPaintings() {
-        return (List<Painting>)readProperty("paintings");
-    }
-
-    @Override
-    public Object readPropertyDirectly(String propName) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch(propName) {
-            case "name":
-                return this.name;
-            case "paintings":
-                return this.paintings;
-            default:
-                return super.readPropertyDirectly(propName);
-        }
-    }
-
-    @Override
-    public void writePropertyDirectly(String propName, Object val) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch (propName) {
-            case "name":
-                this.name = (String)val;
-                break;
-            case "paintings":
-                this.paintings = val;
-                break;
-            default:
-                super.writePropertyDirectly(propName, val);
-        }
-    }
-
-    private void writeObject(ObjectOutputStream out) throws IOException {
-        writeSerialized(out);
-    }
-
-    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        readSerialized(in);
-    }
-
-    @Override
-    protected void writeState(ObjectOutputStream out) throws IOException {
-        super.writeState(out);
-        out.writeObject(this.name);
-        out.writeObject(this.paintings);
-    }
-
-    @Override
-    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        super.readState(in);
-        this.name = (String)in.readObject();
-        this.paintings = in.readObject();
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Painting.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Painting.java
deleted file mode 100644
index e15e25f83..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Painting.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.auto;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.property.EntityProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.Artist;
-import org.apache.cayenne.tutorial.persistent.Gallery;
-
-/**
- * Class _Painting was generated by Cayenne.
- * It is probably a good idea to avoid changing this class manually,
- * since it may be overwritten next time code is regenerated.
- * If you need to make any customizations, please use subclass.
- */
-public abstract class _Painting extends BaseDataObject {
-
-    private static final long serialVersionUID = 1L; 
-
-    public static final String ID_PK_COLUMN = "ID";
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final EntityProperty<org.apache.cayenne.tutorial.persistent.Artist> ARTIST = PropertyFactory.createEntity("artist", org.apache.cayenne.tutorial.persistent.Artist.class);
-    public static final EntityProperty<org.apache.cayenne.tutorial.persistent.Gallery> GALLERY = PropertyFactory.createEntity("gallery", org.apache.cayenne.tutorial.persistent.Gallery.class);
-
-    protected String name;
-
-    protected Object artist;
-    protected Object gallery;
-
-    public void setName(String name) {
-        beforePropertyWrite("name", this.name, name);
-        this.name = name;
-    }
-
-    public String getName() {
-        beforePropertyRead("name");
-        return this.name;
-    }
-
-    public void setArtist(Artist artist) {
-        setToOneTarget("artist", artist, true);
-    }
-
-    public Artist getArtist() {
-        return (Artist)readProperty("artist");
-    }
-
-    public void setGallery(Gallery gallery) {
-        setToOneTarget("gallery", gallery, true);
-    }
-
-    public Gallery getGallery() {
-        return (Gallery)readProperty("gallery");
-    }
-
-    @Override
-    public Object readPropertyDirectly(String propName) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch(propName) {
-            case "name":
-                return this.name;
-            case "artist":
-                return this.artist;
-            case "gallery":
-                return this.gallery;
-            default:
-                return super.readPropertyDirectly(propName);
-        }
-    }
-
-    @Override
-    public void writePropertyDirectly(String propName, Object val) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch (propName) {
-            case "name":
-                this.name = (String)val;
-                break;
-            case "artist":
-                this.artist = val;
-                break;
-            case "gallery":
-                this.gallery = val;
-                break;
-            default:
-                super.writePropertyDirectly(propName, val);
-        }
-    }
-
-    private void writeObject(ObjectOutputStream out) throws IOException {
-        writeSerialized(out);
-    }
-
-    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        readSerialized(in);
-    }
-
-    @Override
-    protected void writeState(ObjectOutputStream out) throws IOException {
-        super.writeState(out);
-        out.writeObject(this.name);
-        out.writeObject(this.artist);
-        out.writeObject(this.gallery);
-    }
-
-    @Override
-    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        super.readState(in);
-        this.name = (String)in.readObject();
-        this.artist = in.readObject();
-        this.gallery = in.readObject();
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
deleted file mode 100644
index 154987f9e..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
+++ /dev/null
@@ -1,31 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Artist;
-
-/**
- * A persistent class mapped as "Artist" Cayenne entity.
- */
-public class Artist extends _Artist {
-
-     private static final long serialVersionUID = 1L; 
-     
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
deleted file mode 100644
index 95400a112..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
+++ /dev/null
@@ -1,31 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Gallery;
-
-/**
- * A persistent class mapped as "Gallery" Cayenne entity.
- */
-public class Gallery extends _Gallery {
-
-     private static final long serialVersionUID = 1L; 
-     
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
deleted file mode 100644
index 768407449..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
+++ /dev/null
@@ -1,31 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Painting;
-
-/**
- * A persistent class mapped as "Painting" Cayenne entity.
- */
-public class Painting extends _Painting {
-
-     private static final long serialVersionUID = 1L; 
-     
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
deleted file mode 100644
index 052709b71..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import java.time.LocalDate;
-import java.util.List;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.exp.property.DateProperty;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Painting;
-import org.apache.cayenne.util.PersistentObjectList;
-
-/**
- * A generated persistent class mapped as "Artist" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Artist extends PersistentObject {
-
-    public static final DateProperty<LocalDate> DATE_OF_BIRTH = PropertyFactory.createDate("dateOfBirth", LocalDate.class);
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected LocalDate dateOfBirth;
-    protected String name;
-    protected List<Painting> paintings;
-
-    public LocalDate getDateOfBirth() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "dateOfBirth", false);
-        }
-
-        return dateOfBirth;
-    }
-
-    public void setDateOfBirth(LocalDate dateOfBirth) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "dateOfBirth", false);
-            objectContext.propertyChanged(this, "dateOfBirth", this.dateOfBirth, dateOfBirth);
-        }
-
-        this.dateOfBirth = dateOfBirth;
-    }
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public List<Painting> getPaintings() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        return paintings;
-    }
-
-    public void addToPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.add(object);
-    }
-
-    public void removeFromPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.remove(object);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
deleted file mode 100644
index 57ccb07ba..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import java.util.List;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Painting;
-import org.apache.cayenne.util.PersistentObjectList;
-
-/**
- * A generated persistent class mapped as "Gallery" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Gallery extends PersistentObject {
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected String name;
-    protected List<Painting> paintings;
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public List<Painting> getPaintings() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        return paintings;
-    }
-
-    public void addToPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.add(object);
-    }
-
-    public void removeFromPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.remove(object);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java b/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
deleted file mode 100644
index ec9511a16..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.ValueHolder;
-import org.apache.cayenne.exp.property.EntityProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Artist;
-import org.apache.cayenne.tutorial.persistent.client.Gallery;
-import org.apache.cayenne.util.PersistentObjectHolder;
-
-/**
- * A generated persistent class mapped as "Painting" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Painting extends PersistentObject {
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final EntityProperty<Artist> ARTIST = PropertyFactory.createEntity("artist", Artist.class);
-    public static final EntityProperty<Gallery> GALLERY = PropertyFactory.createEntity("gallery", Gallery.class);
-
-    protected String name;
-    protected ValueHolder<Artist> artist;
-    protected ValueHolder<Gallery> gallery;
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public Artist getArtist() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "artist", true);
-        } else if (this.artist == null) {
-        	this.artist = new PersistentObjectHolder<>(this, "artist");
-		}
-
-        return artist.getValue();
-    }
-
-    public void setArtist(Artist artist) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "artist", true);
-        } else if (this.artist == null) {
-        	this.artist = new PersistentObjectHolder<>(this, "artist");
-		}
-
-        this.artist.setValue(artist);
-    }
-
-    public Gallery getGallery() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "gallery", true);
-        } else if (this.gallery == null) {
-        	this.gallery = new PersistentObjectHolder<>(this, "gallery");
-		}
-
-        return gallery.getValue();
-    }
-
-    public void setGallery(Gallery gallery) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "gallery", true);
-        } else if (this.gallery == null) {
-        	this.gallery = new PersistentObjectHolder<>(this, "gallery");
-		}
-
-        this.gallery.setValue(gallery);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server-http2/src/main/resources/cayenne-project.xml b/tutorials/tutorial-rop-server-http2/src/main/resources/cayenne-project.xml
deleted file mode 100644
index 27b1c1b1d..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/resources/cayenne-project.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<domain xmlns="http://cayenne.apache.org/schema/10/domain"
-	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/domain http://cayenne.apache.org/schema/10/domain.xsd"
-	 project-version="10">
-	<map name="datamap"/>
-	<node name="datanode"
-		 factory="org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory"
-		 schema-update-strategy="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy">
-		<map-ref name="datamap"/>
-		<data-source>
-			<driver value="org.apache.derby.jdbc.EmbeddedDriver"/>
-			<url value="jdbc:derby:memory:testdb;create=true"/>
-			<connectionPool min="1" max="1"/>
-			<login/>
-		</data-source>
-	</node>
-</domain>
diff --git a/tutorials/tutorial-rop-server-http2/src/main/resources/datamap.map.xml b/tutorials/tutorial-rop-server-http2/src/main/resources/datamap.map.xml
deleted file mode 100644
index f87928816..000000000
--- a/tutorials/tutorial-rop-server-http2/src/main/resources/datamap.map.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
-	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
-	 project-version="10">
-	<property name="defaultPackage" value="org.apache.cayenne.tutorial.persistent"/>
-	<property name="clientSupported" value="true"/>
-	<property name="defaultClientPackage" value="org.apache.cayenne.tutorial.persistent.client"/>
-	<db-entity name="ARTIST">
-		<db-attribute name="DATE_OF_BIRTH" type="DATE"/>
-		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
-		<db-attribute name="NAME" type="VARCHAR" length="200"/>
-	</db-entity>
-	<db-entity name="GALLERY">
-		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
-		<db-attribute name="NAME" type="VARCHAR" length="200"/>
-	</db-entity>
-	<db-entity name="PAINTING">
-		<db-attribute name="ARTIST_ID" type="INTEGER"/>
-		<db-attribute name="GALLERY_ID" type="INTEGER"/>
-		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
-		<db-attribute name="NAME" type="VARCHAR" length="200"/>
-	</db-entity>
-	<obj-entity name="Artist" className="org.apache.cayenne.tutorial.persistent.Artist" clientClassName="org.apache.cayenne.tutorial.persistent.client.Artist" dbEntityName="ARTIST">
-		<obj-attribute name="dateOfBirth" type="java.time.LocalDate" db-attribute-path="DATE_OF_BIRTH"/>
-		<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
-	</obj-entity>
-	<obj-entity name="Gallery" className="org.apache.cayenne.tutorial.persistent.Gallery" clientClassName="org.apache.cayenne.tutorial.persistent.client.Gallery" dbEntityName="GALLERY">
-		<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
-	</obj-entity>
-	<obj-entity name="Painting" className="org.apache.cayenne.tutorial.persistent.Painting" clientClassName="org.apache.cayenne.tutorial.persistent.client.Painting" dbEntityName="PAINTING">
-		<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
-	</obj-entity>
-	<db-relationship name="paintings" source="ARTIST" target="PAINTING" toMany="true">
-		<db-attribute-pair source="ID" target="ARTIST_ID"/>
-	</db-relationship>
-	<db-relationship name="paintings" source="GALLERY" target="PAINTING" toMany="true">
-		<db-attribute-pair source="ID" target="GALLERY_ID"/>
-	</db-relationship>
-	<db-relationship name="artist" source="PAINTING" target="ARTIST">
-		<db-attribute-pair source="ARTIST_ID" target="ID"/>
-	</db-relationship>
-	<db-relationship name="gallery" source="PAINTING" target="GALLERY">
-		<db-attribute-pair source="GALLERY_ID" target="ID"/>
-	</db-relationship>
-	<obj-relationship name="paintings" source="Artist" target="Painting" deleteRule="Cascade" db-relationship-path="paintings"/>
-	<obj-relationship name="paintings" source="Gallery" target="Painting" deleteRule="Nullify" db-relationship-path="paintings"/>
-	<obj-relationship name="artist" source="Painting" target="Artist" deleteRule="Nullify" db-relationship-path="artist"/>
-	<obj-relationship name="gallery" source="Painting" target="Gallery" deleteRule="Nullify" db-relationship-path="gallery"/>
-</data-map>
diff --git a/tutorials/tutorial-rop-server-http2/src/main/resources/keystore b/tutorials/tutorial-rop-server-http2/src/main/resources/keystore
deleted file mode 100644
index d6592f95e..000000000
Binary files a/tutorials/tutorial-rop-server-http2/src/main/resources/keystore and /dev/null differ
diff --git a/tutorials/tutorial-rop-server/pom.xml b/tutorials/tutorial-rop-server/pom.xml
deleted file mode 100644
index cc5a094ad..000000000
--- a/tutorials/tutorial-rop-server/pom.xml
+++ /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
-
-	https://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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.cayenne.tutorials</groupId>
-		<artifactId>cayenne-tutorials-parent</artifactId>
-		<version>4.3.M1-SNAPSHOT</version>
-	</parent>
-
-	<artifactId>tutorial-rop-server</artifactId>
-	<name>tutorial-rop-server: Cayenne ROP Server Tutorial</name>
-    <packaging>war</packaging>
-
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.cayenne</groupId>
-			<artifactId>cayenne-rop-server</artifactId>
-			<version>${project.version}</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.derby</groupId>
-			<artifactId>derby</artifactId>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>com.caucho</groupId>
-            <artifactId>hessian</artifactId>
-			<scope>compile</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-simple</artifactId>
-			<scope>compile</scope>
-		</dependency>
-	</dependencies>
-
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.eclipse.jetty</groupId>
-				<artifactId>jetty-maven-plugin</artifactId>
-				<version>${jetty.version}</version>
-				<configuration>
-					<loginServices>
-						<loginService implementation="org.eclipse.jetty.security.HashLoginService">
-							<name>Cayenne Realm</name>
-							<config>realm.properties</config>
-						</loginService>
-					</loginServices>
-				</configuration>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-deploy-plugin</artifactId>
-				<configuration>
-					<skip>true</skip>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-
-</project>
diff --git a/tutorials/tutorial-rop-server/realm.properties b/tutorials/tutorial-rop-server/realm.properties
deleted file mode 100644
index 63a80d22d..000000000
--- a/tutorials/tutorial-rop-server/realm.properties
+++ /dev/null
@@ -1,16 +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
-#
-# https://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.
-
-cayenne-user: secret,cayenne-service-user
\ No newline at end of file
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Artist.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Artist.java
deleted file mode 100644
index ef90379a9..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Artist.java
+++ /dev/null
@@ -1,50 +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
- *
- *    https://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.tutorial.persistent;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeParseException;
-
-import org.apache.cayenne.tutorial.persistent.auto._Artist;
-
-public class Artist extends _Artist {
-
-	static final String DEFAULT_DATE_FORMAT = "yyyyMMdd";
-
-	/**
-	 * Sets date of birth using a string in format yyyyMMdd.
-	 */
-	public void setDateOfBirthString(String yearMonthDay) {
-		if (yearMonthDay == null) {
-			setDateOfBirth(null);
-		} else {
-
-			LocalDate date;
-			try {
-				DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT);
-				date = LocalDate.parse(yearMonthDay, formatter);
-			} catch (DateTimeParseException e) {
-				throw new IllegalArgumentException("A date argument must be in format '"
-						+ DEFAULT_DATE_FORMAT + "': " + yearMonthDay);
-			}
-			setDateOfBirth(date);
-		}
-	}
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Datamap.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Datamap.java
deleted file mode 100644
index ddf2ddf45..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Datamap.java
+++ /dev/null
@@ -1,36 +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
- *
- *    https://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.tutorial.persistent;
-
-import org.apache.cayenne.tutorial.persistent.auto._Datamap;
-
-public class Datamap extends _Datamap {
-
-    private static Datamap instance;
-
-    private Datamap() {}
-
-    public static Datamap getInstance() {
-        if(instance == null) {
-            instance = new Datamap();
-        }
-
-        return instance;
-    }
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Gallery.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Gallery.java
deleted file mode 100644
index 2553b0904..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Gallery.java
+++ /dev/null
@@ -1,25 +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
- *
- *    https://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.tutorial.persistent;
-
-import org.apache.cayenne.tutorial.persistent.auto._Gallery;
-
-public class Gallery extends _Gallery {
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Painting.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Painting.java
deleted file mode 100644
index f1364b0b0..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/Painting.java
+++ /dev/null
@@ -1,25 +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
- *
- *    https://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.tutorial.persistent;
-
-import org.apache.cayenne.tutorial.persistent.auto._Painting;
-
-public class Painting extends _Painting {
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Artist.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Artist.java
deleted file mode 100644
index 5ff782323..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Artist.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.auto;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.time.LocalDate;
-import java.util.List;
-
-import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.property.DateProperty;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.Painting;
-
-/**
- * Class _Artist was generated by Cayenne.
- * It is probably a good idea to avoid changing this class manually,
- * since it may be overwritten next time code is regenerated.
- * If you need to make any customizations, please use subclass.
- */
-public abstract class _Artist extends BaseDataObject {
-
-    private static final long serialVersionUID = 1L; 
-
-    public static final String ID_PK_COLUMN = "ID";
-
-    public static final DateProperty<LocalDate> DATE_OF_BIRTH = PropertyFactory.createDate("dateOfBirth", LocalDate.class);
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected LocalDate dateOfBirth;
-    protected String name;
-
-    protected Object paintings;
-
-    public void setDateOfBirth(LocalDate dateOfBirth) {
-        beforePropertyWrite("dateOfBirth", this.dateOfBirth, dateOfBirth);
-        this.dateOfBirth = dateOfBirth;
-    }
-
-    public LocalDate getDateOfBirth() {
-        beforePropertyRead("dateOfBirth");
-        return this.dateOfBirth;
-    }
-
-    public void setName(String name) {
-        beforePropertyWrite("name", this.name, name);
-        this.name = name;
-    }
-
-    public String getName() {
-        beforePropertyRead("name");
-        return this.name;
-    }
-
-    public void addToPaintings(Painting obj) {
-        addToManyTarget("paintings", obj, true);
-    }
-
-    public void removeFromPaintings(Painting obj) {
-        removeToManyTarget("paintings", obj, true);
-    }
-
-    @SuppressWarnings("unchecked")
-    public List<Painting> getPaintings() {
-        return (List<Painting>)readProperty("paintings");
-    }
-
-    @Override
-    public Object readPropertyDirectly(String propName) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch(propName) {
-            case "dateOfBirth":
-                return this.dateOfBirth;
-            case "name":
-                return this.name;
-            case "paintings":
-                return this.paintings;
-            default:
-                return super.readPropertyDirectly(propName);
-        }
-    }
-
-    @Override
-    public void writePropertyDirectly(String propName, Object val) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch (propName) {
-            case "dateOfBirth":
-                this.dateOfBirth = (LocalDate)val;
-                break;
-            case "name":
-                this.name = (String)val;
-                break;
-            case "paintings":
-                this.paintings = val;
-                break;
-            default:
-                super.writePropertyDirectly(propName, val);
-        }
-    }
-
-    private void writeObject(ObjectOutputStream out) throws IOException {
-        writeSerialized(out);
-    }
-
-    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        readSerialized(in);
-    }
-
-    @Override
-    protected void writeState(ObjectOutputStream out) throws IOException {
-        super.writeState(out);
-        out.writeObject(this.dateOfBirth);
-        out.writeObject(this.name);
-        out.writeObject(this.paintings);
-    }
-
-    @Override
-    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        super.readState(in);
-        this.dateOfBirth = (LocalDate)in.readObject();
-        this.name = (String)in.readObject();
-        this.paintings = in.readObject();
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Datamap.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Datamap.java
deleted file mode 100644
index acb07cc77..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Datamap.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.auto;
-
-
-
-/**
- * This class was generated by Cayenne.
- * It is probably a good idea to avoid changing this class manually,
- * since it may be overwritten next time code is regenerated.
- * If you need to make any customizations, please use subclass.
- */
-public class _Datamap {
-}
\ No newline at end of file
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Gallery.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Gallery.java
deleted file mode 100644
index 0dfd94185..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Gallery.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.auto;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.List;
-
-import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.Painting;
-
-/**
- * Class _Gallery was generated by Cayenne.
- * It is probably a good idea to avoid changing this class manually,
- * since it may be overwritten next time code is regenerated.
- * If you need to make any customizations, please use subclass.
- */
-public abstract class _Gallery extends BaseDataObject {
-
-    private static final long serialVersionUID = 1L; 
-
-    public static final String ID_PK_COLUMN = "ID";
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected String name;
-
-    protected Object paintings;
-
-    public void setName(String name) {
-        beforePropertyWrite("name", this.name, name);
-        this.name = name;
-    }
-
-    public String getName() {
-        beforePropertyRead("name");
-        return this.name;
-    }
-
-    public void addToPaintings(Painting obj) {
-        addToManyTarget("paintings", obj, true);
-    }
-
-    public void removeFromPaintings(Painting obj) {
-        removeToManyTarget("paintings", obj, true);
-    }
-
-    @SuppressWarnings("unchecked")
-    public List<Painting> getPaintings() {
-        return (List<Painting>)readProperty("paintings");
-    }
-
-    @Override
-    public Object readPropertyDirectly(String propName) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch(propName) {
-            case "name":
-                return this.name;
-            case "paintings":
-                return this.paintings;
-            default:
-                return super.readPropertyDirectly(propName);
-        }
-    }
-
-    @Override
-    public void writePropertyDirectly(String propName, Object val) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch (propName) {
-            case "name":
-                this.name = (String)val;
-                break;
-            case "paintings":
-                this.paintings = val;
-                break;
-            default:
-                super.writePropertyDirectly(propName, val);
-        }
-    }
-
-    private void writeObject(ObjectOutputStream out) throws IOException {
-        writeSerialized(out);
-    }
-
-    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        readSerialized(in);
-    }
-
-    @Override
-    protected void writeState(ObjectOutputStream out) throws IOException {
-        super.writeState(out);
-        out.writeObject(this.name);
-        out.writeObject(this.paintings);
-    }
-
-    @Override
-    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        super.readState(in);
-        this.name = (String)in.readObject();
-        this.paintings = in.readObject();
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Painting.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Painting.java
deleted file mode 100644
index e15e25f83..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/auto/_Painting.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.auto;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
-import org.apache.cayenne.BaseDataObject;
-import org.apache.cayenne.exp.property.EntityProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.Artist;
-import org.apache.cayenne.tutorial.persistent.Gallery;
-
-/**
- * Class _Painting was generated by Cayenne.
- * It is probably a good idea to avoid changing this class manually,
- * since it may be overwritten next time code is regenerated.
- * If you need to make any customizations, please use subclass.
- */
-public abstract class _Painting extends BaseDataObject {
-
-    private static final long serialVersionUID = 1L; 
-
-    public static final String ID_PK_COLUMN = "ID";
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final EntityProperty<org.apache.cayenne.tutorial.persistent.Artist> ARTIST = PropertyFactory.createEntity("artist", org.apache.cayenne.tutorial.persistent.Artist.class);
-    public static final EntityProperty<org.apache.cayenne.tutorial.persistent.Gallery> GALLERY = PropertyFactory.createEntity("gallery", org.apache.cayenne.tutorial.persistent.Gallery.class);
-
-    protected String name;
-
-    protected Object artist;
-    protected Object gallery;
-
-    public void setName(String name) {
-        beforePropertyWrite("name", this.name, name);
-        this.name = name;
-    }
-
-    public String getName() {
-        beforePropertyRead("name");
-        return this.name;
-    }
-
-    public void setArtist(Artist artist) {
-        setToOneTarget("artist", artist, true);
-    }
-
-    public Artist getArtist() {
-        return (Artist)readProperty("artist");
-    }
-
-    public void setGallery(Gallery gallery) {
-        setToOneTarget("gallery", gallery, true);
-    }
-
-    public Gallery getGallery() {
-        return (Gallery)readProperty("gallery");
-    }
-
-    @Override
-    public Object readPropertyDirectly(String propName) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch(propName) {
-            case "name":
-                return this.name;
-            case "artist":
-                return this.artist;
-            case "gallery":
-                return this.gallery;
-            default:
-                return super.readPropertyDirectly(propName);
-        }
-    }
-
-    @Override
-    public void writePropertyDirectly(String propName, Object val) {
-        if(propName == null) {
-            throw new IllegalArgumentException();
-        }
-
-        switch (propName) {
-            case "name":
-                this.name = (String)val;
-                break;
-            case "artist":
-                this.artist = val;
-                break;
-            case "gallery":
-                this.gallery = val;
-                break;
-            default:
-                super.writePropertyDirectly(propName, val);
-        }
-    }
-
-    private void writeObject(ObjectOutputStream out) throws IOException {
-        writeSerialized(out);
-    }
-
-    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        readSerialized(in);
-    }
-
-    @Override
-    protected void writeState(ObjectOutputStream out) throws IOException {
-        super.writeState(out);
-        out.writeObject(this.name);
-        out.writeObject(this.artist);
-        out.writeObject(this.gallery);
-    }
-
-    @Override
-    protected void readState(ObjectInputStream in) throws IOException, ClassNotFoundException {
-        super.readState(in);
-        this.name = (String)in.readObject();
-        this.artist = in.readObject();
-        this.gallery = in.readObject();
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
deleted file mode 100644
index ef55bda7e..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Artist.java
+++ /dev/null
@@ -1,28 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Artist;
-
-/**
- * A persistent class mapped as "Artist" Cayenne entity.
- */
-public class Artist extends _Artist {
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Datamap.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Datamap.java
deleted file mode 100644
index 637c9ee7c..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Datamap.java
+++ /dev/null
@@ -1,36 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Datamap;
-
-public class Datamap extends _Datamap {
-
-    private static Datamap instance;
-
-    private Datamap() {}
-
-    public static Datamap getInstance() {
-        if(instance == null) {
-            instance = new Datamap();
-        }
-
-        return instance;
-    }
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
deleted file mode 100644
index 2584de48e..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Gallery.java
+++ /dev/null
@@ -1,28 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Gallery;
-
-/**
- * A persistent class mapped as "Gallery" Cayenne entity.
- */
-public class Gallery extends _Gallery {
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
deleted file mode 100644
index 2bb394411..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/Painting.java
+++ /dev/null
@@ -1,28 +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
- *
- *    https://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.tutorial.persistent.client;
-
-import org.apache.cayenne.tutorial.persistent.client.auto._Painting;
-
-/**
- * A persistent class mapped as "Painting" Cayenne entity.
- */
-public class Painting extends _Painting {
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
deleted file mode 100644
index 052709b71..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Artist.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import java.time.LocalDate;
-import java.util.List;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.exp.property.DateProperty;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Painting;
-import org.apache.cayenne.util.PersistentObjectList;
-
-/**
- * A generated persistent class mapped as "Artist" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Artist extends PersistentObject {
-
-    public static final DateProperty<LocalDate> DATE_OF_BIRTH = PropertyFactory.createDate("dateOfBirth", LocalDate.class);
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected LocalDate dateOfBirth;
-    protected String name;
-    protected List<Painting> paintings;
-
-    public LocalDate getDateOfBirth() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "dateOfBirth", false);
-        }
-
-        return dateOfBirth;
-    }
-
-    public void setDateOfBirth(LocalDate dateOfBirth) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "dateOfBirth", false);
-            objectContext.propertyChanged(this, "dateOfBirth", this.dateOfBirth, dateOfBirth);
-        }
-
-        this.dateOfBirth = dateOfBirth;
-    }
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public List<Painting> getPaintings() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        return paintings;
-    }
-
-    public void addToPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.add(object);
-    }
-
-    public void removeFromPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.remove(object);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Datamap.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Datamap.java
deleted file mode 100644
index 83d07d8b9..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Datamap.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import org.apache.cayenne.PersistentObject;
-
-/**
- * This class was generated by Cayenne.
- * It is probably a good idea to avoid changing this class manually,
- * since it may be overwritten next time code is regenerated.
- * If you need to make any customizations, please use subclass.
- */
-public class _Datamap {
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
deleted file mode 100644
index 57ccb07ba..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Gallery.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import java.util.List;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.exp.property.ListProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Painting;
-import org.apache.cayenne.util.PersistentObjectList;
-
-/**
- * A generated persistent class mapped as "Gallery" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Gallery extends PersistentObject {
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final ListProperty<Painting> PAINTINGS = PropertyFactory.createList("paintings", Painting.class);
-
-    protected String name;
-    protected List<Painting> paintings;
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public List<Painting> getPaintings() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        return paintings;
-    }
-
-    public void addToPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.add(object);
-    }
-
-    public void removeFromPaintings(Painting object) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "paintings", true);
-        } else if (this.paintings == null) {
-        	this.paintings = new PersistentObjectList<>(this, "paintings");
-		}
-
-        this.paintings.remove(object);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java b/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
deleted file mode 100644
index ec9511a16..000000000
--- a/tutorials/tutorial-rop-server/src/main/java/org/apache/cayenne/tutorial/persistent/client/auto/_Painting.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.apache.cayenne.tutorial.persistent.client.auto;
-
-import org.apache.cayenne.PersistentObject;
-import org.apache.cayenne.ValueHolder;
-import org.apache.cayenne.exp.property.EntityProperty;
-import org.apache.cayenne.exp.property.PropertyFactory;
-import org.apache.cayenne.exp.property.StringProperty;
-import org.apache.cayenne.tutorial.persistent.client.Artist;
-import org.apache.cayenne.tutorial.persistent.client.Gallery;
-import org.apache.cayenne.util.PersistentObjectHolder;
-
-/**
- * A generated persistent class mapped as "Painting" Cayenne entity. It is a good idea to
- * avoid changing this class manually, since it will be overwritten next time code is
- * regenerated. If you need to make any customizations, put them in a subclass.
- */
-public abstract class _Painting extends PersistentObject {
-
-    public static final StringProperty<String> NAME = PropertyFactory.createString("name", String.class);
-    public static final EntityProperty<Artist> ARTIST = PropertyFactory.createEntity("artist", Artist.class);
-    public static final EntityProperty<Gallery> GALLERY = PropertyFactory.createEntity("gallery", Gallery.class);
-
-    protected String name;
-    protected ValueHolder<Artist> artist;
-    protected ValueHolder<Gallery> gallery;
-
-    public String getName() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-        }
-
-        return name;
-    }
-
-    public void setName(String name) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "name", false);
-            objectContext.propertyChanged(this, "name", this.name, name);
-        }
-
-        this.name = name;
-    }
-
-    public Artist getArtist() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "artist", true);
-        } else if (this.artist == null) {
-        	this.artist = new PersistentObjectHolder<>(this, "artist");
-		}
-
-        return artist.getValue();
-    }
-
-    public void setArtist(Artist artist) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "artist", true);
-        } else if (this.artist == null) {
-        	this.artist = new PersistentObjectHolder<>(this, "artist");
-		}
-
-        this.artist.setValue(artist);
-    }
-
-    public Gallery getGallery() {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "gallery", true);
-        } else if (this.gallery == null) {
-        	this.gallery = new PersistentObjectHolder<>(this, "gallery");
-		}
-
-        return gallery.getValue();
-    }
-
-    public void setGallery(Gallery gallery) {
-        if(objectContext != null) {
-            objectContext.prepareForAccess(this, "gallery", true);
-        } else if (this.gallery == null) {
-        	this.gallery = new PersistentObjectHolder<>(this, "gallery");
-		}
-
-        this.gallery.setValue(gallery);
-    }
-
-}
diff --git a/tutorials/tutorial-rop-server/src/main/resources/cayenne-project.xml b/tutorials/tutorial-rop-server/src/main/resources/cayenne-project.xml
deleted file mode 100644
index 27b1c1b1d..000000000
--- a/tutorials/tutorial-rop-server/src/main/resources/cayenne-project.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<domain xmlns="http://cayenne.apache.org/schema/10/domain"
-	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/domain http://cayenne.apache.org/schema/10/domain.xsd"
-	 project-version="10">
-	<map name="datamap"/>
-	<node name="datanode"
-		 factory="org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory"
-		 schema-update-strategy="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy">
-		<map-ref name="datamap"/>
-		<data-source>
-			<driver value="org.apache.derby.jdbc.EmbeddedDriver"/>
-			<url value="jdbc:derby:memory:testdb;create=true"/>
-			<connectionPool min="1" max="1"/>
-			<login/>
-		</data-source>
-	</node>
-</domain>
diff --git a/tutorials/tutorial-rop-server/src/main/resources/datamap.map.xml b/tutorials/tutorial-rop-server/src/main/resources/datamap.map.xml
deleted file mode 100644
index f87928816..000000000
--- a/tutorials/tutorial-rop-server/src/main/resources/datamap.map.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
-	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	 xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
-	 project-version="10">
-	<property name="defaultPackage" value="org.apache.cayenne.tutorial.persistent"/>
-	<property name="clientSupported" value="true"/>
-	<property name="defaultClientPackage" value="org.apache.cayenne.tutorial.persistent.client"/>
-	<db-entity name="ARTIST">
-		<db-attribute name="DATE_OF_BIRTH" type="DATE"/>
-		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
-		<db-attribute name="NAME" type="VARCHAR" length="200"/>
-	</db-entity>
-	<db-entity name="GALLERY">
-		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
-		<db-attribute name="NAME" type="VARCHAR" length="200"/>
-	</db-entity>
-	<db-entity name="PAINTING">
-		<db-attribute name="ARTIST_ID" type="INTEGER"/>
-		<db-attribute name="GALLERY_ID" type="INTEGER"/>
-		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
-		<db-attribute name="NAME" type="VARCHAR" length="200"/>
-	</db-entity>
-	<obj-entity name="Artist" className="org.apache.cayenne.tutorial.persistent.Artist" clientClassName="org.apache.cayenne.tutorial.persistent.client.Artist" dbEntityName="ARTIST">
-		<obj-attribute name="dateOfBirth" type="java.time.LocalDate" db-attribute-path="DATE_OF_BIRTH"/>
-		<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
-	</obj-entity>
-	<obj-entity name="Gallery" className="org.apache.cayenne.tutorial.persistent.Gallery" clientClassName="org.apache.cayenne.tutorial.persistent.client.Gallery" dbEntityName="GALLERY">
-		<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
-	</obj-entity>
-	<obj-entity name="Painting" className="org.apache.cayenne.tutorial.persistent.Painting" clientClassName="org.apache.cayenne.tutorial.persistent.client.Painting" dbEntityName="PAINTING">
-		<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
-	</obj-entity>
-	<db-relationship name="paintings" source="ARTIST" target="PAINTING" toMany="true">
-		<db-attribute-pair source="ID" target="ARTIST_ID"/>
-	</db-relationship>
-	<db-relationship name="paintings" source="GALLERY" target="PAINTING" toMany="true">
-		<db-attribute-pair source="ID" target="GALLERY_ID"/>
-	</db-relationship>
-	<db-relationship name="artist" source="PAINTING" target="ARTIST">
-		<db-attribute-pair source="ARTIST_ID" target="ID"/>
-	</db-relationship>
-	<db-relationship name="gallery" source="PAINTING" target="GALLERY">
-		<db-attribute-pair source="GALLERY_ID" target="ID"/>
-	</db-relationship>
-	<obj-relationship name="paintings" source="Artist" target="Painting" deleteRule="Cascade" db-relationship-path="paintings"/>
-	<obj-relationship name="paintings" source="Gallery" target="Painting" deleteRule="Nullify" db-relationship-path="paintings"/>
-	<obj-relationship name="artist" source="Painting" target="Artist" deleteRule="Nullify" db-relationship-path="artist"/>
-	<obj-relationship name="gallery" source="Painting" target="Gallery" deleteRule="Nullify" db-relationship-path="gallery"/>
-</data-map>
diff --git a/tutorials/tutorial-rop-server/src/main/webapp/META-INF/context.xml b/tutorials/tutorial-rop-server/src/main/webapp/META-INF/context.xml
deleted file mode 100644
index 288841a2b..000000000
--- a/tutorials/tutorial-rop-server/src/main/webapp/META-INF/context.xml
+++ /dev/null
@@ -1,23 +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
-
-	https://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.
--->
-<!-- 
- This piece of configuration is needed for deployment on Tomcat 6 or 7
- to prevent ROP client from losing its server-side session between requests.
--->
-<Context>
-	<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" 
-		changeSessionIdOnAuthentication="false" />
-</Context>
\ No newline at end of file
diff --git a/tutorials/tutorial-rop-server/src/main/webapp/WEB-INF/web.xml b/tutorials/tutorial-rop-server/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 2872baecc..000000000
--- a/tutorials/tutorial-rop-server/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE web-app
-   PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
-   "http://java.sun.com/dtd/web-app_2_3.dtd">
-<!--
-	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
-
-	https://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.   
--->
-<web-app>
-	<display-name>Cayenne Tutorial</display-name>
-	<servlet>
-		<servlet-name>cayenne-project</servlet-name>
-		<servlet-class>org.apache.cayenne.rop.ROPServlet</servlet-class>
-		<load-on-startup>0</load-on-startup>
-	</servlet>
-	<servlet-mapping>
-		<servlet-name>cayenne-project</servlet-name>
-		<url-pattern>/cayenne-service</url-pattern>
-	</servlet-mapping>
-	
-	<security-constraint>
-        <web-resource-collection>
-            <web-resource-name>CayenneService</web-resource-name>
-            <url-pattern>/cayenne-service</url-pattern>
-        </web-resource-collection>
-        <auth-constraint>
-            <role-name>cayenne-service-user</role-name>
-        </auth-constraint>
-    </security-constraint>
-    
-    <login-config>
-        <auth-method>BASIC</auth-method>
-        <realm-name>Cayenne Realm</realm-name>
-    </login-config>
-	
-    <security-role>
-        <role-name>cayenne-service-user</role-name>
-    </security-role>
-</web-app>
\ No newline at end of file
diff --git a/tutorials/tutorial-rop-server/src/test/java/.gitignore b/tutorials/tutorial-rop-server/src/test/java/.gitignore
deleted file mode 100644
index e69de29bb..000000000
diff --git a/tutorials/tutorial-rop-server/src/test/resources/.gitignore b/tutorials/tutorial-rop-server/src/test/resources/.gitignore
deleted file mode 100644
index e69de29bb..000000000