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

vlamp pushed a commit to branch jpa-core-TAP5-2824
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git

commit 428a60141547e066dbeaa544e5b26d8adc89946d
Author: Volker Lamp <[email protected]>
AuthorDate: Sun Apr 5 20:43:45 2026 +0200

    Separate tapestry-jpa-core from tapestry-jpa
---
 settings.gradle                                    |   1 +
 .../apache/tapestry5/modules/TapestryModule.java   |   2 +-
 .../src/main/typescript/package-lock.json          |   1 -
 .../tapestry5/ioc/modules/TapestryIOCModule.java   |  18 ++
 tapestry-jpa-core/LICENSE.txt                      | 202 +++++++++++++++++++++
 tapestry-jpa-core/NOTICE.txt                       |  12 ++
 tapestry-jpa-core/build.gradle                     |  28 +++
 .../jpa/core}/CommitAfterMethodAdvice.java         |   6 +-
 .../jpa/core}/EntityManagerManagerImpl.java        |   8 +-
 .../jpa/core}/EntityManagerObjectProvider.java     |   8 +-
 .../jpa/core}/EntityManagerSourceImpl.java         |  29 +--
 .../jpa/core}/EntityTransactionManagerImpl.java    |   6 +-
 .../internal/jpa/core/JpaCoreInternalUtils.java    |  27 +--
 .../jpa/core}/JpaTransactionAdvisorImpl.java       |  12 +-
 .../internal/jpa/core}/NoopAnnotatedType.java      |   2 +-
 .../internal/jpa/core}/NoopBeanManager.java        |   2 +-
 .../internal/jpa/core}/NoopCreationalContext.java  |   2 +-
 .../internal/jpa/core}/NoopInjectionTarget.java    |   2 +-
 .../PackageNamePersistenceUnitConfigurer.java      |  10 +-
 .../jpa/core}/PersistenceContentHandler.java       |   6 +-
 ...nceContextSpecificEntityTransactionManager.java |   4 +-
 .../internal/jpa/core}/PersistenceParser.java      |   6 +-
 .../jpa/core}/PersistenceUnitInfoImpl.java         |   6 +-
 ...apestryCDIBeanManagerForJPAEntityListeners.java |   2 +-
 .../tapestry5/jpa/core}/EntityManagerManager.java  |   2 +-
 .../tapestry5/jpa/core}/EntityManagerSource.java   |   2 +-
 .../jpa/core}/EntityTransactionManager.java        |   2 +-
 .../tapestry5/jpa/core/JpaCoreConstants.java       |  18 +-
 .../apache/tapestry5/jpa/core/JpaCoreSymbols.java  |  38 ++++
 .../jpa/core}/JpaEntityPackageManager.java         |   2 +-
 .../tapestry5/jpa/core}/JpaTransactionAdvisor.java |   4 +-
 .../jpa/core}/PersistenceUnitConfigurer.java       |   4 +-
 .../jpa/core}/TapestryPersistenceUnitInfo.java     |   4 +-
 .../jpa/core}/annotations/CommitAfter.java         |   4 +-
 .../jpa/core}/annotations/package-info.java        |   6 +-
 .../tapestry5/jpa/core/modules/JpaCoreModule.java  | 119 ++++++++++++
 .../jpa/core}/EntityManagerSourceImplTest.java     |  14 +-
 .../jpa/core}/JpaTransactionAdvisorImplTest.java   |  13 +-
 ...-persistence-units-include-unlisted-classes.xml |   0
 tapestry-jpa/build.gradle                          |   1 +
 .../tapestry5/internal/jpa/CommitAfterWorker.java  |   9 +-
 .../EntityApplicationStatePersistenceStrategy.java |   4 +-
 .../jpa/EntityPersistentFieldStrategy.java         |   4 +-
 .../tapestry5/internal/jpa/JpaInternalUtils.java   |  24 +--
 .../tapestry5/internal/jpa/JpaValueEncoder.java    |   4 +-
 .../tapestry5/internal/jpa/PersistedEntity.java    |   4 +-
 .../internal/jpa/PersistenceContextWorker.java     |   4 +-
 .../apache/tapestry5/jpa/modules/JpaModule.java    |  68 ++-----
 .../apache/tapestry5/jpa/test/CommitCounter.java   |   2 +-
 .../org/apache/tapestry5/jpa/test/JpaTest.java     |   2 +-
 .../apache/tapestry5/jpa/test/JpaTestModule.java   |  12 +-
 .../apache/tapestry5/jpa/test/NestedService.java   |   2 +-
 .../apache/tapestry5/jpa/test/TopLevelService.java |   2 +-
 .../tapestry5/jpa/test/TopLevelServiceImpl.java    |   4 +-
 .../org/example/app1/pages/CommitAfterDemo.java    |   2 +-
 .../org/example/app1/pages/EncodeEntities.java     |   4 +-
 .../test/java/org/example/app1/pages/GridDemo.java |   2 +-
 .../java/org/example/app1/pages/PersistEntity.java |   2 +-
 .../java/org/example/app1/pages/PersistThang.java  |   2 +-
 .../java/org/example/app1/services/AppModule.java  |   8 +-
 .../java/org/example/app1/services/UserDAO.java    |   2 +-
 .../java/org/example/app2/pages/PersistItem.java   |   4 +-
 .../java/org/example/app2/pages/PersistItem2.java  |   4 +-
 .../java/org/example/app2/pages/PersistItem3.java  |   2 +-
 .../java/org/example/app3/pages/PersistThing.java  |   4 +-
 .../java/org/example/app3/services/AppModule.java  |   6 +-
 .../java/org/example/app4/pages/PersistAll.java    |   4 +-
 .../org/example/app6/pages/CommitAfterDemo.java    |   2 +-
 .../org/example/app6/pages/EncodeEntities.java     |   2 +-
 .../test/java/org/example/app6/pages/GridDemo.java |   2 +-
 .../java/org/example/app6/pages/PersistEntity.java |   2 +-
 .../java/org/example/app6/pages/PersistThang.java  |   2 +-
 .../java/org/example/app6/services/AppModule.java  |   8 +-
 .../java/org/example/app6/services/UserDAO.java    |   2 +-
 .../example/app6/services/impl/UserDAOImpl.java    |   2 +-
 75 files changed, 598 insertions(+), 250 deletions(-)

diff --git a/settings.gradle b/settings.gradle
index 5bbd41fc4..f44d5b8e1 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -36,6 +36,7 @@ include('plastic',
         'tapestry-upload',
         'tapestry-beanvalidator',
         'tapestry-jpa',
+       'tapestry-jpa-core',
         'tapestry-kaptcha',
         //'quickstart',
         'tapestry-clojure',
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java 
b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
index 0709fd572..622df1774 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/modules/TapestryModule.java
@@ -1213,7 +1213,7 @@ public final class TapestryModule
                 return assetSource.resourceForPath(input);
             }
         });
-        configuration.add(stringToResource.getKey(), stringToResource);
+        configuration.override(stringToResource.getKey(), stringToResource);
 
         CoercionTuple<Renderable, RenderCommand> renderableToRenderCommand = 
CoercionTuple.create(Renderable.class, RenderCommand.class,
                 new Coercion<Renderable, RenderCommand>()
diff --git a/tapestry-core/src/main/typescript/package-lock.json 
b/tapestry-core/src/main/typescript/package-lock.json
index de9f7e7ca..336639a5d 100644
--- a/tapestry-core/src/main/typescript/package-lock.json
+++ b/tapestry-core/src/main/typescript/package-lock.json
@@ -369,7 +369,6 @@
       "resolved": 
"https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz";,
       "integrity": 
"sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
       "dev": true,
-      "peer": true,
       "bin": {
         "tsc": "bin/tsc",
         "tsserver": "bin/tsserver"
diff --git 
a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
 
b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
index 2aeed2235..4f739e94b 100644
--- 
a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
+++ 
b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/modules/TapestryIOCModule.java
@@ -60,6 +60,7 @@ import 
org.apache.tapestry5.ioc.internal.services.ThunkCreatorImpl;
 import org.apache.tapestry5.ioc.internal.services.UpdateListenerHubImpl;
 import org.apache.tapestry5.ioc.internal.services.ValueObjectProvider;
 import org.apache.tapestry5.ioc.internal.services.cron.PeriodicExecutorImpl;
+import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.ioc.services.ApplicationDefaults;
 import org.apache.tapestry5.ioc.services.AspectDecorator;
@@ -312,6 +313,23 @@ public final class TapestryIOCModule
         BasicTypeCoercions.provideJSR310TypeCoercions(configuration);
     }
     
+    @Contribute(TypeCoercer.class)
+    public static void 
provideAdditionalCoercions(MappedConfiguration<CoercionTuple.Key, 
CoercionTuple> configuration)
+    {
+        Coercion<String, Resource> stringToResource = new Coercion<String, 
Resource>()
+        {
+            @Override
+            public Resource coerce(String input)
+            {
+                return new ClasspathResource(input);
+            }
+        };
+
+        CoercionTuple<String, Resource> stringToResourceTuple = 
CoercionTuple.create(String.class, Resource.class, stringToResource);
+
+        configuration.add(stringToResourceTuple.getKey(), 
stringToResourceTuple);
+    }
+    
     /**
      * <dl>
      * <dt>SystemProperties</dt>
diff --git a/tapestry-jpa-core/LICENSE.txt b/tapestry-jpa-core/LICENSE.txt
new file mode 100644
index 000000000..d64569567
--- /dev/null
+++ b/tapestry-jpa-core/LICENSE.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/tapestry-jpa-core/NOTICE.txt b/tapestry-jpa-core/NOTICE.txt
new file mode 100644
index 000000000..2ee18498c
--- /dev/null
+++ b/tapestry-jpa-core/NOTICE.txt
@@ -0,0 +1,12 @@
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+Please refer to the NOTICE.txt in each sub-module to
+identify further dependencies.
+
+The Maven central repository is the prefered method to download Tapestry
+and its dependencies. The binary archive includes just basic
+dependencies for tapestry-core; using other modules (such as
+tapestry-hibernate or any of the others) requires downloading
+additional dependencies. Please refer to the Maven POM for each module
+to identify its dependencies.
diff --git a/tapestry-jpa-core/build.gradle b/tapestry-jpa-core/build.gradle
new file mode 100644
index 000000000..9f71dc319
--- /dev/null
+++ b/tapestry-jpa-core/build.gradle
@@ -0,0 +1,28 @@
+plugins {
+    id 'tapestry.junit5-spock-convention'
+    id 'groovy'
+}
+
+description = 'Provides support for JPA without a dependency on tapestry-core'
+
+dependencies {
+    api libs.jakarta.persistence.api
+    implementation libs.jakarta.cdi.api
+
+    implementation project(':commons')
+    implementation project(':tapestry-ioc')
+
+    testImplementation project(':tapestry-spock')
+    testImplementation project(':tapestry-test')
+
+    testImplementation libs.eclipselink
+
+    testRuntimeOnly libs.dbcp
+    testRuntimeOnly libs.h2
+}
+
+tasks.named('jar', Jar) {
+    manifest {
+        attributes 'Tapestry-Module-Classes': 
'org.apache.tapestry5.jpa.core.modules.JpaCoreModule'
+    }
+}
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/CommitAfterMethodAdvice.java
similarity index 88%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/CommitAfterMethodAdvice.java
index d73444467..ed50791d2 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterMethodAdvice.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/CommitAfterMethodAdvice.java
@@ -1,4 +1,4 @@
-// Copyright 2011, 2012, 2014 The Apache Software Foundation
+// Copyright 2011, 2012, 2014, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import org.apache.tapestry5.ioc.Invokable;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
 import org.apache.tapestry5.plastic.MethodAdvice;
 import org.apache.tapestry5.plastic.MethodInvocation;
 
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerManagerImpl.java
similarity index 93%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerManagerImpl.java
index 77a2ef5bb..2c4d5be41 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerManagerImpl.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerManagerImpl.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.util.Collections;
 import java.util.Map;
@@ -23,8 +23,8 @@ import jakarta.persistence.spi.PersistenceUnitInfo;
 
 import org.apache.tapestry5.commons.util.CollectionFactory;
 import org.apache.tapestry5.ioc.services.ThreadCleanupListener;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
 import org.slf4j.Logger;
 
 public class EntityManagerManagerImpl implements EntityManagerManager, 
ThreadCleanupListener
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerObjectProvider.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerObjectProvider.java
similarity index 91%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerObjectProvider.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerObjectProvider.java
index 004e7bb94..692c0e978 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerObjectProvider.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerObjectProvider.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -25,7 +25,7 @@ import org.apache.tapestry5.commons.ObjectCreator;
 import org.apache.tapestry5.commons.ObjectLocator;
 import org.apache.tapestry5.commons.ObjectProvider;
 import org.apache.tapestry5.commons.services.PlasticProxyFactory;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
 
 public class EntityManagerObjectProvider implements ObjectProvider
 {
@@ -64,7 +64,7 @@ public class EntityManagerObjectProvider implements 
ObjectProvider
                         final EntityManagerManager entityManagerManager = 
objectLocator
                                 .getService(EntityManagerManager.class);
 
-                        return 
JpaInternalUtils.getEntityManager(entityManagerManager, annotation);
+                        return 
JpaCoreInternalUtils.getEntityManager(entityManagerManager, annotation);
                     }
                 }, "<EntityManagerProxy>");
                 emProxyByName.put(unitName, proxy);
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImpl.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImpl.java
similarity index 91%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImpl.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImpl.java
index b819d1a96..eb130b135 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImpl.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImpl.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,8 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.Collections;
 import java.util.List;
@@ -29,6 +32,7 @@ import 
jakarta.persistence.spi.PersistenceProviderResolverHolder;
 import jakarta.persistence.spi.PersistenceUnitInfo;
 
 import org.apache.tapestry5.commons.Resource;
+import org.apache.tapestry5.commons.services.TypeCoercer;
 import org.apache.tapestry5.commons.util.CollectionFactory;
 import org.apache.tapestry5.func.F;
 import org.apache.tapestry5.func.Mapper;
@@ -37,12 +41,13 @@ import org.apache.tapestry5.ioc.annotations.Local;
 import org.apache.tapestry5.ioc.annotations.PostInjection;
 import org.apache.tapestry5.ioc.annotations.Symbol;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
 import org.apache.tapestry5.ioc.services.RegistryShutdownHub;
-import org.apache.tapestry5.jpa.EntityManagerSource;
-import org.apache.tapestry5.jpa.JpaConstants;
-import org.apache.tapestry5.jpa.JpaSymbols;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.JpaCoreConstants;
+import org.apache.tapestry5.jpa.core.JpaCoreSymbols;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
 import org.slf4j.Logger;
 
 public class EntityManagerSourceImpl implements EntityManagerSource
@@ -54,10 +59,10 @@ public class EntityManagerSourceImpl implements 
EntityManagerSource
 
     private final List<TapestryPersistenceUnitInfo> persistenceUnitInfos;
 
-    public EntityManagerSourceImpl(Logger logger, 
@Symbol(JpaSymbols.PERSISTENCE_DESCRIPTOR)
-    final Resource persistenceDescriptor, @Local
-    PersistenceUnitConfigurer packageNamePersistenceUnitConfigurer,
-                                   Map<String, PersistenceUnitConfigurer> 
configuration)
+    public EntityManagerSourceImpl(Logger logger,
+        @Symbol(JpaCoreSymbols.PERSISTENCE_DESCRIPTOR) Resource 
persistenceDescriptor,
+        @Local PersistenceUnitConfigurer packageNamePersistenceUnitConfigurer,
+        Map<String, PersistenceUnitConfigurer> configuration)
     {
         this.logger = logger;
 
@@ -215,7 +220,7 @@ public class EntityManagerSourceImpl implements 
EntityManagerSource
             if (info.getPersistenceUnitName().equals(persistenceUnitName))
             {
                 final Map properties = info.getEntityManagerProperties() == 
null ? CollectionFactory.newCaseInsensitiveMap() : 
info.getEntityManagerProperties();
-                properties.put(JpaConstants.PERSISTENCE_UNIT_NAME, 
persistenceUnitName);
+                properties.put(JpaCoreConstants.PERSISTENCE_UNIT_NAME, 
persistenceUnitName);
 
                 String providerClassName = 
info.getPersistenceProviderClassName();
 
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityTransactionManagerImpl.java
similarity index 96%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityTransactionManagerImpl.java
index 31b09b0e9..b1d8c8039 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityTransactionManagerImpl.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/EntityTransactionManagerImpl.java
@@ -11,7 +11,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -21,8 +21,8 @@ import jakarta.persistence.EntityManager;
 import org.apache.tapestry5.ioc.Invokable;
 import org.apache.tapestry5.ioc.ScopeConstants;
 import org.apache.tapestry5.ioc.annotations.Scope;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
 import org.slf4j.Logger;
 
 @Scope(ScopeConstants.PERTHREAD)
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaCoreInternalUtils.java
similarity index 75%
copy from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
copy to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaCoreInternalUtils.java
index 4b8b0ffe7..f054bd7d7 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaCoreInternalUtils.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.util.Map;
 import java.util.Set;
@@ -24,28 +24,11 @@ import jakarta.persistence.metamodel.EntityType;
 import jakarta.persistence.metamodel.Metamodel;
 
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.JpaConstants;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.JpaCoreConstants;
 
-public class JpaInternalUtils
+public class JpaCoreInternalUtils
 {
-    public static PersistedEntity convertApplicationValueToPersisted(
-            final EntityManagerManager entityManagerManager, final Object 
newValue)
-    {
-        final EntityManager em = getEntityManagerFactory(entityManagerManager, 
newValue);
-
-        final EntityManagerFactory emf = em.getEntityManagerFactory();
-
-        final Map<String, Object> properties = emf.getProperties();
-
-        final String persistenceUnitName = (String) properties
-                .get(JpaConstants.PERSISTENCE_UNIT_NAME);
-
-        final Object id = emf.getPersistenceUnitUtil().getIdentifier(newValue);
-
-        return new PersistedEntity(newValue.getClass(), id, 
persistenceUnitName);
-    }
-
     private static EntityManager getEntityManagerFactory(
             final EntityManagerManager entityManagerManager, final Object 
entity)
     {
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImpl.java
similarity index 85%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImpl.java
index 4b29e849f..43ef62a47 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImpl.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImpl.java
@@ -1,4 +1,4 @@
-// Copyright 2015 The Apache Software Foundation
+// Copyright 2015, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.lang.reflect.Method;
 import java.util.HashMap;
@@ -22,10 +22,10 @@ import jakarta.persistence.EntityManager;
 import jakarta.persistence.PersistenceContext;
 
 import org.apache.tapestry5.ioc.MethodAdviceReceiver;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.apache.tapestry5.plastic.MethodAdvice;
 
 public class JpaTransactionAdvisorImpl implements JpaTransactionAdvisor
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopAnnotatedType.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopAnnotatedType.java
similarity index 97%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopAnnotatedType.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopAnnotatedType.java
index a0d675c89..46bad1f69 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopAnnotatedType.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopAnnotatedType.java
@@ -11,7 +11,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopBeanManager.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopBeanManager.java
similarity index 99%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopBeanManager.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopBeanManager.java
index 6b1e4833d..e4e95ad8b 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopBeanManager.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopBeanManager.java
@@ -11,7 +11,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopCreationalContext.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopCreationalContext.java
similarity index 94%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopCreationalContext.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopCreationalContext.java
index 1a1f57541..9d70ba299 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopCreationalContext.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopCreationalContext.java
@@ -11,7 +11,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import jakarta.enterprise.context.spi.CreationalContext;
 
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopInjectionTarget.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopInjectionTarget.java
similarity index 97%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopInjectionTarget.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopInjectionTarget.java
index 06e727b06..0109835f7 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/NoopInjectionTarget.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/NoopInjectionTarget.java
@@ -11,7 +11,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.util.Set;
 
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PackageNamePersistenceUnitConfigurer.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PackageNamePersistenceUnitConfigurer.java
similarity index 83%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PackageNamePersistenceUnitConfigurer.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PackageNamePersistenceUnitConfigurer.java
index f85d598c4..a2c71d506 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PackageNamePersistenceUnitConfigurer.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PackageNamePersistenceUnitConfigurer.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,12 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import org.apache.tapestry5.ioc.services.ClassNameLocator;
-import org.apache.tapestry5.jpa.JpaEntityPackageManager;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.JpaEntityPackageManager;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
 
 public class PackageNamePersistenceUnitConfigurer implements 
PersistenceUnitConfigurer
 {
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContentHandler.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContentHandler.java
similarity index 94%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContentHandler.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContentHandler.java
index a27c67ab4..34d718029 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContentHandler.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContentHandler.java
@@ -1,4 +1,4 @@
-// Copyright 2011, 2014 The Apache Software Foundation
+// Copyright 2011, 2014, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,13 +12,13 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.util.Arrays;
 import java.util.List;
 
 import org.apache.tapestry5.commons.util.CollectionFactory;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.Locator;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContextSpecificEntityTransactionManager.java
similarity index 98%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContextSpecificEntityTransactionManager.java
index 096206269..401d0deac 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextSpecificEntityTransactionManager.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceContextSpecificEntityTransactionManager.java
@@ -11,7 +11,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.util.ArrayDeque;
 import java.util.ArrayList;
@@ -23,7 +23,7 @@ import jakarta.persistence.EntityManager;
 import jakarta.persistence.EntityTransaction;
 
 import org.apache.tapestry5.ioc.Invokable;
-import org.apache.tapestry5.jpa.EntityTransactionManager.VoidInvokable;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager.VoidInvokable;
 import org.slf4j.Logger;
 
 public class PersistenceContextSpecificEntityTransactionManager
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceParser.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceParser.java
similarity index 89%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceParser.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceParser.java
index cf2402fb0..1fa78a1d4 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceParser.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceParser.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
 import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 import org.xml.sax.helpers.XMLReaderFactory;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitInfoImpl.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceUnitInfoImpl.java
similarity index 98%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitInfoImpl.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceUnitInfoImpl.java
index c0235d850..ccc0c5e7b 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceUnitInfoImpl.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/PersistenceUnitInfoImpl.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,10 +12,10 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import org.apache.tapestry5.commons.util.CollectionFactory;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
 
 import javax.naming.Context;
 import javax.naming.InitialContext;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/TapestryCDIBeanManagerForJPAEntityListeners.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/TapestryCDIBeanManagerForJPAEntityListeners.java
similarity index 98%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/TapestryCDIBeanManagerForJPAEntityListeners.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/TapestryCDIBeanManagerForJPAEntityListeners.java
index c608abf43..ccc8970d4 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/TapestryCDIBeanManagerForJPAEntityListeners.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/internal/jpa/core/TapestryCDIBeanManagerForJPAEntityListeners.java
@@ -11,7 +11,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.lang.reflect.Method;
 
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerManager.java 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerManager.java
similarity index 97%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerManager.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerManager.java
index 699d22b9d..53a628f7b 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerManager.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerManager.java
@@ -10,7 +10,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
 
 import jakarta.persistence.EntityManager;
 import java.util.Map;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerSource.java 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerSource.java
similarity index 97%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerSource.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerSource.java
index a52852c96..a2ba7e207 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityManagerSource.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityManagerSource.java
@@ -10,7 +10,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
 
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.EntityManagerFactory;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityTransactionManager.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityTransactionManager.java
similarity index 97%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityTransactionManager.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityTransactionManager.java
index e8b2ae1c4..13eef2ca5 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/EntityTransactionManager.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/EntityTransactionManager.java
@@ -11,7 +11,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
 
 import org.apache.tapestry5.ioc.Invokable;
 
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreConstants.java
similarity index 55%
copy from 
tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java
copy to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreConstants.java
index d1acafe15..3d40c8e5e 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreConstants.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,21 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
 
 /**
- * Used to configure a {@linkplain 
jakarta.persistence.spi.PersistenceUnitInfo}, which is used to
- * create an {@linkplain jakarta.persistence.EntityManagerFactory}.
- * 
+ * Defines constants used inside the Tapestry JPA integration.
+ *
  * @since 5.3
  */
-public interface PersistenceUnitConfigurer
+public class JpaCoreConstants
 {
     /**
-     * Configures a persistence unit.
-     * 
-     * @param unitInfo
-     *            represents a persistence unit to configure
+     * Name of the <code>EntityManager</code> property whose value is the name 
of a persistence unit.
      */
-    void configure(TapestryPersistenceUnitInfo unitInfo);
+    public static final String PERSISTENCE_UNIT_NAME = 
"tapestry.persistence-unit-name";
 }
diff --git 
a/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreSymbols.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreSymbols.java
new file mode 100644
index 000000000..ababe0442
--- /dev/null
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaCoreSymbols.java
@@ -0,0 +1,38 @@
+// Copyright 2011, 2026 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.jpa.core;
+
+/**
+ * Configuration symbols, for use with contributions to {@link 
org.apache.tapestry5.ioc.services.ApplicationDefaults}.
+ *
+ * @since 5.3
+ */
+public class JpaCoreSymbols
+{
+    /**
+     * If "true", then JPA will be started up at application launch, rather 
than lazily.
+     * 
+     * @since 5.3
+     */
+    public static final String EARLY_START_UP = "tapestry.jpa.early-startup";
+
+    /**
+     * The location of the persistence configuration file, located on the 
classpath. This
+     * will normally be <code>/META-INF/persistence.xml</code>.
+     * 
+     * @since 5.3
+     */
+    public static final String PERSISTENCE_DESCRIPTOR = 
"tapestry.jpa.persistence-descriptor";
+}
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaEntityPackageManager.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaEntityPackageManager.java
similarity index 96%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaEntityPackageManager.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaEntityPackageManager.java
index a4d28dc55..47d032aa3 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaEntityPackageManager.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaEntityPackageManager.java
@@ -10,7 +10,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
 
 import org.apache.tapestry5.ioc.annotations.UsesConfiguration;
 
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaTransactionAdvisor.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaTransactionAdvisor.java
similarity index 93%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaTransactionAdvisor.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaTransactionAdvisor.java
index 10957b524..7c717304d 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/JpaTransactionAdvisor.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/JpaTransactionAdvisor.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
 
 import org.apache.tapestry5.ioc.MethodAdviceReceiver;
 
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/PersistenceUnitConfigurer.java
similarity index 91%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/PersistenceUnitConfigurer.java
index d1acafe15..5c390ec67 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/PersistenceUnitConfigurer.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/PersistenceUnitConfigurer.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
 
 /**
  * Used to configure a {@linkplain 
jakarta.persistence.spi.PersistenceUnitInfo}, which is used to
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/TapestryPersistenceUnitInfo.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/TapestryPersistenceUnitInfo.java
similarity index 98%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/TapestryPersistenceUnitInfo.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/TapestryPersistenceUnitInfo.java
index b930ca9cb..b470100c9 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/TapestryPersistenceUnitInfo.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/TapestryPersistenceUnitInfo.java
@@ -1,4 +1,4 @@
-// Copyright 2011, 2014 The Apache Software Foundation
+// Copyright 2011, 2014, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.jpa;
+package org.apache.tapestry5.jpa.core;
 
 import jakarta.persistence.SharedCacheMode;
 import jakarta.persistence.ValidationMode;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/CommitAfter.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/CommitAfter.java
similarity index 91%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/CommitAfter.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/CommitAfter.java
index e715b7cfe..e2c9d965e 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/CommitAfter.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/CommitAfter.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.jpa.annotations;
+package org.apache.tapestry5.jpa.core.annotations;
 
 import static java.lang.annotation.ElementType.METHOD;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/package-info.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/package-info.java
similarity index 81%
rename from 
tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/package-info.java
rename to 
tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/package-info.java
index 7f8523063..869eff0b1 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/annotations/package-info.java
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/annotations/package-info.java
@@ -1,4 +1,4 @@
-// Copyright 2012 The Apache Software Foundation
+// Copyright 2012, 2026The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -13,6 +13,6 @@
 // limitations under the License.
 
 /**
- * JPA annotations
+ * JPA Core annotations
  */
-package org.apache.tapestry5.jpa.annotations;
+package org.apache.tapestry5.jpa.core.annotations;
diff --git 
a/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/modules/JpaCoreModule.java
 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/modules/JpaCoreModule.java
new file mode 100644
index 000000000..be05207a1
--- /dev/null
+++ 
b/tapestry-jpa-core/src/main/java/org/apache/tapestry5/jpa/core/modules/JpaCoreModule.java
@@ -0,0 +1,119 @@
+// Copyright 2011-2014, 2026 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.jpa.core.modules;
+
+import java.util.Collection;
+
+import jakarta.persistence.EntityManagerFactory;
+import jakarta.persistence.metamodel.EntityType;
+import jakarta.persistence.metamodel.Metamodel;
+import jakarta.persistence.spi.PersistenceUnitInfo;
+
+import org.apache.tapestry5.commons.Configuration;
+import org.apache.tapestry5.commons.MappedConfiguration;
+import org.apache.tapestry5.commons.ObjectProvider;
+import org.apache.tapestry5.commons.OrderedConfiguration;
+import org.apache.tapestry5.commons.services.PropertyAccess;
+import org.apache.tapestry5.commons.services.TypeCoercer;
+import org.apache.tapestry5.internal.jpa.core.EntityManagerManagerImpl;
+import org.apache.tapestry5.internal.jpa.core.EntityManagerObjectProvider;
+import org.apache.tapestry5.internal.jpa.core.EntityManagerSourceImpl;
+import org.apache.tapestry5.internal.jpa.core.EntityTransactionManagerImpl;
+import org.apache.tapestry5.internal.jpa.core.JpaTransactionAdvisorImpl;
+import 
org.apache.tapestry5.internal.jpa.core.PackageNamePersistenceUnitConfigurer;
+import org.apache.tapestry5.ioc.LoggerSource;
+import org.apache.tapestry5.ioc.ScopeConstants;
+import org.apache.tapestry5.ioc.ServiceBinder;
+import org.apache.tapestry5.ioc.annotations.Contribute;
+import org.apache.tapestry5.ioc.annotations.Primary;
+import org.apache.tapestry5.ioc.annotations.Scope;
+import org.apache.tapestry5.ioc.annotations.Startup;
+import org.apache.tapestry5.ioc.annotations.Symbol;
+import org.apache.tapestry5.ioc.services.FactoryDefaults;
+import org.apache.tapestry5.ioc.services.MasterObjectProvider;
+import org.apache.tapestry5.ioc.services.PerthreadManager;
+import org.apache.tapestry5.ioc.services.SymbolProvider;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.JpaEntityPackageManager;
+import org.apache.tapestry5.jpa.core.JpaCoreSymbols;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.slf4j.Logger;
+
+/**
+ * Defines core services for JPA support.
+ *
+ * @since 5.3
+ */
+public class JpaCoreModule
+{
+    public static void bind(final ServiceBinder binder)
+    {
+        binder.bind(JpaTransactionAdvisor.class, 
JpaTransactionAdvisorImpl.class);
+        binder.bind(PersistenceUnitConfigurer.class, 
PackageNamePersistenceUnitConfigurer.class).withSimpleId();
+        binder.bind(EntityManagerSource.class, EntityManagerSourceImpl.class);
+        binder.bind(EntityTransactionManager.class, 
EntityTransactionManagerImpl.class);
+    }
+
+    public static JpaEntityPackageManager buildJpaEntityPackageManager(final 
Collection<String> packageNames)
+    {
+        return new JpaEntityPackageManager()
+        {
+            @Override
+            public Collection<String> getPackageNames()
+            {
+                return packageNames;
+            }
+        };
+    }
+
+    @Scope(ScopeConstants.PERTHREAD)
+    public static EntityManagerManager buildEntityManagerManager(final 
EntityManagerSource entityManagerSource,
+                                                                 final 
PerthreadManager perthreadManager, final Logger logger)
+    {
+        final EntityManagerManagerImpl service = new 
EntityManagerManagerImpl(entityManagerSource, logger);
+
+        perthreadManager.addThreadCleanupListener(service);
+
+        return service;
+    }
+
+    @Contribute(MasterObjectProvider.class)
+    public static void provideObjectProviders(final 
OrderedConfiguration<ObjectProvider> configuration)
+    {
+        configuration.addInstance("EntityManager", 
EntityManagerObjectProvider.class,
+                "before:AnnotationBasedContributions");
+    }
+
+    @Contribute(SymbolProvider.class)
+    @FactoryDefaults
+    public static void provideFactoryDefaults(final 
MappedConfiguration<String, String> configuration)
+    {
+        configuration.add(JpaCoreSymbols.EARLY_START_UP, "true");
+        configuration.add(JpaCoreSymbols.PERSISTENCE_DESCRIPTOR, 
"/META-INF/persistence.xml");
+    }
+
+    @Startup
+    public static void startupEarly(final EntityManagerManager 
entityManagerManager, @Symbol(JpaCoreSymbols.EARLY_START_UP)
+    final boolean earlyStartup)
+    {
+        if (earlyStartup)
+        {
+            entityManagerManager.getEntityManagers();
+        }
+    }
+}
diff --git 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImplTest.java
 
b/tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImplTest.java
similarity index 90%
rename from 
tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImplTest.java
rename to 
tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImplTest.java
index 61c0be72a..9af6c9f47 100644
--- 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/EntityManagerSourceImplTest.java
+++ 
b/tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/EntityManagerSourceImplTest.java
@@ -1,4 +1,4 @@
-// Copyright 2011-2014 The Apache Software Foundation
+// Copyright 2011-2014, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,13 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import org.apache.tapestry5.commons.util.CollectionFactory;
 import org.apache.tapestry5.ioc.internal.util.ClasspathResource;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
-import org.apache.tapestry5.test.TapestryTestCase;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.internal.jpa.core.EntityManagerSourceImpl;
+import org.apache.tapestry5.ioc.test.IOCTestCase;
 import org.slf4j.LoggerFactory;
 import org.testng.annotations.Test;
 
@@ -28,7 +29,7 @@ import jakarta.persistence.spi.PersistenceUnitTransactionType;
 import java.util.HashMap;
 import java.util.Map;
 
-public class EntityManagerSourceImplTest extends TapestryTestCase
+public class EntityManagerSourceImplTest extends IOCTestCase
 {
     @Test
     public void multiple_persistence_units_include_unlisted_classes()
@@ -95,5 +96,4 @@ public class EntityManagerSourceImplTest extends 
TapestryTestCase
                 persistenceUnitFile), null, configurerMap);
                return emSource;
        }
-    
 }
diff --git 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java
 
b/tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImplTest.java
similarity index 97%
rename from 
tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java
rename to 
tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImplTest.java
index 558ea8dbc..8de7f2205 100644
--- 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/internal/jpa/JpaTransactionAdvisorImplTest.java
+++ 
b/tapestry-jpa-core/src/test/java/org/apache/tapestry5/internal/jpa/core/JpaTransactionAdvisorImplTest.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry5.internal.jpa;
+package org.apache.tapestry5.internal.jpa.core;
 
 import java.sql.SQLException;
 import java.util.Map;
@@ -27,10 +27,11 @@ import org.apache.tapestry5.ioc.Registry;
 import org.apache.tapestry5.ioc.services.AspectDecorator;
 import org.apache.tapestry5.ioc.services.AspectInterceptorBuilder;
 import org.apache.tapestry5.ioc.test.IOCTestCase;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.internal.jpa.core.JpaTransactionAdvisorImpl;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.apache.tapestry5.test.ioc.TestBase;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
diff --git 
a/tapestry-jpa/src/test/resources/multiple-persistence-units-include-unlisted-classes.xml
 
b/tapestry-jpa-core/src/test/resources/multiple-persistence-units-include-unlisted-classes.xml
similarity index 100%
rename from 
tapestry-jpa/src/test/resources/multiple-persistence-units-include-unlisted-classes.xml
rename to 
tapestry-jpa-core/src/test/resources/multiple-persistence-units-include-unlisted-classes.xml
diff --git a/tapestry-jpa/build.gradle b/tapestry-jpa/build.gradle
index 0f7ff48e5..4e360f78f 100644
--- a/tapestry-jpa/build.gradle
+++ b/tapestry-jpa/build.gradle
@@ -6,6 +6,7 @@ description = 'Provides support for simple CRUD applications 
built on top of Tap
 
 dependencies {
     implementation project(':tapestry-core')
+    implementation project(':tapestry-jpa-core')
 
     api libs.jakarta.persistence.api
     implementation libs.jakarta.cdi.api
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
index 0df0b963a..85fd35eae 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
+++ 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/CommitAfterWorker.java
@@ -1,4 +1,4 @@
-// Copyright 2011, 2014 The Apache Software Foundation
+// Copyright 2011, 2014, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -20,9 +20,10 @@ import java.util.Map;
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.PersistenceContext;
 
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.internal.jpa.core.CommitAfterMethodAdvice;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.apache.tapestry5.model.MutableComponentModel;
 import org.apache.tapestry5.plastic.MethodAdvice;
 import org.apache.tapestry5.plastic.PlasticClass;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
index 7566ea43d..f61dbcb56 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
+++ 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityApplicationStatePersistenceStrategy.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@ package org.apache.tapestry5.internal.jpa;
 
 import org.apache.tapestry5.http.services.Request;
 import 
org.apache.tapestry5.internal.services.SessionApplicationStatePersistenceStrategy;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
 import org.apache.tapestry5.services.ApplicationStateCreator;
 
 public class EntityApplicationStatePersistenceStrategy extends
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityPersistentFieldStrategy.java
 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityPersistentFieldStrategy.java
index a49230f56..1f00078a2 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityPersistentFieldStrategy.java
+++ 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/EntityPersistentFieldStrategy.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@ package org.apache.tapestry5.internal.jpa;
 
 import org.apache.tapestry5.http.services.Request;
 import 
org.apache.tapestry5.internal.services.AbstractSessionPersistentFieldStrategy;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
 
 /**
  * Persists JPA entities by storing their id in the session.
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
index 4b8b0ffe7..2629ffa12 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
+++ 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaInternalUtils.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -23,11 +23,12 @@ import jakarta.persistence.PersistenceContext;
 import jakarta.persistence.metamodel.EntityType;
 import jakarta.persistence.metamodel.Metamodel;
 
+import org.apache.tapestry5.internal.jpa.core.JpaCoreInternalUtils;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
 import org.apache.tapestry5.jpa.JpaConstants;
 
-public class JpaInternalUtils
+public class JpaInternalUtils extends JpaCoreInternalUtils
 {
     public static PersistedEntity convertApplicationValueToPersisted(
             final EntityManagerManager entityManagerManager, final Object 
newValue)
@@ -76,21 +77,4 @@ public class JpaInternalUtils
                         "Failed persisting the entity. The entity '%s' does 
not belong to any of the existing persistence contexts.",
                         entity));
     }
-
-    public static EntityManager getEntityManager(EntityManagerManager 
entityManagerManager,
-                                                 PersistenceContext annotation)
-    {
-        String unitName = annotation == null ? null : annotation.unitName();
-
-        if (InternalUtils.isNonBlank(unitName))
-            return entityManagerManager.getEntityManager(unitName);
-
-        Map<String, EntityManager> entityManagers = 
entityManagerManager.getEntityManagers();
-
-        if (entityManagers.size() == 1)
-            return entityManagers.values().iterator().next();
-
-        throw new RuntimeException("Unable to locate a single EntityManager. " 
+
-                "You must provide the persistence unit name as defined in the 
persistence.xml using the @PersistenceContext annotation.");
-    }
 }
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaValueEncoder.java
 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaValueEncoder.java
index 7bf678aa0..357c45fec 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaValueEncoder.java
+++ 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/JpaValueEncoder.java
@@ -1,4 +1,4 @@
-// Copyright 2011-2013 The Apache Software Foundation
+// Copyright 2011-2013, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@ import org.apache.tapestry5.commons.services.PropertyAdapter;
 import org.apache.tapestry5.commons.services.TypeCoercer;
 import org.apache.tapestry5.commons.util.ExceptionUtils;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
 import org.slf4j.Logger;
 
 import jakarta.persistence.EntityManager;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistedEntity.java
 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistedEntity.java
index 0e6817ab7..10deedc96 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistedEntity.java
+++ 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistedEntity.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@ import java.io.Serializable;
 import jakarta.persistence.EntityManager;
 
 import org.apache.tapestry5.http.annotations.ImmutableSessionPersistedObject;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
 
 /**
  * Encapsulates a JPA entity name with an entity id.
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextWorker.java
 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextWorker.java
index fbb05bca2..3e111a25f 100644
--- 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextWorker.java
+++ 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/internal/jpa/PersistenceContextWorker.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
 package org.apache.tapestry5.internal.jpa;
 
 import org.apache.tapestry5.internal.transform.ReadOnlyComponentFieldConduit;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
 import org.apache.tapestry5.model.MutableComponentModel;
 import org.apache.tapestry5.plastic.InstanceContext;
 import org.apache.tapestry5.plastic.PlasticClass;
diff --git 
a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java 
b/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java
index cdc0b225a..2e371ecc9 100644
--- a/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java
+++ b/tapestry-jpa/src/main/java/org/apache/tapestry5/jpa/modules/JpaModule.java
@@ -1,4 +1,4 @@
-// Copyright 2011-2014 The Apache Software Foundation
+// Copyright 2011-2014, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -31,20 +31,16 @@ import org.apache.tapestry5.commons.services.TypeCoercer;
 import org.apache.tapestry5.http.internal.TapestryHttpInternalConstants;
 import org.apache.tapestry5.internal.jpa.CommitAfterWorker;
 import 
org.apache.tapestry5.internal.jpa.EntityApplicationStatePersistenceStrategy;
-import org.apache.tapestry5.internal.jpa.EntityManagerManagerImpl;
-import org.apache.tapestry5.internal.jpa.EntityManagerObjectProvider;
-import org.apache.tapestry5.internal.jpa.EntityManagerSourceImpl;
 import org.apache.tapestry5.internal.jpa.EntityPersistentFieldStrategy;
-import org.apache.tapestry5.internal.jpa.EntityTransactionManagerImpl;
-import org.apache.tapestry5.internal.jpa.JpaTransactionAdvisorImpl;
 import org.apache.tapestry5.internal.jpa.JpaValueEncoder;
-import org.apache.tapestry5.internal.jpa.PackageNamePersistenceUnitConfigurer;
 import org.apache.tapestry5.internal.jpa.PersistenceContextWorker;
 import org.apache.tapestry5.internal.services.PersistentFieldManager;
 import org.apache.tapestry5.ioc.LoggerSource;
 import org.apache.tapestry5.ioc.ScopeConstants;
 import org.apache.tapestry5.ioc.ServiceBinder;
 import org.apache.tapestry5.ioc.annotations.Contribute;
+import org.apache.tapestry5.ioc.annotations.ImportModule;
+import org.apache.tapestry5.ioc.annotations.Local;
 import org.apache.tapestry5.ioc.annotations.Primary;
 import org.apache.tapestry5.ioc.annotations.Scope;
 import org.apache.tapestry5.ioc.annotations.Startup;
@@ -52,15 +48,17 @@ import org.apache.tapestry5.ioc.annotations.Symbol;
 import org.apache.tapestry5.ioc.services.FactoryDefaults;
 import org.apache.tapestry5.ioc.services.MasterObjectProvider;
 import org.apache.tapestry5.ioc.services.PerthreadManager;
+import org.apache.tapestry5.ioc.services.ServiceOverride;
 import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.jpa.EntityManagerManager;
-import org.apache.tapestry5.jpa.EntityManagerSource;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.jpa.JpaEntityPackageManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.JpaEntityPackageManager;
 import org.apache.tapestry5.jpa.JpaPersistenceConstants;
 import org.apache.tapestry5.jpa.JpaSymbols;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.modules.JpaCoreModule;
 import org.apache.tapestry5.services.ApplicationStateContribution;
 import org.apache.tapestry5.services.ApplicationStateManager;
 import org.apache.tapestry5.services.ApplicationStatePersistenceStrategy;
@@ -76,40 +74,9 @@ import org.slf4j.Logger;
  *
  * @since 5.3
  */
+@ImportModule(JpaCoreModule.class)
 public class JpaModule
 {
-    public static void bind(final ServiceBinder binder)
-    {
-        binder.bind(JpaTransactionAdvisor.class, 
JpaTransactionAdvisorImpl.class);
-        binder.bind(PersistenceUnitConfigurer.class, 
PackageNamePersistenceUnitConfigurer.class).withSimpleId();
-        binder.bind(EntityManagerSource.class, EntityManagerSourceImpl.class);
-        binder.bind(EntityTransactionManager.class, 
EntityTransactionManagerImpl.class);
-
-    }
-
-    public static JpaEntityPackageManager buildJpaEntityPackageManager(final 
Collection<String> packageNames)
-    {
-        return new JpaEntityPackageManager()
-        {
-            @Override
-            public Collection<String> getPackageNames()
-            {
-                return packageNames;
-            }
-        };
-    }
-
-    @Scope(ScopeConstants.PERTHREAD)
-    public static EntityManagerManager buildEntityManagerManager(final 
EntityManagerSource entityManagerSource,
-                                                                 final 
PerthreadManager perthreadManager, final Logger logger)
-    {
-        final EntityManagerManagerImpl service = new 
EntityManagerManagerImpl(entityManagerSource, logger);
-
-        perthreadManager.addThreadCleanupListener(service);
-
-        return service;
-    }
-
     @Contribute(JpaEntityPackageManager.class)
     public static void provideEntityPackages(Configuration<String> 
configuration,
 
@@ -141,21 +108,14 @@ public class JpaModule
         configuration.addInstance("JPACommitAfter", CommitAfterWorker.class, 
"after:Log");
     }
 
-    @Contribute(MasterObjectProvider.class)
-    public static void provideObjectProviders(final 
OrderedConfiguration<ObjectProvider> configuration)
-    {
-        configuration.addInstance("EntityManager", 
EntityManagerObjectProvider.class,
-                "before:AnnotationBasedContributions");
-    }
-
     @Contribute(SymbolProvider.class)
     @FactoryDefaults
     public static void provideFactoryDefaults(final 
MappedConfiguration<String, String> configuration)
     {
         configuration.add(JpaSymbols.PROVIDE_ENTITY_VALUE_ENCODERS, "true");
-        configuration.add(JpaSymbols.EARLY_START_UP, "true");
+        configuration.override(JpaSymbols.EARLY_START_UP, "true");
         
configuration.add(JpaSymbols.ENTITY_SESSION_STATE_PERSISTENCE_STRATEGY_ENABLED, 
"true");
-        configuration.add(JpaSymbols.PERSISTENCE_DESCRIPTOR, 
"/META-INF/persistence.xml");
+        configuration.override(JpaSymbols.PERSISTENCE_DESCRIPTOR, 
"/META-INF/persistence.xml");
     }
 
     @Contribute(ValueEncoderSource.class)
diff --git 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/CommitCounter.java 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/CommitCounter.java
index 8d8de2848..cce16de92 100644
--- 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/CommitCounter.java
+++ 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/CommitCounter.java
@@ -21,7 +21,7 @@ import jakarta.persistence.EntityManager;
 import jakarta.persistence.PostPersist;
 import jakarta.persistence.PostUpdate;
 
-import org.apache.tapestry5.jpa.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
 import org.apache.tapestry5.jpa.test.entities.VersionedThing;
 
 public class CommitCounter
diff --git 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTest.java 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTest.java
index 6c7493f0d..b87a070ea 100644
--- a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTest.java
+++ b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTest.java
@@ -36,7 +36,7 @@ import org.apache.tapestry5.internal.jpa.PersistedEntity;
 import org.apache.tapestry5.internal.test.PageTesterContext;
 import org.apache.tapestry5.ioc.Registry;
 import org.apache.tapestry5.ioc.RegistryBuilder;
-import org.apache.tapestry5.jpa.EntityManagerManager;
+import org.apache.tapestry5.jpa.core.EntityManagerManager;
 import org.apache.tapestry5.jpa.modules.JpaModule;
 import org.apache.tapestry5.jpa.test.entities.ThingOne;
 import org.apache.tapestry5.jpa.test.entities.ThingTwo;
diff --git 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTestModule.java 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTestModule.java
index 4beca5f6c..8aa355acb 100644
--- 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTestModule.java
+++ 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/JpaTestModule.java
@@ -17,18 +17,18 @@ import org.apache.tapestry5.commons.Configuration;
 import org.apache.tapestry5.commons.MappedConfiguration;
 import org.apache.tapestry5.commons.ObjectLocator;
 import org.apache.tapestry5.http.internal.TapestryHttpInternalConstants;
-import 
org.apache.tapestry5.internal.jpa.TapestryCDIBeanManagerForJPAEntityListeners;
+import 
org.apache.tapestry5.internal.jpa.core.TapestryCDIBeanManagerForJPAEntityListeners;
 import org.apache.tapestry5.ioc.MethodAdviceReceiver;
 import org.apache.tapestry5.ioc.ServiceBinder;
 import org.apache.tapestry5.ioc.annotations.Contribute;
 import org.apache.tapestry5.ioc.annotations.Match;
 import org.apache.tapestry5.ioc.services.ApplicationDefaults;
 import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.jpa.EntityManagerSource;
-import org.apache.tapestry5.jpa.JpaEntityPackageManager;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.JpaEntityPackageManager;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
 import org.apache.tapestry5.jpa.test.entities.ThingOne;
 import org.apache.tapestry5.jpa.test.entities.ThingTwo;
 import org.apache.tapestry5.jpa.test.entities.VersionedThing;
diff --git 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/NestedService.java 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/NestedService.java
index d427a86eb..284b0bd86 100644
--- 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/NestedService.java
+++ 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/NestedService.java
@@ -13,7 +13,7 @@
  */
 package org.apache.tapestry5.jpa.test;
 
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 
 public interface NestedService
 {
diff --git 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelService.java 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelService.java
index 849b84dae..1291ae7c3 100644
--- 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelService.java
+++ 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelService.java
@@ -13,7 +13,7 @@
  */
 package org.apache.tapestry5.jpa.test;
 
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 
 public interface TopLevelService
 {
diff --git 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelServiceImpl.java
 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelServiceImpl.java
index 04fa8d788..7d14d52e9 100644
--- 
a/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelServiceImpl.java
+++ 
b/tapestry-jpa/src/test/java/org/apache/tapestry5/jpa/test/TopLevelServiceImpl.java
@@ -16,8 +16,8 @@ package org.apache.tapestry5.jpa.test;
 import jakarta.persistence.EntityManager;
 
 import org.apache.tapestry5.ioc.Invokable;
-import org.apache.tapestry5.jpa.EntityTransactionManager;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.EntityTransactionManager;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.apache.tapestry5.jpa.test.entities.ThingOne;
 
 public class TopLevelServiceImpl implements TopLevelService
diff --git 
a/tapestry-jpa/src/test/java/org/example/app1/pages/CommitAfterDemo.java 
b/tapestry-jpa/src/test/java/org/example/app1/pages/CommitAfterDemo.java
index 9b333c564..3f08f82a3 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/pages/CommitAfterDemo.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/pages/CommitAfterDemo.java
@@ -18,7 +18,7 @@ import java.sql.SQLException;
 
 import jakarta.persistence.PersistenceContext;
 
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app1.AppConstants;
 import org.example.app1.entities.User;
 
diff --git 
a/tapestry-jpa/src/test/java/org/example/app1/pages/EncodeEntities.java 
b/tapestry-jpa/src/test/java/org/example/app1/pages/EncodeEntities.java
index 49d190a6c..06c0d7f79 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/pages/EncodeEntities.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/pages/EncodeEntities.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@ import jakarta.persistence.PersistenceContext;
 
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app1.AppConstants;
 import org.example.app1.entities.User;
 import org.example.app1.services.UserDAO;
diff --git a/tapestry-jpa/src/test/java/org/example/app1/pages/GridDemo.java 
b/tapestry-jpa/src/test/java/org/example/app1/pages/GridDemo.java
index d0746be24..1bf77ea96 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/pages/GridDemo.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/pages/GridDemo.java
@@ -23,7 +23,7 @@ import jakarta.persistence.criteria.Root;
 import org.apache.tapestry5.grid.GridDataSource;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.jpa.JpaGridDataSource;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app1.AppConstants;
 import org.example.app1.entities.User;
 import org.example.app1.services.UserDAO;
diff --git 
a/tapestry-jpa/src/test/java/org/example/app1/pages/PersistEntity.java 
b/tapestry-jpa/src/test/java/org/example/app1/pages/PersistEntity.java
index 6f34f29a1..1188e4ac4 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/pages/PersistEntity.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/pages/PersistEntity.java
@@ -22,7 +22,7 @@ import jakarta.persistence.PersistenceContext;
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app1.AppConstants;
 import org.example.app1.entities.User;
 
diff --git 
a/tapestry-jpa/src/test/java/org/example/app1/pages/PersistThang.java 
b/tapestry-jpa/src/test/java/org/example/app1/pages/PersistThang.java
index 9c4d20962..1e4cabf0b 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/pages/PersistThang.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/pages/PersistThang.java
@@ -17,7 +17,7 @@ package org.example.app1.pages;
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app1.AppConstants;
 import org.example.app1.entities.Thang;
 import org.example.app1.entities.User;
diff --git 
a/tapestry-jpa/src/test/java/org/example/app1/services/AppModule.java 
b/tapestry-jpa/src/test/java/org/example/app1/services/AppModule.java
index 14d7c11b6..552fb6006 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/services/AppModule.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/services/AppModule.java
@@ -21,10 +21,10 @@ import org.apache.tapestry5.ioc.annotations.ImportModule;
 import org.apache.tapestry5.ioc.annotations.Match;
 import org.apache.tapestry5.ioc.services.ApplicationDefaults;
 import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.jpa.EntityManagerSource;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
 import org.apache.tapestry5.jpa.modules.JpaModule;
 import org.example.app1.AppConstants;
 import org.example.app1.entities.Thang;
diff --git a/tapestry-jpa/src/test/java/org/example/app1/services/UserDAO.java 
b/tapestry-jpa/src/test/java/org/example/app1/services/UserDAO.java
index 5ac815bee..970a08d80 100644
--- a/tapestry-jpa/src/test/java/org/example/app1/services/UserDAO.java
+++ b/tapestry-jpa/src/test/java/org/example/app1/services/UserDAO.java
@@ -18,7 +18,7 @@ import java.util.List;
 
 import jakarta.persistence.PersistenceContext;
 
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app1.AppConstants;
 import org.example.app1.entities.User;
 
diff --git a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java 
b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java
index f81813cb8..a5c7069cd 100644
--- a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java
+++ b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@ import jakarta.persistence.PersistenceContext;
 
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app2.entities.Item;
 
 public class PersistItem
diff --git 
a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem2.java 
b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem2.java
index 786f9273d..ea4e2855e 100644
--- a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem2.java
+++ b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem2.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@ package org.example.app2.pages;
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app2.entities.Item;
 
 import jakarta.persistence.EntityManager;
diff --git 
a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem3.java 
b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem3.java
index f8d9820b5..ffbf5c182 100644
--- a/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem3.java
+++ b/tapestry-jpa/src/test/java/org/example/app2/pages/PersistItem3.java
@@ -17,7 +17,7 @@ package org.example.app2.pages;
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app2.entities.Item;
 import org.example.app2.services.UserDAO;
 
diff --git 
a/tapestry-jpa/src/test/java/org/example/app3/pages/PersistThing.java 
b/tapestry-jpa/src/test/java/org/example/app3/pages/PersistThing.java
index 172f7d97a..bb53bbe1f 100644
--- a/tapestry-jpa/src/test/java/org/example/app3/pages/PersistThing.java
+++ b/tapestry-jpa/src/test/java/org/example/app3/pages/PersistThing.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@ import jakarta.persistence.PersistenceContext;
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app3.model.Thing;
 
 public class PersistThing
diff --git 
a/tapestry-jpa/src/test/java/org/example/app3/services/AppModule.java 
b/tapestry-jpa/src/test/java/org/example/app3/services/AppModule.java
index fa2cd1461..c889b666d 100644
--- a/tapestry-jpa/src/test/java/org/example/app3/services/AppModule.java
+++ b/tapestry-jpa/src/test/java/org/example/app3/services/AppModule.java
@@ -17,10 +17,10 @@ import org.apache.tapestry5.ioc.annotations.Contribute;
 import org.apache.tapestry5.ioc.annotations.ImportModule;
 import org.apache.tapestry5.ioc.services.ApplicationDefaults;
 import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.jpa.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
 import org.apache.tapestry5.jpa.JpaSymbols;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
 import org.apache.tapestry5.jpa.modules.JpaModule;
 
 @ImportModule(JpaModule.class)
diff --git a/tapestry-jpa/src/test/java/org/example/app4/pages/PersistAll.java 
b/tapestry-jpa/src/test/java/org/example/app4/pages/PersistAll.java
index d7a808076..07b0fbf2e 100644
--- a/tapestry-jpa/src/test/java/org/example/app4/pages/PersistAll.java
+++ b/tapestry-jpa/src/test/java/org/example/app4/pages/PersistAll.java
@@ -1,4 +1,4 @@
-// Copyright 2011 The Apache Software Foundation
+// Copyright 2011, 2026 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@ package org.example.app4.pages;
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app1.entities.Thang;
 import org.example.app1.entities.User;
 import org.example.app2.entities.Item;
diff --git 
a/tapestry-jpa/src/test/java/org/example/app6/pages/CommitAfterDemo.java 
b/tapestry-jpa/src/test/java/org/example/app6/pages/CommitAfterDemo.java
index c6445f44b..b59bed456 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/CommitAfterDemo.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/CommitAfterDemo.java
@@ -18,7 +18,7 @@ import java.sql.SQLException;
 
 import jakarta.persistence.PersistenceContext;
 
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app6.AppConstants;
 import org.example.app6.entities.User;
 
diff --git 
a/tapestry-jpa/src/test/java/org/example/app6/pages/EncodeEntities.java 
b/tapestry-jpa/src/test/java/org/example/app6/pages/EncodeEntities.java
index 8d172ab10..10541ecb9 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/EncodeEntities.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/EncodeEntities.java
@@ -21,7 +21,7 @@ import jakarta.persistence.PersistenceContext;
 
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app6.AppConstants;
 import org.example.app6.entities.User;
 import org.example.app6.services.UserDAO;
diff --git a/tapestry-jpa/src/test/java/org/example/app6/pages/GridDemo.java 
b/tapestry-jpa/src/test/java/org/example/app6/pages/GridDemo.java
index 88b2e6fd7..9d13a4e33 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/GridDemo.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/GridDemo.java
@@ -23,7 +23,7 @@ import jakarta.persistence.criteria.Root;
 import org.apache.tapestry5.grid.GridDataSource;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.jpa.JpaGridDataSource;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app6.AppConstants;
 import org.example.app6.entities.User;
 import org.example.app6.services.UserDAO;
diff --git 
a/tapestry-jpa/src/test/java/org/example/app6/pages/PersistEntity.java 
b/tapestry-jpa/src/test/java/org/example/app6/pages/PersistEntity.java
index 26a922506..da7068de6 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/PersistEntity.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/PersistEntity.java
@@ -22,7 +22,7 @@ import jakarta.persistence.PersistenceContext;
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app6.AppConstants;
 import org.example.app6.entities.User;
 
diff --git 
a/tapestry-jpa/src/test/java/org/example/app6/pages/PersistThang.java 
b/tapestry-jpa/src/test/java/org/example/app6/pages/PersistThang.java
index b542f2419..866d7be1b 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/pages/PersistThang.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/pages/PersistThang.java
@@ -24,7 +24,7 @@ import jakarta.persistence.PersistenceContext;
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
 import org.apache.tapestry5.jpa.JpaPersistenceConstants;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app6.entities.Thang;
 
 public class PersistThang
diff --git 
a/tapestry-jpa/src/test/java/org/example/app6/services/AppModule.java 
b/tapestry-jpa/src/test/java/org/example/app6/services/AppModule.java
index 9304acc5c..2895f3b96 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/services/AppModule.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/services/AppModule.java
@@ -21,10 +21,10 @@ import org.apache.tapestry5.ioc.annotations.ImportModule;
 import org.apache.tapestry5.ioc.annotations.Match;
 import org.apache.tapestry5.ioc.services.ApplicationDefaults;
 import org.apache.tapestry5.ioc.services.SymbolProvider;
-import org.apache.tapestry5.jpa.EntityManagerSource;
-import org.apache.tapestry5.jpa.JpaTransactionAdvisor;
-import org.apache.tapestry5.jpa.PersistenceUnitConfigurer;
-import org.apache.tapestry5.jpa.TapestryPersistenceUnitInfo;
+import org.apache.tapestry5.jpa.core.EntityManagerSource;
+import org.apache.tapestry5.jpa.core.JpaTransactionAdvisor;
+import org.apache.tapestry5.jpa.core.PersistenceUnitConfigurer;
+import org.apache.tapestry5.jpa.core.TapestryPersistenceUnitInfo;
 import org.apache.tapestry5.jpa.modules.JpaModule;
 import org.example.app6.AppConstants;
 import org.example.app6.entities.Thang;
diff --git a/tapestry-jpa/src/test/java/org/example/app6/services/UserDAO.java 
b/tapestry-jpa/src/test/java/org/example/app6/services/UserDAO.java
index 0e6fb274c..30eb91af4 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/services/UserDAO.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/services/UserDAO.java
@@ -18,7 +18,7 @@ import java.util.List;
 
 import jakarta.persistence.PersistenceContext;
 
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app6.AppConstants;
 import org.example.app6.entities.User;
 
diff --git 
a/tapestry-jpa/src/test/java/org/example/app6/services/impl/UserDAOImpl.java 
b/tapestry-jpa/src/test/java/org/example/app6/services/impl/UserDAOImpl.java
index a29985f30..29fc711e3 100644
--- a/tapestry-jpa/src/test/java/org/example/app6/services/impl/UserDAOImpl.java
+++ b/tapestry-jpa/src/test/java/org/example/app6/services/impl/UserDAOImpl.java
@@ -20,7 +20,7 @@ import jakarta.persistence.EntityManager;
 import jakarta.persistence.PersistenceContext;
 
 import org.apache.tapestry5.ioc.annotations.Inject;
-import org.apache.tapestry5.jpa.annotations.CommitAfter;
+import org.apache.tapestry5.jpa.core.annotations.CommitAfter;
 import org.example.app6.AppConstants;
 import org.example.app6.entities.User;
 import org.example.app6.services.UserDAO;

Reply via email to